1. 程式人生 > 實用技巧 >MYSQL之半同步複製

MYSQL之半同步複製

1.半同步複製的作用

解決主從資料一致性問題

2.半同步複製工作原理的變化

1. 主庫執行新的事務,commit時,更新 show master  status\G ,觸發一個訊號給
2. binlog dump 接收到主庫的 show master status\G資訊,通知從庫日誌更新了
3. 從庫IO執行緒請求新的二進位制日誌事件
4. 主庫會通過dump執行緒傳送新的日誌事件,給從庫IO執行緒
5. 從庫IO執行緒接收到binlog日誌,當日志寫入到磁碟上的relaylog檔案時,給主庫ACK_receiver執行緒
6. ACK_receiver執行緒觸發一個事件,告訴主庫commit可以成功了
7. 如果ACK達到了我們預設值的超時時間,半同步複製會切換為原始的非同步複製.

5.5版本:出現概念,但是不建議使用,效能太差
5.6版本:出現group commit 組提交功能,來提升開啟半同步複製的效能
5.7版本:更加完善了,在group commit基礎上出現了MGR
5.7版本:的增強半同步複製的新特性:after commit; after sync;

3.配置半同步

1.主庫操作

#登入資料庫
[root@db01 ~]# mysql -uroot -p123
#檢視是否有動態支援
mysql> show global variables like 'have_dynamic_loading';
#安裝自帶外掛
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
#啟動外掛
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
#設定超時
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
#修改配置檔案
[root@db01 ~]# vim /etc/my.cnf
#在[mysqld]標籤下新增如下內容(不用重啟庫)
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
檢查安裝:
mysql> show variables like'rpl%';
mysql> show global status like 'rpl_semi%';

2.從庫操作

#登入資料庫
[root@mysql-db02 ~]# mysql -uroot -poldboy123
#安裝slave半同步外掛
mysql>  INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
#啟動外掛
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
#重啟io執行緒使其生效
mysql> stop slave io_thread;
mysql> start slave io_thread;
#編輯配置檔案(不需要重啟資料庫)
[root@mysql-db02 ~]# vim /etc/my.cnf
#在[mysqld]標籤下新增如下內容
[mysqld]
rpl_semi_sync_slave_enabled =1

3.額外引數

rpl_semi_sync_master_timeout=milliseconds
設定此引數值(ms),為了防止半同步複製在沒有收到確認的情況下發生堵塞,如果Master在超時之前沒有收到任何確認,將恢復到正常的非同步複製,並繼續執行沒有半同步的複製操作。

rpl_semi_sync_master_wait_no_slave={ON|OFF}
如果一個事務被提交,但Master沒有任何Slave的連線,這時不可能將事務傳送到其它地方保護起來。預設情況下,Master會在時間限制範圍內繼續等待Slave的連線,並確認該事務已經被正確的寫到磁碟上。
可以使用此引數選項關閉這種行為,在這種情況下,如果沒有Slave連線,Master就會恢復到非同步複製。