Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL5.5 Semisynchronous Replicationを試してみる ~構築編

logomysql

MySQLの強力なレプリケーションが、さらに強力になりました!!通常の非同期レプリケーションに加え、新たに半同期レプリケーション(Semisynchronous Replication)が追加になったわけです。非同期ですら充分満足のいく機能だったのに、半同期が追加されたことにより、さらに信頼性の高いレプリケーションになったわけです。はい・・。

といってもどのような設定で、どう非同期と違うのかわからない・・・。

わからないままだとなんか損をしそうな気がしましたので、設定をしてみました。

★環境 以下の環境でテストしました。尚、マスターとスレーブのデータベースのデータ同期は、予めとってることを前提に話を進めます

【マスター】 HOST: 192.168.101.42 OS: CENTOS 5.5 64bit MEM: 1GB MySQL : Server version: 5.5.12-log MySQL Community Server (GPL) データベース :

[sql] +--------------------+ | Database           | +--------------------+ | information_schema | | gis                | | mysql              | | performance_schema | | squad_cacti        | | squad_redmine      | | squad_wordpress    | +--------------------+ [/sql]

【スレーブ】 HOST: 192.168.101.43 OS: CENTOS 5.5 64bit MEM: 1GB MySQL : Server version: 5.5.12-log MySQL Community Server (GPL) データベース :

[sql] +--------------------+ | Database           | +--------------------+ | information_schema | | gis                | | mysql              | | performance_schema | | squad_cacti        | | squad_redmine      | | squad_wordpress    | +--------------------+ [/sql]

★事前設定

【マスタ側の設定】

プラグインのインストール

[sql] mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.16 sec) [/sql]

正常にプラグインが設定されたか確認する

[sql] mysql> show plugins; +-----------------------+----------+--------------------+--------------------+---------+ | Name                  | Status   | Type               | Library            | License | +-----------------------+----------+--------------------+--------------------+---------+ | rpl_semi_sync_master  | ACTIVE   | REPLICATION        | semisync_master.so | GPL     | +-----------------------+----------+--------------------+--------------------+---------+ 21 rows in set (0.00 sec) [/sql]

コミット単位で、ログに書き出す設定になっているか確認する

[sql] mysql> show variables like 'innodb_flush_log_at_trx_commit'; +--------------------------------+-------+ | Variable_name                  | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 1     | +--------------------------------+-------+ 1 row in set (0.00 sec) [/sql]

基本的に1がデフォルトですが、そうじゃない場合は、my.cnf に以下の一文を加えてください。

[sql]

innodb_flush_log_at_trx_commitは、InnoDBのログバッファ

(注3)をInnoDBログファイル(注4)に書き込むタイミングと、

InnoDBログファイルをディスクにフラッシュするタイミングとを指定するパラメータです。

--------------------------------------------------------------------

設定値 ログバッファ→ログファイル ディスクフラッシュ

--------------------------------------------------------------------

0      毎秒                       毎秒

1     (初期値)                  COMMIT時 COMMIT時

2      COMMIT時                   毎秒

--------------------------------------------------------------------

innodb_flush_log_at_trx_commit = 1 [/sql]

サーバ変数がどのようになっているか確認する

[sql] 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_no_slave | ON    | +------------------------------------+-------+ 4 rows in set (0.00 sec) [/sql]

上記から ・rpl_semi_sync_master_enabledが"OFF"になっていることが確認できるため、設定を変更する、また、rpl_semi_sync_master_timeoutの値が多きすぎるので、これも減らしてみます。set コマンドで値は設定できるか、次回起動時に忘れがちになってしまうので、再びmy.cnfを編集に以下の2項目を追加する [sql]

Semisynchronous Replication の設定(MASTER)

rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10 [/sql]

mysqlを再起動し、設定が反映されているか確認する [sql] mysql> show variables like '%semi%'; +------------------------------------+-------+ | Variable_name                      | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled       | ON    | | rpl_semi_sync_master_timeout       | 10    | | rpl_semi_sync_master_trace_level   | 32    | | rpl_semi_sync_master_wait_no_slave | ON    | +------------------------------------+-------+ 4 rows in set (0.00 sec) [/sql]

* ちゃんと設定は反映されているようです

・マスタのポジションを確認しておく [sql] mysql> show master status; +------------------+----------+--------------+------------------+ | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 |      107 |              |                  | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) [/sql]

【SLAVE側の設定】 [sql]

mysql -u root -prootpassword

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.16 sec) [/sql]

