MASTER
ノードは、クライアントが送信したトランザクションを実行した直後に結果をクライアントに返しませんが、スレーブノードはそれを受信し、クライアントに返す前にリレーログに書き込みます。
非同期レプリケーションと比較すると、半同期はデータのセキュリティを向上させますが、ある程度の遅延も発生します。この遅延は、少なくとも 1 TCP ラウンド トリップ時間です。したがって、半同期レプリケーションは、低遅延ネットワークで使用するのが最適です。
MySQL はバージョン 5.5 から半同期レプリケーションをサポートしています。半同期レプリケーションはバージョン 5.7.2 で改良されました。元の半同期戦略は AFTER_COMMIT で、改良された戦略は次のとおりです。 AFTER_SYNC とこの 2 つの違いは、MASTER に対する SLAVE ノードの ACK 応答のタイミングが異なることです。
AFTER_COMMIT モードの紹介
MASTER は各トランザクションをバイナリ ログに書き込み、フラッシュします。トランザクションを保存し、同時に SLAVE に送信し、処理と送信のためにトランザクションをストレージ エンジンに送信し、SLAVE が確認情報を返すのを待ちます。確認情報を受信した後、MASTER は結果をクライアントに返します。そうすると、現在のクライアントは引き続き動作できるようになります。
AFTER_SYNC モードの紹介
MASTER は、各トランザクションをバイナリ ログに書き込み、ディスクをフラッシュして保存すると同時に、トランザクションを SLAVE に送信します。次に、SLAVE が確認情報を返すのを待ちます。確認情報を受信した後、トランザクションは処理と送信のためにストレージ エンジンに送信され、結果がクライアントに返され、現在のクライアントは動作を継続できます。
最初の AFTER_COMMIT
メソッドでは、現在のクライアントは、サーバーがデータを送信して受信した後にのみストレージ エンジンにデータを送信できます。 SLAVE. によって返された確認は、トランザクションの戻り結果を受け取ります。トランザクションが送信された後、SLAVE から確認情報を受け取る前に、他のクライアントは、現在のクライアントによって送信されたトランザクション情報を現時点で見ることができます。
ネットワークやその他の理由により、MASTER ノードから渡されたトランザクションを SLAVE ノードが受信できず、この時点で MASTER ノードがクラッシュした場合。 HA によりフェイルオーバーが実行され、クライアントは SLAVE ノードに接続されますが、このとき、MASTER ノードで見られていたトランザクションは SLAVE ノードでは見られなくなり、トランザクションの損失が発生します。
2 番目の AFTER_SYNC
メソッドでは、トランザクションが SLAVE によって確認され、MASTER がストレージ エンジン レベルでトランザクションをコミットすると、すべてのクライアントがトランザクションによって引き起こされたデータ変更を確認できます。したがって、すべてのクライアントは MASTER 上の同じデータを同時に参照します。
MASTER ノードがクラッシュすると、MASTER で送信されたすべてのトランザクションが SLAVE にコピーされます (リレー ログに保存されます)。 MASTER サーバーが予期せずクラッシュしました。現時点では、HA が SALVE にフェイルオーバーした後、SLAVE が最新であるため、クライアントから見えるデータはロスレスです。
ただし、この場合、バイナリ ログにコミットされていないトランザクションが含まれている可能性があるため、MASTER を直接復元して使用することはできないことに注意してください。現時点で、バイナリ ログを復元してビジネス ニーズに使用すると、次のような競合が発生する可能性があります。奴隷。
方法 1: 準同期はプラグインの形式で存在し、オンラインで直接有効にすることができます (今回はこの方法を使用します)
マスターノードの開始:
[root@GreatSQL][(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.02 sec)
スレーブノードの開始:
[root@GreatSQL][(none)]>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.02 sec)
追記: 通常の状況では、すべてのノードがマスター プラグインとスレーブ プラグインを同時に展開するため、フェイルオーバー時の処理がより便利になります。 :
my.cnf 構成で有効にします
マスター ノードとスレーブ ノードの両方が同時に開くように構成されています:
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1
5. プラグインのアクティブ化を確認します。ステータス
方法 1:##マスター ノード ビュー:
[root@GreatSQL][test]>show plugins; | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
スレーブ ノード ビュー:
[root@GreatSQL][(none)]>show plugins; | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
方法 2:Queryinformation_schema.plugins
より包括的な情報マスター ノード情報:
(Thu Feb 17 03:03:12 2022)[root@GreatSQL][(none)]>select * from information_schema.plugins where plugin_name like "%semi%"\G; *************************** 1. row *************************** PLUGIN_NAME: rpl_semi_sync_master PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: REPLICATION PLUGIN_TYPE_VERSION: 4.0 PLUGIN_LIBRARY: semisync_master.so PLUGIN_LIBRARY_VERSION: 1.10 PLUGIN_AUTHOR: Oracle Corporation PLUGIN_DESCRIPTION: Semi-synchronous replication master PLUGIN_LICENSE: GPL LOAD_OPTION: ON 1 row in set (0.00 sec) ERROR: No query specified # 从节点信息 (Thu Feb 17 16:05:19 2022)[root@GreatSQL][(none)]>select * from information_schema.plugins where plugin_name like "%semi%"\G; *************************** 1. row *************************** PLUGIN_NAME: rpl_semi_sync_slave PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: REPLICATION PLUGIN_TYPE_VERSION: 4.0 PLUGIN_LIBRARY: semisync_slave.so PLUGIN_LIBRARY_VERSION: 1.10 PLUGIN_AUTHOR: Oracle Corporation PLUGIN_DESCRIPTION: Semi-synchronous replication slave PLUGIN_LICENSE: GPL LOAD_OPTION: ON 1 row in set (0.00 sec
上記はオンラインなのでプラグインがインストールされているため、プラグインのインストール完了後、サービスを起動する必要があります
[root@GreatSQL][test]>SET GLOBAL rpl_semi_sync_master_enabled = on; Query OK, 0 rows affected (0.00 sec)
スレーブ ノードで半同期レプリケーションを有効にする:
t@GreatSQL][(none)]>SET GLOBAL rpl_semi_sync_slave_enabled = on; Query OK, 0 rows affected (0.00 sec)
(Mon Feb 14 15:19:58 2022)[root@GreatSQL][(none)]> (Mon Feb 14 15:19:58 2022)[root@GreatSQL][(none)]>STOP SLAVE IO_THREAD; Query OK, 0 rows affected, 1 warning (0.01 sec) (Mon Feb 14 15:21:41 2022)[root@GreatSQL][(none)]>START SLAVE IO_THREAD; Query OK, 0 rows affected, 1 warning (0.01 sec)
マスターノード:
[root@GreatSQL][test]>show status like 'Rpl_semi_sync_master_status'; +-----------------------------+-------+ | Variable_name | Value | +-----------------------------+-------+ | Rpl_semi_sync_master_status | ON | +-----------------------------+-------+ 1 row in set (0.00 sec)
スレーブ ノード:
[root@GreatSQL][(none)]>show status like 'Rpl_semi_sync_slave_status'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.01 sec)
# 关键信息 Start semi-sync binlog_dump to slave (server_id: 3306) 2022-02-14T02:16:35.411061-05:00 13 [Note] [MY-010014] [Repl] While initializing dump thread for slave with UUID <652ade08-8b1c-11ec-9f62-00155dcff90a>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(12). 2022-02-14T02:16:35.411236-05:00 13 [Note] [MY-010462] [Repl] Start binlog_dump to master_thread_id(13) slave_server(3306), pos(, 4) 2022-02-14T02:16:35.411263-05:00 13 [Note] [MY-011170] [Repl] Start asynchronous binlog_dump to slave (server_id: 3306), pos(, 4). 2022-02-14T02:16:35.411419-05:00 12 [Note] [MY-011171] [Repl] Stop asynchronous binlog_dump to slave (server_id: 3306). 2022-02-14T02:19:33.913084-05:00 9 [Note] [MY-011130] [Repl] Semi-sync replication initialized for transactions. 2022-02-14T02:19:33.913133-05:00 9 [Note] [MY-011142] [Repl] Semi-sync replication enabled on the master. 2022-02-14T02:19:33.913638-05:00 0 [Note] [MY-011166] [Repl] Starting ack receiver thread. 2022-02-14T02:21:46.899725-05:00 14 [Note] [MY-010014] [Repl] While initializing dump thread for slave with UUID <652ade08-8b1c-11ec-9f62-00155dcff90a>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(13). 2022-02-14T02:21:46.899894-05:00 14 [Note] [MY-010462] [Repl] Start binlog_dump to master_thread_id(14) slave_server(3306), pos(, 4) 2022-02-14T02:21:46.899953-05:00 14 [Note] [MY-011170] [Repl] Start semi-sync binlog_dump to slave (server_id: 3306), pos(, 4).
マスターノードのパラメータ情報:
[root@GreatSQL][test]>show variables like '%Rpl%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_read_size | 8192 | | 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 | | rpl_stop_slave_timeout | 31536000 | +-------------------------------------------+------------+ 8 rows in set (0.00 sec)
一部のパラメータの簡単な説明:
スレーブ ノードのパラメータ情報:
[root@GreatSQL][test]>show variables like '%Rpl%'; +---------------------------------+----------+ | Variable_name | Value | +---------------------------------+----------+ | rpl_read_size | 8192 | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | | rpl_stop_slave_timeout | 31536000 | +---------------------------------+----------+ 4 rows in set (0.00 sec)
一部のパラメータの簡単な説明:
主节点查看: 部分参数用途简要说明: 从节点转态信息: 参数简单说明: 半同步是否会降级为异步复制?是会的。 当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。 当MASTER DUMP 线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。 以上がMySQL で半同期レプリケーションを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。九、半同步状态信息
[root@GreatSQL][test]> show status like '%Rpl_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.00 sec)
show global status like '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
十、测试一下半同步的同步情况
1.从节点暂时先关掉IO线程
[root@GreatSQL][(none)]>STOP SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.02 sec)
2.主节点写入几条测试数据
[root@GreatSQL][test]>insert into ptype values(4,'4','4'),(5,'5','5'),(6,'6','6');
Query OK, 3 rows affected (0.02 sec)
3.等待10s后查看复制状态,半同步已经关掉了
[root@GreatSQL][test]>show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF |
+----------------------------+-------+
1 row in set (0.00 sec)
4.从节点开启IO线程
[root@GreatSQL][(none)]>START SLAVE IO_THREAD;
Query OK, 0 rows affected, 1 warning (0.02 sec)
5.再次查看复制状态,半同步复制自动开启了
t@GreatSQL][test]>show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)