目的:
解決 mysql數據庫Master-Slave 單點故障問題。
實現方式:
1. Master-Master Replication 實現數據同步。
2.通過keepalived虛擬IP 從網絡層實現單點故障時IP自動切換,從而實現高可用。
3.通過keepalived配置實現read讀指向Slave節點,實現讀寫分離。
缺點:根據線上實際應用情況,只考慮單點網絡故障及機器設備故障時虛擬ip自動切換(只切換一次)。不考慮mysql服務異常等情況,數據庫異常可通過nagios等監控,防止多次來回切換,造成數據混亂!且故障節點恢復時,要人工操作及注意步驟。
Master-Master
1、使用兩個MySQL數據庫db01,db02,互爲Master和Slave,即:
一邊db01作爲db02的master,一旦有數據寫向db01時,db02定時從db01更新
另一邊db02也作爲db01的master,一旦有數據寫向db02時,db01也定時從db02獲得更新
(這不會導致循環,MySQL Slave默認不會記錄Master同步過來的變化)
2、但從AppServer的角度來說,同時只有一個結點db01扮演Master,另外一個結點db02扮演Slave,不能同時兩個結點扮演Master。即AppSever總是把write操作分配某個數據庫(db01),除非db01 failed,被切換。
3、如果扮演Slave的數據庫結點db02 Failed了:
a)此時appServer要能夠把所有的read,write分配給db01,read操作不再指向db02
b)一旦db02恢復過來後,繼續充當Slave角色,並告訴AppServer可以將read分配給它了.
4、如果扮演Master的數據庫結點db01 Failed了
a)此時appServer要能夠把所有的寫操作從db01切換分配給db02,也就是切換Master由db02充當
b)db01恢復過來後,充當Slave的角色,Master由db02繼續扮演。
具體配置如下:
測試環境簡介:
1.10.10.10.40 mysql+keepalive
2.10.10.10.41 mysql+keepalive
3.寫入VIP:10.10.10.21(40主,41從)
4.讀取VIP:10.10.10.44(41主,40從)
1.mysql雙主配置,此處簡略,可參考網上主主同步配置。
Mysql配置文件重點簡略如下:
log-bin=mysql-bin
binlog_format=mixed
server-id= 3(另一臺的ID爲2)
2.keepalived 配置方法
第一臺(40):
global_defs {
notification_email {
******@126.com
}
notification_email_from*****@126.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-ha
}
vrrp_instance VI_1 {
state BACKUP #兩臺配置此處均是BACKUP
interface p4p1 #注意網卡接口
virtual_router_id 51
priority 180 #優先級,另一臺改爲90
advert_int 1
nopreempt #不主動搶佔資源,只在優先級高的機器上設置即可,優先級低的機器不設置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.21 #此虛擬ip爲寫
}
}
vrrp_instance VI_2 {
state BACKUP #另一臺配置爲MASTER
interface p4p1 #注意網卡接口
virtual_router_id 44 #注意id和上面的不同
priority 90 #優先級,另一臺改爲180
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.44 #此虛擬ip爲讀
}
}
第二臺(41)
global_defs {
notification_email {
*********@126.com
}
notification_email_from ********@126.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-ha
}
vrrp_instance VI_1 {
state BACKUP #兩臺配置此處均是BACKUP
interface p4p1 #注意網卡接口
virtual_router_id 51
priority 90 #優先級,另一臺改爲180
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.21
}
}
vrrp_instance VI_2 {
state MASTER #用於mysql讀
interface p4p1 #注意網卡接口
virtual_router_id 44
priority 180 #優先級,另一臺改爲90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.10.10.44 #用於mysql讀
}
}