天天看點

MySQL無損複制MySQL5.7新特性:lossless replication 無損複制

<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原生的複制
MySQL無損複制MySQL5.7新特性:lossless replication 無損複制
原理:在全同步複制中,master寫資料到binlog且sync,所有slave request binlog後寫入relay-log并flush disk,并且回放完日志且commit 優點:資料不會丢失 缺點:會阻塞master session,性能太差,非常依賴網絡 代表:mysql-cluster
MySQL無損複制MySQL5.7新特性:lossless replication 無損複制

普通的半同步複制

原理: 在半同步複制中,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資料丢失
MySQL無損複制MySQL5.7新特性:lossless replication 無損複制

增強版的半同步複制(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沒有丢失資料
MySQL無損複制MySQL5.7新特性:lossless replication 無損複制

參數

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 犧牲一緻性

這種做法,就是保留高可用性,犧牲一緻性 案例:比如原生的異步複制就是這樣咯。可以快速做到切換,但是一緻性就沒有保障