1. 程式人生 > 實用技巧 >MySQL主從半同步複製

MySQL主從半同步複製

目錄

一、半同步複製

1.半同步複製概念

從MYSQL5.5開始,支援半自動複製。之前版本的MySQL Replication都是非同步(asynchronous)的,主庫在執行完一些事務後,
是不會管備庫的進度的。如果備庫不幸落後,而更不幸的是主庫此時又出現Crash(例如宕機),這時備庫中的資料就是不完整的。
簡而言之,在主庫發生故障的時候,我們無法使用備庫來繼續提供資料一致的服務了。

半同步複製(Semi synchronous Replication)則一定程度上保證提交的事務已經傳給了至少一個備庫。
出發點是保證主從資料一致性問題,安全的考慮。

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

#缺點:
1.效能差,影響主庫效率
2.半同步複製,有一個超時時間,超過這個時間恢復主從複製

# 半同步複製原理:
主要為了保證主庫的binlog事務被可靠寫入到從庫中,主庫在每次事務成功提交時,並不及時反饋給前端應用使用者,
而是等待其中的一個從庫也接收到Binlog事務併成功寫入中繼日誌後,由從庫的binlog返回一個ack給主庫,主庫才返回commit操作成功給客戶端,
半同步複製保證了事務成功提交後,至少有兩份日誌記錄,一份在主庫的Binlog日誌上,另一份在至少一個從庫的中繼日誌Relay log上,從而更近一步保證了資料的完整性。

# 半同步複製和全同步的區別:
和mysql全同步複製的區別為,全同步複製需要保證每一個binlog事務都寫入到從庫中,而半同步複製只需要保證所有的從庫中有一個binlog事務寫入到從庫中即可。

2.配置半同步

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就會恢復到非同步複製。