初認識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でライブラリからこの機能をオンにできます.
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を参照してください.