MySQL主從復制之半同步模式


MySQL主從復制之半同步模式
MySQL半同步介紹:
一般情況下MySQL默認復制模式為異步,何為異步?簡單的說就是主服務器上的I/O threads 將binlog寫入二進制日志中就返回給客戶端一個結果,無需等待二進制日志是否成功發送到從庫和從庫上是否成功完成relay log的寫入和SQL threads從relay log中提前二進制日志寫入自己binlog的過程,異步模式的缺點就是一旦主庫寫入binlog日志后發生宕機,此時從庫還未完成對主庫傳送過來binlog的讀寫存儲操作,那么從庫就會發生數據丟失的現象。所以這里就出現了另外一種復制模式,即半同步模式。
在半同步模式下,主庫將binlog日志信息寫入到日志中,然后等待從庫完成后面的接收讀取和存儲操作,然后返回主庫一個明確信息,即從庫接收完主庫傳遞過來的binlog內容已經寫入到自己的relay log中,才會通知主庫上的等待線程,該操作已經完成,才是主庫接收到從庫發過來的信息就會進入下一個同步操作動作,如果在此時等待超時,超過主庫中設置的超時時間限制(一般是rpl_semi_sync_master_timeout的值),則關閉半同步,並切換為異步模式,直到至少有一台從庫告訴主庫已經接收到主庫傳送過來的binlog信息為止。

MySQL半同步特點:
1、從庫會在連接到主庫時告訴主庫,它是不是匹配了半同步
2、如果半同步在主庫端是開啟了的,並且至少有一個半同步復制的從庫節點,那么此時主庫的事務線程在提交時會被阻塞並等待,結果有兩種可能:要么至少有一個從庫節點通知它已經收到了這個事務的binlog事件,要么一直等待到超時配置的某一個時間點為止,而此時,半同步復制將自行關閉,轉換為異步復制模式
3、從庫節點只有在接收到某一個事務的所有binlog將其寫入並Flash到Relay Log文件之后,才會通知對應主庫上的等待線程。
4、如果在等待過程中,主庫等待的時間已經超過了配置的超時時間,沒有任何一個從庫節點通知當前事務,那么此時主庫會自動轉換為異步復制模式,如果當前只要有一個同步從節點趕上來,主庫便會又自動轉換為半同步復制方式。
5、半同步模式必須在主庫和從庫上都開啟,如果主庫上沒打開,或者在主庫上開啟而從庫沒開啟,主庫都會使用異步模式復制

實驗環境:
操作系統:
cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
主從服務器IP地址規划:
主:192.168.0.100
從:192.168.0.101

MySQL版本:
mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

半同步復制模式提高了主從之間數據的一致性,讓復制更加安全,從MySQL5.7版本以后,又增加了rpl_semi_rsyn_master_wait_point參數,用來控制半同步模式下主庫在返回給session事務成功之前的事務提交方式,該參數有兩個值:
a、AFTER_COMMIT
該值是MySQL5.6版本的默認值,主要意思是主庫將每個事務寫入binlog,並傳遞給從庫,刷新到中繼日志中,同時主庫提交事務。之后主庫開始等待從庫的反饋,只有收到從庫 的回復,master才將“commit OK” 的結果返回給客戶端。
b、AFTER_SYNC
該值的是MySQL5.7版本之后新增的,也是在MySQL5.7默認的半同步復制方式。主要意思是主庫將每個事務寫入自己的binlog並傳遞給從庫,刷新到中繼日志中,主庫開始等待從庫的反饋,接收到從庫的回復之后,再提交事務並返回"commit Ok"結果給客戶端。

注:可以通過rpl_semi_sync_master_wait_for_slave_count參數來控制主庫接收多少個從庫寫事務成功反饋,才返回成功給客戶端。生產環境中使用半同步復制,當從庫出現故障,等待超時的時間又很長,導致主庫無法接收從庫信息而無法正常寫入時,可以通過該參數提出故障從庫。

在after_sync模式下,即使主庫宕機,所有在主庫上已經提交的事務都能保證已經同步到從庫的中繼日志中,不會丟失任何數據。

半同步復制的搭建環境很簡單,它是基於異步復制的基礎上,安裝半同步復制插件就可以了。
主庫上操作:

root@sakila 02:23: [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.03 sec)
root@sakila 02:24: [(none)]> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.00 sec)

root@sakila 02:24: [(none)]> show variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

注:還有一個比較重要的參數就是rpl_semi_sync_master_timeout,單位是毫秒。它表示如果主庫等待從庫回復消息的時間超過該值,就自動切換為異步復制模式。建議不要取默認值10s,該值可以調整得很大,禁止向異步復制切換來保證數據復制的安全性。MySQL5.7半同步復制默認的方式就是after_sync模式。

root@sakila 02:24: [(none)]> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
45 rows in set (0.00 sec)

然后再在從庫中安裝半同步復制插件和開啟半同步復制功能;
root@sakila 02:38: [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.02 sec)
root@sakila 02:39: [(none)]> set global rpl_semi_sync_slave_enabled=on;
Query OK, 0 rows affected (0.00 sec)

root@sakila 02:39: [(none)]> show variables like '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.01 sec)

通過show plugins確認插件已經加載成功

root@sakila 02:40: [(none)]> show plugins;
+----------------------------+----------+--------------------+-------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+-------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+-------------------+---------+
45 rows in set (0.00 sec)

注:為了以后可以開機自啟動半同步復制功能,我們可以把rpl_semi_sync_slave_enabled=on、rpl_semi_sync_master_enabled=on兩個參數加載到my.cnf配置文件中

因為以前已經開始了異步復制模式,現在只需要加載半同步復制的插件和啟動半同步復制功能即可,所以接下來重啟I/O threads,激活半同步復制。

root@sakila 02:41: [(none)]> stop slave io_thread;
Query OK, 0 rows affected (0.00 sec)
root@sakila 02:44: [(none)]> start slave io_thread;
Query OK, 0 rows affected (0.01 sec)

主庫上查看半同步復制是否正常運行:
root@sakila 02:37: [(none)]> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.04 sec)

Rpl_semi_sync_master_clients參數代表已經有一個從庫連接到了主庫,並且是半同步復制方式。
Rpl_semi_sync_master_status參數是ON(開啟)狀態,代表已經是半同步復制模式了。
Rpl_semi_sync_master_no_tx:代表沒有成功接收slave提交的數據
Rpl_semi_sync_master_yes_tx:代表成功接收slave事務回復的次數

在從庫上查看半同步復制狀態:
root@sakila 02:44: [(none)]> show global status like '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)

Rpl_semi_sync_slave_status參數等於on代表從庫也開啟了半同步復制模式,至此MySQL半同步復制搭建成功。

 參考:https://www.cnblogs.com/zero-gg/p/9057092.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM