Mysql5.6.29双主复制+Keepalived实现高可用服务
1.准备工作
1、节点主机系统:Linux操作系统,Centos6.5(64位)
2、高可用集群软件:Keepalived
3、Service:mysql
4、Mysql版本:5.6.29
Keepalived版本:1.2.13
(2)主机/IP划分
1、两台节点主机node1,node2:
Node1: IP:192.168.1.128 host name:node1;
Node2: IP:192.168.1.129 host name:node2;
VIP: 192.168.1.140
MYSQL服务器A,对于Keepalived来说则是MASTER机,首先托管着虚拟IP。
MYSQL服务器B,对于Keepalived来说则是BACKUP机,当MASTER机出故障时,将接管VIP,接替MASTER机继续为外部提供服务,直到MASTER机恢复。
2.MYSQL双主复制配置
如果有正在写数据,先通过“flush tables with read lock;”命令让表只读,手工备份完后,再“unlock
tables;”。
2.1配置账号和权限
在主机(MASTER)和备机BUCKUP)上,分别创建Mysql数据库账号“rep1”,密码为“123”。
创建语句如下:
create user 'rep1'@'%' identified by '123';
通过如下SQL语句,授予账号“rep1”可用于复制的权限
grant replication slave on *.* to 'rep1'@'%' identified by '123';
“rep1” 是账号,“%”(可以指定具体IP)表示任意主机均可通过账号“rep1”复制数据,密码为“123”。执行“GRANT”语句后,再执行“flush privileges;”使授权生效。
2.2配置MASTER
分别对两台主机的Mysql配置文件进行修改,Msql配置文件一般为“my.cnf”(通过“./mysql
--help | grep my.cnf”命令找到首选配置文件,这里是“/usr/local/mysql/my.cnf”),对my.cnf文件加入(或放开)下面的语句,即可开启复制功能(通过二进制日志复制)。两台主机开启binlog后,均变成MASTER机(即双主,但如果只一台开启binlog,则为主从),彼此都会向对方推送二进制日志。
具体内容如下:
server_id = 1#另一台此处设置为2(两台必须不同)
log-bin = binlog #开启binlog功能
log-bin-index = binlog.index
2.3配置SLAVE
双主复制下,两台主机彼此均向对方推送日志,同时也从对方哪里接受日志。当它推送日志时,它就
是MASTER机,当它接受数据时,它则变成SLAVE机。
(1)配置主机A的SLAVE功能
当主机A变成SLAVE机时,它将从主机B(MASTER)那里复制日志。
u获取MASTER(主机B)的二进制日志文件名称和起始复制位置
在主机B的Mysql中,执行“show master status;”命令,查看二进制日志文件名称和起始复制位置。
u配置主机A的MASTER信息
SQL语句如下:
change master tomaster_host='192.168.1.129',master_port=3306, master_user='rep1', master_password='123', master_log_file='binlog.000004', master_log_pos=557;
语句说明:
master_host:MASTER Mysql的IP
master_port:MASTER Mysql的端口
master_user:MASTER Mysql用于复制的账号
master_password:MASTER Mysql用于复制的账号对应的密码
master_log_file:MASTER Mysql二进制文件名称
master_log_pos:MASTER Mysql二进制文件开始复制的起始位置
u启动主机A的SLAVE功能
start slave;
开启后,主机A作为SLAVE接受MASTER(主机B)推送过来的二进制日志)
u查看复制状态
show slave status \G;
show processlist \G;
(2)配置主机B的SLAVE功能
当主机B变成SLAVE机时,它将从主机A(MASTER)那里复制日志。
u获取MASTER(主机A)的二进制日志文件名称和复制的起始位置
在主机A的Mysql中,执行“show master status;”命令,查看二进制日志文件名称和复制的起始位置。
u配置主机B的MASTER信息
change master tomaster_host='192.168.1.128',master_port=3306, master_user='rep1', master_password='123', master_log_file='binlog.000001', master_log_pos=120;
u启动主机B的SLAVE功能
start slave;
开启后,主机B作为SLAVE接受主机A(MASTER)推送过来的二进制日志
u查看复制状态(“\G”表示每列一行输出)
show slave status \G;
show processlist \G;
3.双主复制测试
(1)在主机A(192.168.1.128)的test库中创建表“repl_test”
在主机B的test库中查询 “repl_test” 表
从结果中可以看到,在主机A创建的表“repl_test”结构已经成功复制到主机B的MYSQL库中。
(2)在主机B(192.168.1.129)中,对test库repl_test表插入数据。见下图。
回到主机A(192.168.1.128),查看test数据库repl_test表,可以看在主机B(192.168.1.129)中插入的数据“from192.168.1.129”成功复制到主机A(192.168.1.128)MYSQL数据库中了。见下图。
4.高可用配置
高可用配置,主要是配置Keepalived,利用Keepalived设置虚拟IP,并在MASTER机与BACKUP机之间
进行心跳检测,当MASTER机出故障时,BACKUP机立即无缝地接管虚拟IP,接替MASTER机职责继续为外部提供服务,直到MASTER机恢复。
4.1Keepalived配置
首先在两台主机上分别安装Keepalived,然后分别修改keepalived.conf文件,内容如下:
! Configuration File for keepalived
#全局配置
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server xxx.com
smtp_connect_timeout 30
router_id 1688
}
#VRRP监控脚本定义
vrrp_script MONITOR_MYSQL {
script "/usr/local/mysql/monitor/monitor.sh"#脚本路径
interval 2#监控脚本执行频率(秒)
weight 2
}
#VRRP实例
vrrp_instance KEEPALIVED_MYSQL_1 {
state MASTER
interface eth0
virtual_router_id 51#此处,MASTER与BACKUP一致
priority 100#BACKUP配置的值比MASTER小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#VRRP监控脚本使用
track_script {
MONITOR_MYSQL
}
#虚拟IP配置
virtual_ipaddress {
192.168.119.140
}
}
4.2编写Mysql服务器进程检测脚本
Keepalived心跳检测主要检测主机是否可以访问,如果检测到托管VIP的主机不可以访问(keepalived
进程没有在运行),它会立即将VIP转移到有效的BACKUP机上。但对于我们业务来说(MYSQL数据库读写),除了主机固然必须处在运行状态外,MYSQL数据库本身也必须正常运行,否则数据库无法读写,服务将不可用。所有我们就要编写一个脚本(命名为monitor.sh,配置到keepalived.conf中,keepalived会根据设定的频率进行调用),用于检测MYSQL数据库是否正常运行,如果检测到MYSQL数据库挂掉了,说明本机MYSQL服务器不可用,必须进行故障切换。
脚本内容如下:
#!/bin/bash
#查看是否有MYSQL进程在运行(进程个数)
mysql_process_count=`netstat -nlt | grep 3306 | wc -l`
#查看是否有keepalived进程在运行
keepalived_process_count=`ps -C keepalived --no-header | wc -l`
#如果检测到没有MYSQL进程在运行(说明数据库挂掉了)
if [ $mysql_process_count -eq 0 ] && [ $keepalived_process_count -gt 0 ]
then
#杀掉keepalived进程,让BACKUP机检测不到MASTER上的keepalived,从而BACKUP接管VIP
killall keepalived
fi
chmod 755 /usr/local/mysql/monitor/monitor.sh
5.高可用测试
(1)开启两台主机上的keepalived
启动MASTER机(192.168.1.128)上的keepalived,如图,VIP(192.168.119.140)设置成功。
启动BACKUP机(192.168.1.129)上的keepalived
(2)关闭MASTER机(192.168.1.128)上的MYSQL,如图,MASTER机上托管的VIP消失。
这时观察BACKUP机(192.168.1.129),从下图可以看到,BACKUP机成功接管了VIP(192.168.119.140)。
(3)恢复MASTER机上的MYSQL数据库,如下图,可以看到VIP(192.168.119.140)又回来了。
再看看BACKUP机,VIP没有了,因为MASTER机上的MYSQL恢复正常,MASTER机重新接管了VIP。
(4)通过VIP访问数据库
如下图,通过VIP(192.168.119.140),成功访问数据库。