mysql半同步降级_MySQL半同步复制
半同步復(fù)制簡介
MySQL復(fù)制默認情況下是異步的,主庫將事件寫入binlog并不管從庫是否接受并處理它們,如果主庫崩潰時,已提交的事務(wù)可能沒有被傳送到從庫,因此主從切換可能導(dǎo)致數(shù)據(jù)丟失。Semisynchronous Replication(半同步復(fù)制)則一定程度上保證提交的事務(wù)已經(jīng)傳給了至少一個備庫。半同步
復(fù)制中,僅僅保證事務(wù)的已經(jīng)傳遞到備庫上,但是并不確保已經(jīng)在備庫上執(zhí)行完成了。半同步復(fù)制確實有一定的性能影響,因為需要等待的從庫確認。這是對增加數(shù)據(jù)的完整性的折衷。
工作原理:
從庫連接主庫時指明時從庫否有半同步能力
主庫啟動半同步復(fù)制且至少有一個半同步從庫,主庫線程執(zhí)行事務(wù)提交之后將會阻塞直到任一半同步從庫確認接收到該事務(wù)的所有事件或者超時
從庫確認接收到事務(wù)的所有事件之后寫入到中繼日志并刷新到磁盤
如果超時沒有任何從庫確認事務(wù),主庫恢復(fù)到異步復(fù)制,保障業(yè)務(wù)的正常使用,直到一臺從庫追趕上之后,繼續(xù)切換到半同步模式
半同步復(fù)制必須主從兩端同時啟用,如任意一端禁止將使用異步復(fù)制
當主庫被阻塞時(已經(jīng)提交的事務(wù)等待從從庫確認),不會向執(zhí)行事務(wù)的session返回信息;當主庫阻塞結(jié)束后,返回session執(zhí)行結(jié)果。
此時,主庫事務(wù)已提交,至少一臺從庫確認接收到事務(wù)。
如果主備網(wǎng)絡(luò)故障或者從庫崩潰,主庫在事務(wù)提交后等待10秒(rpl_semi_sync_master_timeout默認值)后,主從復(fù)制將自動降級為異步模式。
半同步復(fù)制是通過plugin實現(xiàn)的,master和slave使用不同的plugin。默認情況下沒有安裝該plugin,插件位于CMAKE_INSTALL_PREFIX/lib/plugin/。安裝完插件之后,還需要手動設(shè)置系統(tǒng)參數(shù)以開啟半同步復(fù)制模式。
安裝配置半同步
[Master]
首先先檢查 mysql是否支持動態(tài)添加插件
mysql> show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
1 row in set (0.02 sec)
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.04 sec)
mysql> show variables like '%sem%';
+------------------------------------+-------+
| 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)
mysql> set global rpl_semi_sync_master_enabled = ON;
Query OK, 0 rows affected (0.00 sec)
mysql> set global rpl_semi_sync_master_timeout=2000; #毫秒
Query OK, 0 rows affected (0.00 sec)
mysql> show status like '%sem%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 | # 有多少slave設(shè)置了半同步模式
| Rpl_semi_sync_master_net_avg_wait_time | 0 | # 事務(wù)提交后,等待備庫響應(yīng)的平均時間
| Rpl_semi_sync_master_net_wait_time | 0 | # 網(wǎng)絡(luò)響應(yīng)等待的總時間
| Rpl_semi_sync_master_net_waits | 0 | # 網(wǎng)絡(luò)等待總次數(shù)
| Rpl_semi_sync_master_no_times | 0 | # 一共有幾次從Semi-sync跌回普通狀態(tài)
| Rpl_semi_sync_master_no_tx | 0 | # 備庫未及時響應(yīng)的事務(wù)次數(shù)
| Rpl_semi_sync_master_status | ON | # 主庫上Semi-sync是否正常開啟
| Rpl_semi_sync_master_timefunc_failures | 0 | # 時間函數(shù)未正常工作的次數(shù)
| Rpl_semi_sync_master_tx_avg_wait_time | 0 | # 開啟Semi-sync,事務(wù)返回需要等待的平均時間
| Rpl_semi_sync_master_tx_wait_time | 0 | # 事務(wù)等待備庫響應(yīng)的總時間
| Rpl_semi_sync_master_tx_waits | 0 | # 事務(wù)等待備庫響應(yīng)的總次數(shù)
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | # 改變當前等待事務(wù)記錄最小二進制日志的次數(shù)
| Rpl_semi_sync_master_wait_sessions | 0 | # 當前有幾個線程在等待備庫響應(yīng)
| Rpl_semi_sync_master_yes_tx | 0 | # 備庫成功響應(yīng)的事務(wù)次數(shù)
+--------------------------------------------+-------+
14 rows in set (0.01 sec)
[Slave]
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like '%sem%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_slave_enabled = ON;
Query OK, 0 rows affected (0.00 sec)
然后重啟replication(stop slave;start slave;)即可。
一定需要重啟,否則master無法確認該slave是否開啟了半同步。相同的操作可以在任意多個slave中進行設(shè)置。
[slave]
mysql> show status like '%sem%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.01 sec)
[master]
mysql> show status like '%sem%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 9978 |
| Rpl_semi_sync_master_net_wait_time | 19957 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 2 |
| 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.00 sec)
狀態(tài)說明:
Rpl_semi_sync_master_tx_avg_wait_time:事務(wù)因開啟Semi_sync,平均需要額外等待的時間
Rpl_semi_sync_master_net_avg_wait_time:事務(wù)進入等待隊列后,到網(wǎng)絡(luò)平均等待時間
依據(jù)上面兩個狀態(tài)值可以知道,Semi-sync的網(wǎng)絡(luò)消耗有多大,給某個事務(wù)帶來的額外的消耗有多大。
Rpl_semi_sync_master_status: 表示主庫當前Semi-sync是否正常工作
Rpl_semi_sync_slave_status: 表示從庫當前Semi-sync是否正常工作
Rpl_semi_sync_master_no_times:可以知道一段時間內(nèi),Semi-sync是否有超時失敗過,該計數(shù)器則記錄了這樣的失敗次數(shù)。
Rplsemi_sync_master_wait_pos_backtraverse:在semisync_master中,維護了這樣的兩個變量wait_file_name和waitfile_pos,當主庫上多個事務(wù)都在等待從庫的響應(yīng)時,這兩個變量記錄了所有等待中,最小的那一個Binlog位置。如果這時一個新的事務(wù)加入等待,并且該事務(wù)需要等待的Binlog比waitfile_name和waitfile_pos還小的話,則更新這兩個值,并將Rpl_semi_sync_master_wait_pos_backtraverse值自增1。
整理自網(wǎng)絡(luò)
Svoid
2015-01-29
總結(jié)
以上是生活随笔為你收集整理的mysql半同步降级_MySQL半同步复制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪吒汽车2月份交付10073台 同比大涨
- 下一篇: mysql 存储过程cursor_MyS