这里的双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