正常にプラグインが設定されたか確認する [sql] mysql> show plugins; +-----------------------+----------+--------------------+-------------------+---------+ | Name                  | Status   | Type               | Library           | License | +-----------------------+----------+--------------------+-------------------+---------+ | rpl_semi_sync_slave   | ACTIVE   | REPLICATION        | semisync_slave.so | GPL     | +-----------------------+----------+--------------------+-------------------+---------+ [/sql] コミット単位で、ログに書き出す設定になっているか確認する [sql] mysql> show variables like 'innodb_flush_log_at_trx_commit'; +--------------------------------+-------+ | Variable_name                  | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 1     | +--------------------------------+-------+ 1 row in set (0.00 sec) [/sql]

基本的に1がデフォルトですが、そうじゃない場合は、my.cnf に以下の一文を加えてください。

[sql]

innodb_flush_log_at_trx_commitは、InnoDBのログバッファ

(注3)をInnoDBログファイル(注4)に書き込むタイミングと、

InnoDBログファイルをディスクにフラッシュするタイミングとを指定するパラメータです。

--------------------------------------------------------------------

設定値 ログバッファ→ログファイル ディスクフラッシュ

--------------------------------------------------------------------

0      毎秒                       毎秒

1     (初期値)                  COMMIT時 COMMIT時

2      COMMIT時                   毎秒

--------------------------------------------------------------------

innodb_flush_log_at_trx_commit = 1 [/sql]

my.cnfにスレーブの設定を入れる [sql]

スレーブの設定

rpl_semi_sync_slave_enabled=1

サーバ変数がどのようになっているか確認する mysql> show variables like '%semi%'; +---------------------------------+-------+ | Variable_name                   | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled     | ON    | | rpl_semi_sync_slave_trace_level | 32    | +---------------------------------+-------+ 2 rows in set (0.00 sec) [/sql]

レプリケーションの開始 ここまでできれば、後は、通常のMySQLレプリケーションと同じですが、念のため書いておきます、尚、マスターとスレーブ間のデータベースでデータの内容をそろえていることを基準に手順を記載します

【マスタ側の設定】 ・ポジションの確認 [sql] mysql> show master status; +------------------+----------+--------------+------------------+ | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 |      107 |              |                  | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) [/sql] 【スレーブ側の設定】 上記マスタ側で確認したポジションをSLAVE側に設定します [sql] mysql > CHANGE MASTER TO MASTER_HOST='192.168.101.42', MASTER_USER='slave', MASTER_PASSWORD='slavepassword', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=107;

mysql> start slave; Query OK, 0 rows affected (0.02 sec) [/sql]

正常にレプリケーションされていることを確認する [sql] mysql> show slave status\G 1. row Slave_IO_State: Waiting for master to send event Master_Host: 192.168.101.42 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 107 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes [/sql] ★レプリケーション動作確認 レプリケーションが正常に行われているかテストする。 【マスター側】 [sql] mysql> create database test; Query OK, 1 row affected (0.00 sec)

mysql> use test Database changed mysql> create table t1 (id int,detail char(100)); Query OK, 0 rows affected (0.06 sec)

mysql> insert into t1 values(1,'test1'); Query OK, 1 row affected (0.03 sec) [/sql]

【スレーブ側】 [sql] mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t1             | +----------------+ 1 row in set (0.00 sec)

mysql> select * from t1; +------+--------+ | id   | detail | +------+--------+ |    1 | test1  | +------+--------+ 1 row in set (0.04 sec) [/sql]

レプリケーションが正常なことを確認済み。ただし、これだと、別に非同期のレプリケーションと変わらないじゃんという話になってしまうので、Semisynchronous Replication (半同期レプリケーション)の特性を確認してみる

特性・・・入れては見たものの・・・あれ?よくわからない・・・ここのページが大変参考になってので自分なりに解釈してみる

http://d.hatena.ne.jp/sakaik/20091217/mysql_semi_synchronous_replication

かいつまんで、本当に自分なりの解釈ですと、マスターが仮にダウンしたとしてもスレーブとの同期がとれるところを保障するといった意味になるのでしょうか?商用DBでいうところの参照可能な、HA構成と言えるかもしれません。今の商用DBがどうだかは知りませんが、Active,Standbyの構成で、Standby側が参照することすらできなかったわけなのですが、そういう意味では参照用にも利用できて、且つHAにも使えるといった印象でした。リソースの有効活用ができますね。

※半同期の前に、非同期の意味がよくわからないので、その検証はまた次回ということで・・・。