Linux Blog

CentOS7でLinuxサーバー構築

TOP » サーバー構築 » Mroonga »

MariaDB(MySQL)のレプリケーションの設定

MariaDB(MySQL)のレプリケーションとは、MasterとSlaveに役割に分けてMasterとなっているデータベースの内容が、Slaveのデータベースに反映されるというものです。

まずはレプリケーション用のユーザーを作ります。ここからの作業はマスターサーバー側(運用するうえでデータベースを操作する側)のマシンで行います。

mysql -u root -p********
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.0/255.255.255.0' IDENTIFIED BY '********';

マスターサーバのmy.cnfを編集して[mysqld]の箇所に以下の3行を追加します。

vi /etc/my.cnf
[mysqld]
...
log-bin=mysql-bin #レプリケーションに必要なバイナリログを有効にする
server-id=1001 #レプリケーションを構成するサーバー内で被らないように割り振る
expire_logs_days=5 #バイナリログの保存日数(レプリケーションに間が空いた時に復旧できるようにする期間を指定)

マスター側のMariaDB(MySQL)を再起動します。

service mariadb restart

続いてマスター側で読み書きロックを行います。

mysql -u root -p********
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.52 sec)

バイナリログのFileとPositionを確認します。

MariaDB [(none)]> SHOW MASTER STATUS;
Empty set (0.00 sec) +---------------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------------------+----------+--------------+------------------+ | example-replication.000002 | 98 | | | +---------------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)

これまでバイナリロギングをおこなわない状態で、マスタが稼動していた場合は以下のようになる可能性があります。この場合、Fileは""(空文字)でPositionは4とります。

mysqldump でマスターのDBをファイルに書き出します。

mysqldump -u root -p******** --all-databases --lock-all-tables > dbdump.db

読み書きロックを解除します。

mysql -u root -p********
MariaDB [(none)]> UNLOCK TABLES;

マスター側の設定は以上で終わりです。
続いてスレーブ側(コピーされる側)のマシンで設定を行います。

スレーブ側もmy.cnfを修正します。下記を追加します。

vi /etc/my.cnf
...
[mysqld]
server-id=1002
read_only

スレーブ側のMariaDB(MySQL)を再起動します。

service mariadb restart

マスターで書き出したデーターを復元します。

mysql --user=root -p******** < dbdump.db

マスター側のホストとポート番号、レプリケーションのユーザーとパスワード、マスター側の設定で確認したバイナリログのFileとPositionを設定します。

mysql -u root -p********
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.0.11', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='********', MASTER_LOG_FILE='', MASTER_LOG_POS=4;
Query OK, 0 rows affected (0.04 sec)

スレーブ機能をSTARTします。

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

以上でレプリケーションの設定は完了です。
レプリケーションが稼働していることを確認するために以下のことを試してみましょう。

マスターでSHOW MASTER STATUSクエリを実行し、バイナリログのFileとPositionを確認します。

mysql -u root -p********
MariaDB [mysql]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000187 | 45208 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)

スレーブでSHOW SLAVE STATUSクエリを実行し、以下のことを確認します。
Slave_IO_RunningとSlave_SQL_RunningがYesになっていることと、Master_Log_FileRead_Master_Log_Posがマスターで確認したFileとPositionに一致していることを確認します。

mysql -u root -p********
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.241 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000187 Read_Master_Log_Pos: 45208 Relay_Log_File: mysql-slave-relay-bin.000006 Relay_Log_Pos: 45495 Relay_Master_Log_File: mysql-bin.000187 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 45208 Relay_Log_Space: 46163 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: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: 1 row in set (0.00 sec)

スレーブ機能を解除する方法はスレーブ側で以下のように実行します。

mysql -u root -p********
MariaDB [mysql]> STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='';

または以下の方法でも可。

mysql -u root -p********
STOP SLAVE;
RESET SLAVE;

スレーブ側のMariaDB(MySQL)を再起動します。

service mariadb restart

最後にマスタ側でレプリケーション権限のユーザを削除します。

mysql -u root -p********
MariaDB [mysql]> drop user 'repl'@'192.168.0.0/255.255.255.0';

コメントを残す