maatkitでレプリケーションデータの整合性を確認

raymanです。

MySQLでレプリケーションを行うことはよくあるかと思います。
今回紹介するのはmaatkitでdatabaseの整合性チェックを行うツールです。

作業難易度 ★☆☆☆☆
作業危険度 ★★☆☆☆
実績度 ★★★☆☆
作業Step数 3 Steps

評価★について


作業内容
まず大前提にMySQLでレプリケーションされているからデータの整合性がとれているとは限りません。
Slaveがread onlyになっていない場合はSlaveに書き込みができてしまい整合性がとれなくなってしまいます。「Slave_IO_Running」「Slave_SQL_Running」が「Yes」でも整合性が取れていない場合があるのです。

そこで今回はMaster側のデータとSlave側のデータの整合性がとれているかチェックを行う作業をします。
maatkitには色々ツールがあるのですが今回紹介するのはmk-table-checksumです。

下記図のように動作し、テーブル整合性チェックを行います。

1. Master側テーブルのハッシュ値をchecksumクエリにて取得します。

2. MasterからSlaveにレプリケーションされます。

3. レプリケーションされたクエリがSlave で実行され、 Slave側でのchecksumクエリ結果が更新されます。

作業手順
▼Step 0
MySQLのレプリケーションができている状態である事を前提とします。
またmaatkitのインストールは下記URLを参照してください。
http://www.maatkit.org/download

▼Step 1
まずMaster側にchecksumを行うデータベースとテーブルを作成します

user@RHEMS:# mysql
mysql> create database maatkit;
Query OK, 1 row affected (0.03 sec)

mysql> use maatkit
Database changed
mysql> CREATE TABLE checksum (
-> db char(64) NOT NULL,
-> tbl char(64) NOT NULL,
-> chunk int NOT NULL,
-> boundaries char(100) NOT NULL,
-> this_crc char(40) NOT NULL,
-> this_cnt int NOT NULL,
-> master_crc char(40) NULL,
-> master_cnt int NULL,
-> ts timestamp NOT NULL,
-> PRIMARY KEY (db, tbl, chunk)
-> );

Query OK, 0 rows affected (0.57 sec)

mysql> show tables;
+-------------------+
| Tables_in_maatkit |
+-------------------+
| checksum |
+-------------------+
1 row in set (0.01 sec)

mysql>

▼Step 2
データーベース内の各テーブルのデータをMD5でハッシュをとります。
今回のテストではsample_databaseを対象にしています。
“–databases”を外せば全てのdatabaseを確認できます。
(SUPER 権限で作業を行うでread onlyのslaveでもslave側に書き込みができるようになります)

user@RHEMS:# mk-table-checksum --replicate=maatkit.checksum h=MasterServerIP,p=MasterPassword --create-replicate-table --databases=sample_database
DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG
sample_database board 0 ***.***.***.*** MyISAM 1 9a812884 0 NULL NULL NULL
sample_database messages 0 ***.***.***.*** MyISAM 2 59602b5c 0 NULL NULL NULL
sample_database thread 0 ***.***.***.*** MyISAM 1 a7ccb2c3 0 NULL NULL NULL

▼Step 3
Master/Slaveのdiffを取り何も出力されなければ整合性がとれていることになります

user@RHEMS:# diff <(mysql -hMasterServerIP -pMasterPassword -e "select * from maatkit.checksum;") <(mysql -hSlaveServerIP -pSlavePassword -e "select * from maatkit.checksum;")
user@RHEMS:#



作業検証者からの一言
今回はMasterのデーターベスの中身がSlaveと整合性がとれているか確認をしました。
mk-table-checksumではMasterの既存テーブルの整合性しか確認しません。なのでSlaveに新しくテーブルを作成しても不整合としては検知されません。

Leave a Comment