MySQL半同步複製

壹頁書發表於2014-02-21
高可用MySQL 半同步複製 116頁
“半同步複製的理念是在容許更改操作繼續執行之前,確保更改操作至少被寫入一個Slave的磁碟。
這意味著對於每一個連線,最多隻有一個事務會由於Master崩潰而丟失”。

這段話值得注意的是
在半同步複製之前,事務已經提交。雖然因為半同步複製沒有完成,客戶端沒有相應,但是此時作為事務已經提交。
另外,將binlog寫入至少一個Slave的磁碟,指的是Slave的IO執行緒將binlog寫入了Slave的中繼日誌,而不是SQL執行緒將其應用到資料檔案。

而半同步複製的作用,類似於檢查點。它使得Master和Slave的binlog最大限度的保持一致。

"最多隻有一個事務會由於Master崩潰而丟失"應該指的是如下場景,
Master事務已經提交,Slave IO執行緒正在寫入此事務的binlog,但是尚未完成。這個時候Master突然故障,並且無法恢復。
因為Slave IO執行緒並未完成,所以這個Slave提升為Master之後,這個已經提交的事務就丟失了。

下面搭建一個半同步複製的環境。
[Master]
Host:RAC1   
IP:192.168.1.70

安裝Master半同步複製外掛


修改Master配置檔案
user=root
log_bin=rac1
autocommit=0
binlog_format=row
server_id=1
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_wait_no_slave=0
sync_binlog=1

重啟Master

[Slave]
Host:RAC2
IP:192.168.1.80

安裝Slave半同步複製外掛


修改Slave配置檔案
log_bin=rac2
autocommit=0
binlog_format=row
server_id=2
rpl_semi_sync_slave_enabled=1

重啟Slave

在Master上建立複製的帳號
create user repl;
grant replication slave,replication client on *.*
to repl@'192.168.1.%' identified by 'repl';

在Slave上開啟複製
change master to
master_host='192.168.1.70',
master_port=3306,
master_user='repl',
master_password='repl';

start slave;

根據上面半同步複製的描述,如果所有的Slave都停止工作,那麼Master也會Hang住。
rpl_semi_sync_master_wait_no_slave和rpl_semi_sync_master_timeout引數可以解決這個問題。

rpl_semi_sync_master_wait_no_slave設定為1,表示如果沒有任何可用的Slave,則Master等待。等待時間由rpl_semi_sync_master_timeout設定。如果超時,則使用非同步複製的模式。

rpl_semi_sync_master_wait_no_slave設定為0,則表示如果沒有任何可用的Slave,則使用非同步複製。

假設一個Master和一個Slave,rpl_semi_sync_master_wait_no_slave設定為1,rpl_semi_sync_master_timeout設定為10S.
如果在複製的過程中,Slave當機。則Master的事務提交之後,會等待直到10S的超時,然後使用非同步複製。

可以使用show status監控半同步複製
Master:

Slave:


其中
Rpl_semi_sync_slave_status表示Slave半同步複製是否啟用
Rpl_semi_sync_master_status表示Master半同步複製是否啟用
Rpl_semi_sync_master_clients表示半同步複製的已連線Slave數量

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1084938/,如需轉載,請註明出處,否則將追究法律責任。

相關文章