<a href="https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html">https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html</a>
asynchronous 異步複制 fully synchronous 全同步複制 semisynchronous 半同步複制
原理:在異步複制中,master寫資料到binlog且sync,slave request binlog後寫入relay-log并flush disk 優點:複制的性能最好 缺點:master挂掉後,slave可能會丢失事務 代表:mysql原生的複制

原理:在全同步複制中,master寫資料到binlog且sync,所有slave request binlog後寫入relay-log并flush disk,并且回放完日志且commit 優點:資料不會丢失 缺點:會阻塞master session,性能太差,非常依賴網絡 代表:mysql-cluster
普通的半同步複制
原理: 在半同步複制中,master寫資料到binlog且sync,且commit,然後一直等待ack。當至少一個slave request bilog後寫入到relay-log并flush disk,就傳回ack(不需要回放完日志) 優點:會有資料丢失風險(低) 缺點:會阻塞master session,性能差,非常依賴網絡, 代表:after commit, 原生的半同步 重點:由于master是在三段送出的最後commit階段完成後才等待,是以master的其他session是可以看到這個送出事務的,是以這時候master上的資料和slave不一緻,master crash後,slave資料丢失
增強版的半同步複制(lossless replication)
原理: 在半同步複制中,master寫資料到binlog且sync,然後一直等待ack. 當至少一個slave request bilog後寫入到relay-log并flush disk,就傳回ack(不需要回放完日志) 優點:資料零丢失(前提是讓其一直是lossless replication),性能好 缺點:會阻塞master session,非常依賴網絡 代表:after sync, 原生的半同步 重點:由于master是在三段送出的第二階段sync binlog完成後才等待, 是以master的其他session是看不見這個送出事務的,是以這時候master上的資料和slave一緻,master crash後,slave沒有丢失資料
參數
comment
預設值
推薦值
是否動态
rpl_semi_sync_master_wait_for_slave_count
至少有n個slave接收到日志
1
dynamic
rpl_semi_sync_master_wait_point
等待的point
after_sync
rpl_semi_sync_master_timeout
切換複制的timeout
10000(10s)
1000(1s)
rpl_semi_sync_master_enabled
是否開啟半同步
off
on
rpl_semi_sync_slave_enabled
如何檢驗上述after_sync,after_commit 如何檢驗上述原理的正确性
master上當一個事務waiting for semi-sync ack from slave的時候,後來的事務是在a,b,c哪個階段卡住呢?
根據以上的測試,可以得知,lossless隻卡在b階段,普通的semi-sync是卡在c階段。 lossless的性能遠遠好于普通的semi-sync,即(after_sync 優于 after_commit) 因為lossless 卡在b階段的時候可以堆積事務,可以在c階段進行group commit。 普通的semi-sync,卡在c階段,事務都已經commit了,并沒有堆積的過程。
一緻性【c】 可用性【a】 分區容忍性【p】 理論:cap 三者不可兼得,必須要犧牲一個
分區,是一定存在的,不是你想不要就不要的。是以,這裡隻剩下兩種組合
cp 犧牲可用性
這種做法,就是保留強一緻性,犧牲可用性 案例:可以将rpl_semi_sync_master_timeout設定成一個無限大的值,比如:100天,那麼master和slave就強一緻了,但是可用性就大打折扣
ap 犧牲一緻性
這種做法,就是保留高可用性,犧牲一緻性 案例:比如原生的異步複制就是這樣咯。可以快速做到切換,但是一緻性就沒有保障