最近想對Atlas進(jìn)行一次的大的改造, 其中涉及了一點主從復(fù)制的東西,之前Atlas通過定時建立連接方式來檢測主從db的存活,如果不能建立成功赂蕴,則會摘除該節(jié)點。這種方式比較簡單舶胀。其實可以考慮用更精細(xì)的控制概说, 心跳機制通過過檢測show slave status中seconds_Behind_Master、 Slave_IO_Running嚣伐、Slave_SQL_Runing三個字段來確定當(dāng)前主從同步的狀態(tài)以及Seconds_Behind_Master主從復(fù)制延遲糖赔, 當(dāng)Seconds_Behind_Master大于所設(shè)置的閾值時,就把該節(jié)點摘除點(其實這一塊和Atlas本身關(guān)系不大轩端,但是可以把其移入到Atlas中)
Mysql復(fù)制是通過將mysql的某一臺主機的數(shù)據(jù)復(fù)制到其他主機(簡稱slaves)上放典,并且在slaves上重新執(zhí)行一遍來實現(xiàn)。主服務(wù)器每次數(shù)據(jù)操作都會將更新記錄到二進(jìn)制日志文件,并維護(hù)文件的一個索引跟蹤日志循環(huán)奋构,slaves服務(wù)器通過獲取主服務(wù)器的二進(jìn)制日志來更新同步數(shù)據(jù)壳影。當(dāng)一個從服務(wù)器連接主服務(wù)器時,它通知主服務(wù)器從服務(wù)器的日志中讀取的最后一次成功更新的為止弥臼。注意:當(dāng)進(jìn)行主從復(fù)制時宴咧,所有對表的更新必須在主服務(wù)器上進(jìn)行,否則會造成沖突
1.1 mysql支持的復(fù)制類型
a. 基于語句的復(fù)制:在主服務(wù)器上執(zhí)行SQL語句径缅,在從服務(wù)器上執(zhí)行同樣的SQL語句(默認(rèn)采用的)掺栅,如果沒法精確復(fù)制,就會自動選擇基于行的復(fù)制
b. 基于行的復(fù)制:把改變的內(nèi)容復(fù)制過去纳猪,而不是把命令在從服務(wù)器執(zhí)行一遍氧卧,從mysql5.0開始支持
c. 混合類型,默認(rèn)采用基于語句的復(fù)制氏堤,一旦發(fā)現(xiàn)基于語句的無法精確的復(fù)制時沙绝,采用基于行的復(fù)制
1.2 復(fù)制如何工作
a. master服務(wù)器將數(shù)據(jù)更新記錄到二進(jìn)制日志文件中(主服務(wù)器上必須開啟log-bin)
b. slave將master的二進(jìn)制日志拷貝到它的中繼日志(relay log)
c.slave通過SQL線程從relay log中讀取二進(jìn)制日志,重新執(zhí)行一遍鼠锈,以改變自己的數(shù)據(jù)宿饱,整個過程如下所示
a. master服務(wù)器上開啟二進(jìn)制日志,每個事務(wù)更新數(shù)據(jù)完成之前脚祟,master都會把數(shù)據(jù)變化記錄到二進(jìn)制日志文件中(串行寫入)
b. slave上配置change master to,將master的binary日志拷貝到它自己的中繼日志(I/O線程)
c. SQL線程從中繼日志中讀取事件强饮,并重放其中的事件更新slave的數(shù)據(jù)由桌,使得和master的數(shù)據(jù)一樣
MySQL主從復(fù)制幾個重要的啟動選項
log-slave-updates
log-slave-updates這個參數(shù)用來配置從服務(wù)器的更新是否寫入二進(jìn)制日志,這個選項默認(rèn)是不打開的邮丰,但是行您,如果這個從服務(wù)器B是服務(wù)器A的從服務(wù)器,同時還作為服務(wù)器C的主服務(wù)器剪廉,那么就需要開發(fā)這個選項娃循,這樣它的從服務(wù)器C才能獲得它的二進(jìn)制日志進(jìn)行同步操作
master-connect-retry
master-connect-retry這個參數(shù)是用來設(shè)置在和主服務(wù)器連接丟失的時候,重試的時間間隔斗蒋,默認(rèn)是60秒
read-only
read-only是用來限制普通用戶對從數(shù)據(jù)庫的更新操作捌斧,以確保從數(shù)據(jù)庫的安全性,不過如果是超級用戶依然可以對從數(shù)據(jù)庫進(jìn)行更新操作
slave-skip-errors
在復(fù)制過程中泉沾,由于各種的原因捞蚂,從服務(wù)器可能會遇到執(zhí)行BINLOG中的SQL出錯的情況,在默認(rèn)情況下跷究,服務(wù)器會停止復(fù)制進(jìn)程姓迅,不再進(jìn)行同步,等到用戶自行來處理。
Slave-skip-errors的作用就是用來定義復(fù)制過程中從服務(wù)器可以自動跳過的錯誤號丁存,當(dāng)復(fù)制過程中遇到定義的錯誤號肩杈,就可以自動跳過,直接執(zhí)行后面的SQL語句解寝。
–slave-skip-errors=[err1,err2,…….|ALL]
但必須注意的是扩然,啟動這個參數(shù),如果處理不當(dāng)编丘,很可能造成主從數(shù)據(jù)庫的數(shù)據(jù)不同步与学,在應(yīng)用中需要根據(jù)實際情況,如果對數(shù)據(jù)完整性要求不是很嚴(yán)格嘉抓,那么這個選項確實可以減輕維護(hù)的成本
replicate-ignore-db = mysql,test,information_schema //忽略同步的庫replicate-wild-do-table = demo.% //指定同步的表
replicate-rewrite-db=”olddb->newdb” 這個就很實用了 和可以 同步到不同名稱數(shù)據(jù)庫上 配合以上指定同步不同的表