MySQL中的半同步複製(r11筆記第65天)
關於MySQL的複製架構,大體有下面三種方式,非同步,全同步複製,半同步複製。
三種複製方式
第一種是非同步複製,是比較經典的主從複製,搭建主從預設的架構方式,就是屬於非同步的,相對來說效能要好一些。但是還是會有丟失資料的情況。
第二種是全複製,比如說MySQL Cluster這樣的方式,是屬於全複製的,實際上MySQL Cluster其實發展並不大順利,更多時候是一個實驗室產品,但是時間定格在2016年12月12日,MySQL 5.7.17 GA的重大特性group replication外掛推出,增強了MySQL原有的高可用方案(原有的Replication方案),提供了重要的特性—多寫,保證組內高可用,確保資料最終一致性。有點類似Oracle裡面的RAC.
第三種是在非同步和全複製之間的一種方案,就是半同步semi-sync replication。自MySQL 5.5推出,是對非同步和全複製的一種補充,確切的說,應該是對MySQL Cluster這種方案的補充。
如果把這個和Oracle聯絡起來,其實和Oracle高可用模式有點類似,Oracle中是最大效能模式,最大保護模式,最大高可用模式,其中最大效能模式就是非同步的方式,類似於非同步複製的角色,最大保護模式是完全的資料同步,有點類似於全複製的方案,而最大高可用模式是介於兩者之間,甚至可以達到動態切換,和半同步複製的角色差不多。
半同步複製要開啟半同步,我們需要安裝外掛,這個過程就很簡單了。基本的要求是在滿足非同步複製的情況下,版本在5.5以上,並且變數have_dynamic_loading為YES
> show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
1 row in set (0.00 sec)在base目錄下,可以很容易找到所需的外掛。當前的base目錄為/usr,可以根據關鍵字找到外掛。
# find . -name "semisync_master.so"
./lib64/mysql/plugin/semisync_master.so
./lib64/mysql/plugin/debug/semisync_master.so
要安裝外掛就是兩個簡單的命令。
> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.11 sec)
> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)安裝後檢視mysql.plugin看看外掛記錄是否存在,或者使用show plugins也可以。
> select * from mysql.plugin;
+----------------------+--------------------+
| name | dl |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
| rpl_semi_sync_slave | semisync_slave.so |
+----------------------+--------------------+
2 rows in set (0.00 sec)當然預設半同步的開關還沒有開啟。
> show variables like 'rpl_semi_sync_master%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
4 rows in set (0.00 sec)這裡涉及到兩個引數rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled,比較直觀。
開啟即可。set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_slave_enabled=1;如果在master端簡單驗證,也可以使用show status
> show status like 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+當然在slave端也需要做同樣的操作,然後在slave端重啟IO_Thread即可。
> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)Master端檢查Rpl_semi_sync_master_statusSlave端檢查
Rpl_semi_sync_slave_status
半同步在MySQL 5.6,5.7的變化MySQL 5.7中新增了一個引數來控制半同步模式下 主庫在返回給會話事務成功之前提交事務的方式。
> show variables like 'rpl_semi_sync_master_wait_point';
+---------------------------------+------------+
| Variable_name | Value |
+---------------------------------+------------+
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+---------------------------------+------------+
1 row in set (0.00 sec)而在MySQL 5.6中是什麼設定呢,是AFTER_COMMIT
這兩個引數該怎麼理解。我參考了 中的圖片。
master的資料寫入了binlog,slave 重新整理到磁碟(relay log),所以在OLTP的場景下,master需要等待slave 反饋收到relay log,只有收到ACK後master才將commit OK結果反饋給客戶端
而MySQL 5.7中的半同步複製,有個叫法是Loss-Less半同步複製。實現的方式有了一些差別。
這種模式(AFTER_SYNC),事務是在提交之前傳送給Slave,當Slave沒有接收成功,並且如果發生Master當機的場景,不會導致主從不一致,因為此時Master端還沒有提交,所以主從都沒有資料。
我們來簡單看看半同步複製的一些小測試。
create database testsync;
然後建立一個表,插入一行資料。很明顯執行速度很快。
> create table testsync.test(id int);
Query OK, 0 rows affected (0.07 sec)
> insert into testsync.test values(100);
Query OK, 1 row affected (0.01 sec)我們模擬網路延遲的情況,直接把slave停掉。
stop slave;這個時候在Master端插入資料就會有很慢。這個過程持續了大概10秒多。
> insert into testsync.test values(101);
Query OK, 1 row affected (10.00 sec)這裡為什麼是10秒,和一個扮同步複製的引數有關。單位是毫秒,所以換算下來就是10秒。
> show variables like 'rpl_semi_sync_master_timeout';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 10000 |
+------------------------------+-------+
我們看看扮同步複製的開關。
> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
+-----------------------------+-------+slave端也是OFF的狀態。
我們恢復狀態,把slave啟動。然後在Master端繼續插入一條記錄,速度就很快了。
> insert into testsync.test values(102);
Query OK, 1 row affected (0.00 sec)此時的開關是開啟的。
> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+檢視資料庫日誌,其實也能看到很明確的資訊。
2017-02-04T23:37:44.551667+08:00 2145633 [Warning] Timeout waiting for
reply of binlog (file: mysql-bin.000017, pos: 1056976828), semi-sync up
to file mysql-bin.000017, position 1056976573.
2017-02-04T23:37:44.551713+08:00 2145633 [Note] Semi-sync replication switched OFF.
2017-02-04T23:41:05.824146+08:00
2145900 [Note] Start binlog_dump to master_thread_id(2145900)
slave_server(13058), pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.824194+08:00
2145900 [Note] Start semi-sync binlog_dump to slave (server_id: 13058),
pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.835505+08:00 0 [Note] Semi-sync replication switched ON at (mysql-bin.000017, 1056977083)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28211342/viewspace-2141312/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL的半同步複製MySql
- MySQL 半同步複製MySql
- MySQL半同步複製MySql
- mysql5.5中的半同步複製MySql
- MySQL的非同步複製和半同步複製MySql非同步
- mysql 5.7半同步複製MySql
- 【MySQL】半同步與增強半同步複製MySql
- MySQL 8 複製(二)——半同步複製MySql
- mysql半同步複製的設定MySql
- MySQL主從複製之半同步複製MySql
- Mysql5.7半同步複製MySql
- MySQL 半同步複製+MMM架構MySql架構
- MySQL半同步複製--after_rollbackMySql
- mysql5.5半同步複製探究MySql
- MySQL主從複製、半同步複製和主主複製MySql
- MySQL的主從複製、半同步複製、主主複製詳解MySql
- MySQL5.7主從複製-半同步複製搭建MySql
- mysql線上建立半同步複製的從庫MySql
- MySQL主從複製、半同步複製和主主複製概述MySql
- 半同步複製報錯mysql8.0.25MySql
- MySQL半同步複製--after_commitMySqlMIT
- mysql5.5.9半同步複製功能部署MySql
- 配置mysql5.5主從複製、半同步複製、主主複製MySql
- MySQL中的undo截斷(r11筆記第89天)MySql筆記
- MySQL 5.5半同步複製的配置與監控MySql
- MySQL增強(Loss-less)半同步複製MySql
- MySQL5.5半同步複製實現原理MySql
- #MySQL# mysql5.7新特性之半同步複製MySql
- 物化檢視實現的特殊資料複製(r11筆記第42天)筆記
- MySQL5.7半同步複製報錯案例分析MySql
- MySQL 5.5 Semi-sync 半同步複製測試MySql
- MySQL(二):主從複製結構、半同步複製、雙主複製結構、利用SSL實現安全的MySQL主從複製MySql
- 主從複製、雙主複製及半同步複製、以及基於SSL的複製
- MySQL 5.5 主從複製非同步、半同步以及注意事項詳解MySql非同步
- 淺談MySQL中的事務隔離級別(r11筆記第86天)MySql筆記
- MySQL 5.7 General Tablespace學習(r11筆記第34天)MySql筆記
- MySQL Online DDL(二)(r11筆記第88天)MySql筆記
- MySQL 5.7半同步複製after sync和after commit詳解MySqlMIT