初認識MySQL 5.5半同期レプリケーション
31274 ワード
背景:MySQL 5.5以前のレプリケーションは非同期レプリケーションであり、サーバのクラッシュ時にトランザクションが失われることは、非同期レプリケーションを使用することで避けられない結果です.一方、5.5の新しい機能:半同期レプリケーションは、トランザクションの損失数を制限します.半同期レプリケーションの原理は、トランザクションをコミットするスレッドがロックされ、少なくとも1つのSlaveがこのトランザクションを受信するまで、トランザクションのイベントがストレージエンジンにコミットされた後にSlaveに送信されるため、トランザクションの損失数は最大スレッドごとに1つに減少することができます.
インストール、構成:半同期レプリケーション・モードは、プライマリ・サーバとセカンダリ・サーバの両方で有効にする必要があります.そうしないと、プライマリ・サーバはデフォルトで非同期レプリケーション・モードを使用します.
1,Masterにプラグインを装着:install plugin rpl_semi_sync_master soname 'semisync_master.so';SET GLOBAL rpl_semi_sync_master_enabled=ON;my.cnfプロファイルにrplを追加semi_sync_master_enabled = 1
2,Slaveにプラグインを装着:install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled =ON;my.cnfプロファイルにrplを追加semi_sync_slave_enabled = 1
3非同期レプリケーションの設定手順と同じです.(アカウント、Change.)これで半同期が完了します.
構成に成功すると、ログには、121210 7:28:43[Note]Slave I/O thread:Start semi-sync replication to master'が表示されます[email protected]:3306' in log 'mysql-bin.000001' at position 107
パラメータ:すべてのSlaveがクラッシュしたり、切断されたり、MasterだけがSlaveを持っていない(不可能).これによりSlaveはMasterのトランザクションを受け入れられず、MはSが返す確認情報を得られない.Mはずっと待っています.ここでは2つのパラメータを設定できます:Master上:rpl_semi_sync_master_Enabled:masterで半同期レプリケーションモードがオンになっていることを示します.rpl_semi_sync_master_timeout:受信Sが発行していない確認で半同期レプリケーションが詰まるのを防止するため、タイムアウトを設定し、この時間値を超えて情報を受信していない場合は非同期レプリケーションに切り替え、操作を実行するタイマを設定できます.(デフォルトは10,000ミリ秒、10秒です.このパラメータは動的に調整可能です.これは、プライマリ・ライブラリがあるトランザクションにおいて、待機時間が10秒を超えると、非同期レプリケーション・モードに降格し、SLAVEがライブラリから再検出されるのを待たないことを示します.プライマリ・ライブラリが再び検出され、SLAVEがライブラリからリカバリされると、自動的に半同期レプリケーション・モードに戻ります.)rpl_semi_sync_master_wait_no_slave:トランザクションがコミットされたが、MasterにSlave接続がない場合、Mは確認情報を受け取ることはできませんが、Mは時間制限の範囲内で待機し続けます.Slaveリンクがない場合は非同期コピーに切り替わります.(マスターが各トランザクションのコミットを許可するかどうかは、slaveの受信確認信号を待つ必要があります.デフォルトはonで、各トランザクションは待機します.offの場合、slaveが追いつくと、半同期レプリケーションモードも開かず、手動で開く必要があります.)Slave上:rpl_recovery_rank:slaveがライブラリからダウンタイムした後、Relay-LOgが破損し、一部の中継ログが処理されなかった場合、実行されていないrelay-logを自動的に放棄し、MASTERからログを再取得し、relay-logの完全性を保証します.デフォルトでは機能はオフですrelay_log_recoveryの値が1に設定されている場合、slaveでライブラリからこの機能をオンにできます.
≪ステータス|Status|emdw≫:半同期レプリケーションであることをどのように認識しますか?
説明:Rpl_semi_sync_master_Clients:半同期レプリケーションをサポートおよび登録するリンクされたSlaveの数を説明します.Rpl_semi_sync_master_status:ONはアクティブ状態(半同期)、OFFは非アクティブ状態(非同期)、または彼が有効になっていないか、または非同期レプリケーション状態に復元されています.プライマリ・サーバが非同期レプリケーション・モードを使用しているか、半同期レプリケーション・モードを使用しているかを示すために使用します.Rpl_semi_sync_master_yes_tx:正常にコミットされた数.Rpl_semi_sync_master_no_tx:コミットに失敗した数.Rpl_semi_sync_slave_status:Slave上の半同期コピー状態、ONは有効、OFFは非アクティブ.テスト:レプリケーションが正常な場合、プライマリに1つ挿入すると、セカンダリに直接同期します.
もし意外なことがあったら、切ってから、それでは:
最初の挿入、rpl_を受けるsemi_sync_master_timeoutパラメータの影響で、タイムアウトは10 s待ちました.2回目は、非同期レプリケーション(Rpl_semi_sync_master_status=OFF)に切り替えたので、この2つの挿入文は非半同期で実行されるので、Rpl_semi_sync_master_no_txは1から3に変わりました.再起動するか、クラッシュからの問題を修正します.
主の場合:主は自動的に半同期をオンにします.
注意:上記の状況が頻繁に発生すると、プライマリの更新データが遅くなります.半同期レプリケーションと非同期レプリケーションの切り替えが頻繁であるため、プライマリは受信元の情報を頻繁に待機してタイムアウトする.
IOスレッドとSQLスレッドの問題:ログに記録されている情報:7:28:43[Note]Slave I/O thread:Start semi-sync replication to master...;IOスレッドに関連しています.SQLスレッドが切れたら.それはどうなるの?
SQLスレッドが間違っていても、半同期レプリケーションは切り替えられません.半同期レプリケーションがIO_とTHREADは直接関係があり、SQL_とTHREADは大丈夫です.すなわち、SLAVEは、relay-log中継ログが正しく実行されているかどうかにかかわらず、ライブラリからバイナリログを受信した後、マスターマスターマスターマスターに確認を与える.
まとめ:メリット:半同期レプリケーションはトランザクションの損失数を効果的に制限し、データの安全と一貫性をよりよく保証します.悪い点:非同期レプリケーションよりも更新、挿入、削除の速度が遅くなります.主に情報を返すステップが1つ増えたためです.例外が発生した場合:ネットワークの問題やデータベースの問題では、半同期レプリケーションと非同期レプリケーションが交互に切り替わり、プライマリ・ライブラリの更新、挿入、削除操作に影響します.
詳細については、http://hcymysql.blog.51cto.com/5223301/887938を参照してください.
インストール、構成:半同期レプリケーション・モードは、プライマリ・サーバとセカンダリ・サーバの両方で有効にする必要があります.そうしないと、プライマリ・サーバはデフォルトで非同期レプリケーション・モードを使用します.
1,Masterにプラグインを装着:install plugin rpl_semi_sync_master soname 'semisync_master.so';SET GLOBAL rpl_semi_sync_master_enabled=ON;my.cnfプロファイルにrplを追加semi_sync_master_enabled = 1
2,Slaveにプラグインを装着:install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled =ON;my.cnfプロファイルにrplを追加semi_sync_slave_enabled = 1
3非同期レプリケーションの設定手順と同じです.(アカウント、Change.)これで半同期が完了します.
構成に成功すると、ログには、121210 7:28:43[Note]Slave I/O thread:Start semi-sync replication to master'が表示されます[email protected]:3306' in log 'mysql-bin.000001' at position 107
パラメータ:すべてのSlaveがクラッシュしたり、切断されたり、MasterだけがSlaveを持っていない(不可能).これによりSlaveはMasterのトランザクションを受け入れられず、MはSが返す確認情報を得られない.Mはずっと待っています.ここでは2つのパラメータを設定できます:Master上:rpl_semi_sync_master_Enabled:masterで半同期レプリケーションモードがオンになっていることを示します.rpl_semi_sync_master_timeout:受信Sが発行していない確認で半同期レプリケーションが詰まるのを防止するため、タイムアウトを設定し、この時間値を超えて情報を受信していない場合は非同期レプリケーションに切り替え、操作を実行するタイマを設定できます.(デフォルトは10,000ミリ秒、10秒です.このパラメータは動的に調整可能です.これは、プライマリ・ライブラリがあるトランザクションにおいて、待機時間が10秒を超えると、非同期レプリケーション・モードに降格し、SLAVEがライブラリから再検出されるのを待たないことを示します.プライマリ・ライブラリが再び検出され、SLAVEがライブラリからリカバリされると、自動的に半同期レプリケーション・モードに戻ります.)rpl_semi_sync_master_wait_no_slave:トランザクションがコミットされたが、MasterにSlave接続がない場合、Mは確認情報を受け取ることはできませんが、Mは時間制限の範囲内で待機し続けます.Slaveリンクがない場合は非同期コピーに切り替わります.(マスターが各トランザクションのコミットを許可するかどうかは、slaveの受信確認信号を待つ必要があります.デフォルトはonで、各トランザクションは待機します.offの場合、slaveが追いつくと、半同期レプリケーションモードも開かず、手動で開く必要があります.)Slave上:rpl_recovery_rank:slaveがライブラリからダウンタイムした後、Relay-LOgが破損し、一部の中継ログが処理されなかった場合、実行されていないrelay-logを自動的に放棄し、MASTERからログを再取得し、relay-logの完全性を保証します.デフォルトでは機能はオフですrelay_log_recoveryの値が1に設定されている場合、slaveでライブラリからこの機能をオンにできます.
mysql> show variables like '%rpl%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_recovery_rank | 0 |
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
5 rows in set (0.00 sec)
mysql> show variables like 'rpl%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_recovery_rank | 0 |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
3 rows in set (0.00 sec)
≪ステータス|Status|emdw≫:半同期レプリケーションであることをどのように認識しますか?
mysql> show global status like 'rpl_semi%';
+--------------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------------+--------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 40203 |
| Rpl_semi_sync_master_net_wait_time | 361832 |
| Rpl_semi_sync_master_net_waits | 9 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 402 |
| Rpl_semi_sync_master_tx_wait_time | 2011 |
| Rpl_semi_sync_master_tx_waits | 5 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 4 |
+--------------------------------------------+--------+
14 rows in set (0.00 sec)
mysql> show global status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
説明:Rpl_semi_sync_master_Clients:半同期レプリケーションをサポートおよび登録するリンクされたSlaveの数を説明します.Rpl_semi_sync_master_status:ONはアクティブ状態(半同期)、OFFは非アクティブ状態(非同期)、または彼が有効になっていないか、または非同期レプリケーション状態に復元されています.プライマリ・サーバが非同期レプリケーション・モードを使用しているか、半同期レプリケーション・モードを使用しているかを示すために使用します.Rpl_semi_sync_master_yes_tx:正常にコミットされた数.Rpl_semi_sync_master_no_tx:コミットに失敗した数.Rpl_semi_sync_slave_status:Slave上の半同期コピー状態、ONは有効、OFFは非アクティブ.テスト:レプリケーションが正常な場合、プライマリに1つ挿入すると、セカンダリに直接同期します.
mysql> insert into test1 values(1,'a');
Query OK, 1 row affected (0.12 sec)
もし意外なことがあったら、切ってから、それでは:
mysql> slave stop;
Query OK, 0 rows affected (0.11 sec)
mysql> show global status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF |
+----------------------------+-------+
1 row in set (0.00 sec)
mysql> insert into test1 values(2,'aa');
Query OK, 1 row affected (10.12 sec)
mysql> insert into test1 values(3,'aaa');
Query OK, 1 row affected (0.10 sec)
mysql> show global status like 'rpl_semi%';
+--------------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------------+--------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 32934 |
| Rpl_semi_sync_master_net_wait_time | 362277 |
| Rpl_semi_sync_master_net_waits | 11 |
| Rpl_semi_sync_master_no_times | 2 |
| Rpl_semi_sync_master_no_tx | 3 |
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 402 |
| Rpl_semi_sync_master_tx_wait_time | 2011 |
| Rpl_semi_sync_master_tx_waits | 5 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 5 |
+--------------------------------------------+--------+
最初の挿入、rpl_を受けるsemi_sync_master_timeoutパラメータの影響で、タイムアウトは10 s待ちました.2回目は、非同期レプリケーション(Rpl_semi_sync_master_status=OFF)に切り替えたので、この2つの挿入文は非半同期で実行されるので、Rpl_semi_sync_master_no_txは1から3に変わりました.再起動するか、クラッシュからの問題を修正します.
mysql> slave start;
Query OK, 0 rows affected (0.01 sec)
mysql> show global status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
主の場合:主は自動的に半同期をオンにします.
| Rpl_semi_sync_master_status | ON |
注意:上記の状況が頻繁に発生すると、プライマリの更新データが遅くなります.半同期レプリケーションと非同期レプリケーションの切り替えが頻繁であるため、プライマリは受信元の情報を頻繁に待機してタイムアウトする.
IOスレッドとSQLスレッドの問題:ログに記録されている情報:7:28:43[Note]Slave I/O thread:Start semi-sync replication to master...;IOスレッドに関連しています.SQLスレッドが切れたら.それはどうなるの?
:
mysql> set sql_log_bin =0;
Query OK, 0 rows affected (0.00 sec)
mysql> create table test2 like test1;
Query OK, 0 rows affected (0.14 sec)
mysql> set sql_log_bin =1;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table test2;
Query OK, 0 rows affected (0.07 sec)
:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.200.245
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 784
Relay_Log_File: mysqld2-relay-bin.000010
Relay_Log_Pos: 634
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1051
Last_Error: Error 'Unknown table 'test2'' on query. Default database: 'test'. Query: 'DROP TABLE `test2` /* generated by server */'
Skip_Counter: 0
Exec_Master_Log_Pos: 677
Relay_Log_Space: 1045
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1051
Last_SQL_Error: Error 'Unknown table 'test2'' on query. Default database: 'test'. Query: 'DROP TABLE `test2` /* generated by server */'
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
mysql> show global status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
SQLスレッドが間違っていても、半同期レプリケーションは切り替えられません.半同期レプリケーションがIO_とTHREADは直接関係があり、SQL_とTHREADは大丈夫です.すなわち、SLAVEは、relay-log中継ログが正しく実行されているかどうかにかかわらず、ライブラリからバイナリログを受信した後、マスターマスターマスターマスターに確認を与える.
まとめ:メリット:半同期レプリケーションはトランザクションの損失数を効果的に制限し、データの安全と一貫性をよりよく保証します.悪い点:非同期レプリケーションよりも更新、挿入、削除の速度が遅くなります.主に情報を返すステップが1つ増えたためです.例外が発生した場合:ネットワークの問題やデータベースの問題では、半同期レプリケーションと非同期レプリケーションが交互に切り替わり、プライマリ・ライブラリの更新、挿入、削除操作に影響します.
詳細については、http://hcymysql.blog.51cto.com/5223301/887938を参照してください.