MySQL-HA目前有很多实现方案,今天就用MySQL双master+keepalived来实现MySQL-HA。
在MySQL-HA环境中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性。
然后用keepalived实现虚拟IP,通过keepalived来实现MySQL故障时自动切换。
实验环境如下:
Ubuntu12.04 MySQL5.5 keepalived-1.2.2
mysql-server1:192.168.1.102
mysql-server2:192.168.1.103
mysql-vip: 192.168.1.106
二、配置MySQL双主结构
1.在两台服务器上同时建立复制账号
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
-> TO shop@'192.168.1.%' IDENTIFIED BY '123qwe';
2.修改配置文件
192.168.1.102 MySQL配置文件如下:
server-id = 102
log_bin = /var/log/mysql/mysql-bin
relay_log = /var/log/mysql/mysql-relay-bin
log_slave_updates = 1
192.168.1.103 MySQL配置文件如下:
server-id = 103
log_bin = /var/log/mysql/mysql-bin
relay_log = /var/log/mysql/mysql-relay-bin
log_slave_updates = 1
3.在两台机器上分别启动复制
192.163.1.102配置如下:
192.163.1.103配置如下:
现在任何一个MySQL发生数据变化,另外一台数据库也会跟着进行数据更新。
三、配置keepalived
1.两台服务器都安装keepalived
sudo apt-get install keepalived
2.配置/etc/keepalived/keepalived.conf
192.168.1.102配置如下:/etc/keepalived/keepalived.conf
#全局配置
global_defs {
#表示keepalived在发生诸如切换操作时发送Email给哪些地址,邮件地址可以多个,每行一个
notification_email {
admin@example.com
}
#表示发送通知邮件时邮件源地址是谁
notification_email_from admin@example.com
#表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
smtp_server 127.0.0.1
#连接smtp连接超时时间
smtp_connect_timeout 30
#机器标识
router_id MySQL-HA
}
vrrp_instance mysql-ha {
state BACKUP #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
interface eth0 #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
virtual_router_id 81 #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority 100 #设置本节点的优先级,优先级高的为master
advert_int 1 #检查间隔,默认为1秒
authentication { #这里设置认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #这里设置的就是VIP,也就是虚拟IP地址
192.168.1.106
}
}
virtual_server 192.168.1.106 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr
lb_kind DR
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.1.102 3306 {
weight 3
notify_down /data/mysql.sh #检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
192.168.1.103配置如下: /etc/keepalived/keepalived.conf
这台配置和上面基本一样,但有两个地方不同:优先级为90、real_server为本机IP
#全局配置
global_defs {
#表示keepalived在发生诸如切换操作时发送Email给哪些地址,邮件地址可以多个,每行一个
notification_email {
admin@example.com
}
#表示发送通知邮件时邮件源地址是谁
notification_email_from admin@example.com
#表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
smtp_server 127.0.0.1
#连接smtp连接超时时间
smtp_connect_timeout 30
#机器标识
router_id MySQL-HA
}
vrrp_instance mysql-ha {
state BACKUP #state指定instance的初始状态,但这里指定的不算,还是得通过优先级竞选来确定。两台配置此处均是BACKUP。
interface eth0 #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
virtual_router_id 81 #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority 90 #设置本节点的优先级,优先级高的为master
advert_int 1 #检查间隔,默认为1秒
authentication { #这里设置认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #这里设置的就是VIP,也就是虚拟IP地址
192.168.1.106
}
}
virtual_server 192.168.1.106 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr
lb_kind DR
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.1.103 3306 {
weight 3
notify_down /data/mysql.sh #检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
3.分别在两台服务器的/data/目录下编写检测服务down后所要执行的脚本mysql.sh
#!/usr/bin/env bash
pkill keepalived
/etc/init.d/networking restart
$sudo chmod 777 mysql.sh
此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项
来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;
通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。
另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的
keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP。
4.分别在两台服务器上建立测试账号
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
5.在两台服务器上分别启动keepalived
sudo keepalived -D 或者 sudo keepalived start
6.进行测试
客户端192.168.1.100用vip(192.168.1.106)连接MySQL
1.两台服务都正常工作的情况下,在两台服务器上分别用netstat -nat查看,
可以看出目前连接的是192.168.1.102,因为它的优先级高。此时102是活跃 的服务器,103是备用的服务器。
2.当102的mysql服务down掉的时候,keepalived可以完成故障切换,
这时候所有的新的mysql连接就会连接192.168.1.103。
同理,当103的MySQL服务down掉之后,所有的新的MySQL连接就会连接192.168.1.102。
3.当102修复之后,由于权重比较高,102还将会成为活跃的服务器,103将作为备用服务器。
当然可以在102(优先级较高的服务器)上设置nopreempt参数,将此服务器设置为不抢占,
这样就保证了在102服务修复之后,103继续担任活跃服务器的角色。