在生产环境中,一台mysql服务器存在单点故障,所以我们要确保mysql的高可用性,也就是说两台mysql服务器如果其中有一台挂了,那么另外一台就会接替其进行工作。
Mysql的高可用方案一般有以下几种:
keepalived+双主,MHA,PXC,MMM.Heartbeat+DRBD等,比较常用的还是keepalived+双主MHA和PXC。
本章主要利用了keepalived实现Mysql数据库的高可用。
keepalived+mysql双主来实现mysql-HA,我们必须要保证两台mysql数据库的数据是完全一样的,基本思路是两台mysql互为主从关系,也就是我们常说的双主,然后通过keepalived配置虚拟IP地址,实现当其中一台mysql数据库挂掉后,应用能够自动的切换到另外一台mysql数据库,保证系统的高可用性。
测试环境:
OS:Centos7.3x86_64
Mysql版本:Mysql5.7.18
keepalived:keepalived-1.2.13
Master:192.168.137.100
Slave:192.168.137.110
在测试环境中,关闭selinux以及firewalld防火墙
简单的说主主同步就是两台mysql服务器互为主从关系,在任何一台机器上写入都会同步,具体的原理这里不做要多解释。
一、配置Master服务器:
1、首先需要在master主上面开启bin-log日志,打开mysql主配置文件添加以下几行
vim /etc/my.cnf log-bin=mysql-bin //打开日志 server-id=10 //这个id号是唯一的,master和slave不能一样
开启之后重启mysql服务即可。
systemctl restart mysqld
2、将master设为slave的主服务器
在master主机上创建授权账户,允许slave(192.168.137.110)主机上连接
mysql> grant replication slave on *.* to 'rep'@'192.168.137.110' identified by 'pwd123'; Query OK, 0 rows affected, 1 warning (0.61 sec)
查看master的当前binlog状态信息
请记住以上的File 和pos号,以下会用的到
二、配置从服务器
1、在slave主机上将master设为自己的主服务器并开启bin-log日志。配置如下:
vim /etc/my.cnf
log-bin=mysql-bin //开启日志
server-id=30 //此id不能和master相同
开启之后重启mysql服务即可。
mysql> change master to -> master_host='192.168.137.100', -> master_user='rep', -> master_password='pwd123', -> master_log_file='mysql-bin.000002', -> master_log_pos=450; Query OK, 0 rows affected, 2 warnings (0.08 sec)
2、查看从服务器状态,以下两个值必须为yes,代表从服务器能够正常的连接主服务器。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3、将slave设为master的主服务器。
在slave主机上创建授权账户,允许master(192.168.137.100)主机上连接
mysql> grant replication slave on *.* to 'rep'@'192.168.137.100' identified by 'pwd123'; Query OK, 0 rows affected, 1 warning (0.30 sec)
查看slave的当前binlog状态信息
记住以上的File和Pos值 以下会用得到
在master服务器上将slave设为自己的主服务器并且开启slave功能
mysql> change master to -> master_host='192.168.137.110', -> master_user='rep', -> master_password='pwd123', -> master_log_file='mysql-bin.000001', -> master_log_pos=450; Query OK, 0 rows affected, 2 warnings (0.14 sec) mysql> start slave; Query OK, 0 rows affected (0.08 sec)
查看主服务器的状态以下两个值必须为yes,代表主服务器能够正常的连接从服务器。Slave_IO_Running: Yes
Slave_SQL_Running: Yes
三、测试主主同步。
1、在master主机上创建一个库为test,并且在test库中创建一张表为tb1
在从服务器验证是否有主创建的库和表
在从服务器中向tb1表中插入数据,在主服务上查看是否同步
此时mysql主主同步,正式完成!!!
四、keepalived的安装配置
1、在master和slave主机上安装keepalived
在编译安装keepalived之前先安装openssl、popt-devel等支持库
[root@master ~]# yum install -y openssl-devel popt-devel
2、编译安装keepalived
将安装目录指定为根目录,配置完成后执行make && make install 如下:
[root@master ~]# tar zxf keepalived-1.2.13.tar.gz [root@master ~]# cd keepalived-1.2.13/ [root@master keepalived-1.2.13]# ./configure --prefix= / && make && make install
添加keepalived为系统服务
[root@master keepalived-1.2.13]# chkconfig --add keepalived [root@master keepalived-1.2.13]# chkconfig keepalived on
此时master主机的keepalived正式安装完成,在slave主机上安装keepalived和master的安装步骤是一样的,这里不在做演示。
3、配置keepalived主配置文件,如下:
! Configuration File for keepalived global_defs { router_id Master //表示运行keepalived服务器的一个标识 } vrrp_instance VI_1 { state MASTER //指定keepalived的角色 interface eno16777728 //指定HA检测的网络接口 virtual_router_id 51 //虚拟路由标识 priority 100 //用来选举master的,也就是优先级 advert_int 1 //发vrrp包的时间间隔,多久进行一次master选举(可以认为是健康查检时间间隔) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { //VIP区域,指定VIP地址 192.168.137.150/24 } } virtual_server 192.168.137.150 3306 { //设置虚拟服务器,需要指定虚拟地址和服务端口号 delay_loop 6 //设置运行情况检查时间,单位是秒 lb_algo rr //设置后端调度算法,这里设置为rr,轮询算法 lb_kind DR //设置lvs实现负载均衡的机制,有net,yun,dr三个模式可选 persistence_timeout 50 //会话保持的时间,单位是秒。 protocol TCP //指定转发协议的类型,有tcp/udp两种 real_server 192.168.137.100 3306 { //配置服务节点,需要指定real server的真实IP地址 weight 1 notify_down /etc/keepalived/bin/mysql.sh TCP_CHECK { connect_timeout 3 //连接超时时间 nb_get_retry 3 //重连次数 delay_before_retry 3 //重连间隔时间 connect_port 3306 //健康检查端口 } } }
配置完成后启动keepalived服务
/etc/init.d/keepalived start
配置从服务器的keepalived主配置文件
其实从服务器的keepalived主配置和主的差不多都一样 我这边直接复制一份主keepalived主配置文件到从服务器上然后在做修改,内容如下:
! Configuration File for keepalived global_defs { router_id Slave } vrrp_instance VI_1 { state Slave interface eno16777728 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.137.150/24 } } virtual_server 192.168.137.150 3306 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.137.110 3306 { weight 1 notify_down /etc/keepalived/bin/mysql.sh TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
随后启动从服务器的keepalived
[root@slave ~]# /etc/init.d/keepalived start Starting keepalived (via systemctl): [ OK ]
master和slave上都添加了检测脚本,作用是当mysql停止工作时自动关闭本机的keepalived,从而实现将故障机器剔除。
mkdir /etc/keepalived/bin/mysql.sh
cat mysql.sh #!/bin/bash pkill keepalived /sbin/ifdown eno16777728 && /sbin/ifup eno16777728 chmod +x bin/mysql.sh
4、测试
在master和slave主机上分别执行ip addr show命令查看master和slave对vip地址的控制权
master的查看结果如下:
slave查看结果如下:
从以上图中可以看出master是主服务器slave是备用服务器
mysql远程登录测试:
我们需要找一台已经安装好mysql的客户端,然后登录VIP,看是否能登陆,在登录之两台mysql服务器都需要授权允许从远程登录
如下:
mysql> grant all on *.* to root@'%' identified by 'pwd123'; Query OK, 0 rows affected, 1 warning (0.17 sec)
授权完后客户端测试
以上图中显示的server-id是主服务器的id那么我们把主服务器干掉。再来查看server-id如果变成从服务器的server-id那么已经配置成功!如下:
主服务器挂掉后再看从服务器ip
验证客户端
以上说明主服务器挂掉以后从服务器会接管主服务器的工作,不会影响效率,此时整个测试完成。