这里的双master并不是2个都同时对应用开放写,只是同一个时刻只有1个mysql对外开放写,另一个作为slave接受从master同步过来的数据,当master挂掉后,通过keepalived的VIP转移,使slave变成master,从而形成高可用的环境
keepalived的master配置如下
vrrp_script mycheck {
script "/usr/local/keepalived/shutdown.sh"
interval 2 # check every 2 seconds
weight 2 # default prio: +2 if connect ok
}
global_defs {
router_id NodeA
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 151
priority 201
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass pass
}
virtual_ipaddress {
192.168.0.100
}
track_script {
mycheck
}
}
slave配置如下:
vrrp_script mycheck {
script "/usr/local/keepalived/shutdown.sh"
interval 2 # check every 2 seconds
weight 2 # default prio: +2 if connect ok
}
global_defs {
router_id NodeB
}
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 151
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass pass
}
virtual_ipaddress {
192.168.0.100
}
track_script {
mycheck
}
}
1.配置成nopreempt表示非抢占,即master由挂掉的状态恢复后,并不抢占VIP,slave端继续提供服务
2.由于nopreempt只有BACKUP中支持,所以上面master和slave都配置成了BACKUP
3.VIP转移只有在keepalived挂掉的情况下才会出现(不一定,等会说明),也就是说机器宕机是可以的,但是mysql本身挂掉了并不能导致keepalived挂掉,所以要检测mysql是否挂掉
4.通过检测mysql占用端口,比如3306并不难严谨,检测mysql进程是否存在也不是很严谨,最好的办法应该是执行mysql的命令如下:
mysql -uroot -proot -h 192.168.0.47 --connect_timeout=5 -e "select 1;"
5.有时候即使keepalived进程不在了,但是VIP还存在,通过ipconfig可能看不到VIP,可以通过
ip -o -f inet addr show
就可以看到VIP还是存在的
所以为了保险起见最好加上:
ip addr del 192.168.0.100 dev eth1
即
删除VIP
6.数据同步那块可以依赖mysql自己,也可以使用ali的otter来进行同步
见
http://my.oschina.net/dxqr/blog/524795
https://github.com/alibaba/otter
来源:oschina
链接:https://my.oschina.net/u/115076/blog/530928