標籤:failure 串連 slave 半同步 事務 select bsp 時間 非同步
1.1.1.
相關概念
預設情況下,MySQL使用非同步複製,即master上的事務執行與slave上的複製操作不需要同步,master不需要等待slave上的複製線程將Binary Log接收完畢即可執行其它事務。
半同步複製時,master上的事務執行與slave上的複製操作需要在某個步驟上進行同步,master需要等待slave上的複製線程接收完畢Binary Log。
非同步複製的工作效率比較高,但是在特定條件下,有可能造成master和slave的資料不一致。半同步複製可以降低資料不一致的機率。半同步複製僅支援單源複製,不支援多源複製。
1.1.2.
部署半同步複製
建立半同步複製的環境,在已經建立好master-slave複製環境的情況下,還需要執行以下操作。
(1)在master上安裝半同步複製外掛程式。
mysql> show variables like ‘%semi%‘;
Empty set (0.02 sec)
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;
Query OK, 0 rows affected (0.05 sec)
mysql> show variables like ‘%semi%‘;
+-------------------------------------------+------------+
| 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_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.00 sec)
其中 rpl_semi_sync_master_timeout變數控制半同步的逾時時間,單位為毫秒,預設為10000,即10秒鐘。
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE ‘%semi%‘;
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
1 row in set (0.00 sec)
(2)在slave上安裝半同步複製外掛程式。
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like ‘%semi%‘;
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE ‘%semi%‘;
+---------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+---------------------+---------------+
| rpl_semi_sync_slave | ACTIVE |
+---------------------+---------------+
1 row in set (0.00 sec)
(3)在master上啟用半同步複製。
在master上的MySQL設定檔中:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
【此處省略了非同步複製必須的其它配置】
可以使用SQL命令動態啟用半同步複製。
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
(4)在slave上啟用半同步複製。
在slave上的MySQL設定檔中:
[mysqld]
rpl_semi_sync_slave_enabled=1
【此處省略了非同步複製必須的其它配置】
可以使用SQL命令動態啟用半同步複製。
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
至此半同步複製環境建立成功。
1.1.3.
監控半同步複製的狀態
(1)查看master上的半同步複製。
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%‘;
+-------------------------------------------+------------+
| 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)
mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%‘;
+--------------------------------------------+-------+
| 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.00 sec)
其中,Rpl_semi_sync_master_clients表示通過半同步複製已經串連上的slave的數量。
Rpl_semi_sync_master_yes_tx表示已經成功發送了半同步ACK的slave的數量。
Rpl_semi_sync_master_no_tx表示沒有成功發送半同步ACK的slave的數量。
(2)查看slave上的半同步複製狀態。
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%‘;
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)
mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%‘;
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
其中,Rpl_semi_sync_slave_status表示slave上的半同步複製已經成功啟動了。
MySQL學習筆記12半同步複製