這裏的雙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