这里的双master并非2个都同时对应用开放写,只是同一个时刻只有1个mysql对外开放写,另外一个做为slave接受从master同步过来的数据,当master挂掉后,经过keepalived的VIP转移,使slave变成master,从而造成高可用的环境 mysql
keepalived的master配置以下 git
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配置以下: github
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端继续提供服务 sql
2.因为nopreempt只有BACKUP中支持,因此上面master和slave都配置成了BACKUP shell
3.VIP转移只有在keepalived挂掉的状况下才会出现(不必定,等会说明),也就是说机器宕机是能够的,可是mysql自己挂掉了并不能致使keepalived挂掉,因此要检测mysql是否挂掉 spa
4.经过检测mysql占用端口,好比3306并不难严谨,检测mysql进程是否存在也不是很严谨,最好的办法应该是执行mysql的命令以下: .net
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仍是存在的
因此为了保险起见最好加上: code
ip addr del 192.168.0.100 dev eth1即 删除VIP
6.数据同步那块能够依赖mysql本身,也可使用ali的otter来进行同步 router
见 blog