ページ

2021年2月7日日曜日

【MySQL,MariaDB】 レプリケーションを設定する

データベースでマスタースレーブ型のレプリケーションを設定する方法を示す.
手元のラズパイ2台を使用するため,MariaDBで設定するが,基本的にはMySQLも同様の方法でできるはずだ.

データベースの初期設定手順は以下のエントリーを参照されたし.
WM×LI: Raspberry Pi にデータベースを構築する【MySQL,MariaDB】

【マスター側】


初めに設定ファイルを編集する.(server-id は任意の数字で構わないが,スレーブとは異なる値にする)
 /etc/mysql/mariadb.conf.d/50-server.cnf
 ----------------------------------------
 [mysqld]
 server-id=1    ←追記する
 log-bin        ←追記する

MariaDB にログインし,レプリケーション用のユーザーを作成する.
 MariaDB [(none)]> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
 MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

マスター情報が Empty であることを確認しておく.
 MariaDB [(none)]> SHOW MASTER STATUS\G;
 Empty set (0.001 sec)

Empty ではなく,マスター情報が表示された場合はマスター情報をリセットしておく.
 mysql> RESET MASTER;

MariaDB を再起動する.
 mysql> QUIT;
 $ sudo systemctl restart mysql

MariaDB に再ログインして,マスター情報を取得する.(ファイル名とポジションはスレーブ側の設定で使うのでメモる)
 MariaDB [(none)]> SHOW MASTER STATUS\G;
 *************************** 1. row ***************************
             File: mysqld-bin.000001
         Position: 329
     Binlog_Do_DB:
 Binlog_Ignore_DB:

この状態でマスター側はいったん置いておく.


【スレーブ側】


スレーブ側も,設定ファイルの編集から実施する.(replicate-do-db は同期するデータベースを記入する)
 /etc/mysql/mariadb.conf.d/50-server.cnf
 ----------------------------------------
 [mysqld]
 server-id=2             ←追記する
 replicate-do-db=repl_db ←追記する

MariaDBを再起動する.
 $ sudo systemctl restart mysql

MariaDBにログインして,スレーブ情報を表示する
 MariaDB [(none)]> SHOW SLAVE STATUS\G;
 Empty set (0.001 sec)

もし,Empty ではなく,スレーブ情報が色々と表示された場合は,スレーブを停止→リセットし,MySQLを再起動する.
 mysql> STOP SLAVE;
 mysql> RESET SLAVE;
 mysql> QUIT;
 $ sudo systemctl restart mysql

スレーブとして動作するための設定を CHANGE MASTER 文で実行する.
 MariaDB [(none)]> CHANGE MASTER TO
     -> MASTER_HOST='master',                 ←マスター側のホスト名orIPアドレス
     -> MASTER_USER='repl',
     -> MASTER_PASSWORD='repl',
     -> MASTER_LOG_FILE='mysqld-bin.000001',
     -> MASTER_LOG_POS=329;
 mysql> START SLAVE;

スレーブ情報を取得する.
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: master
                   Master_User: repl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysqld-bin.000001
           Read_Master_Log_Pos: 329
                Relay_Log_File: mysqld-relay-bin.000001
                 Relay_Log_Pos: 556
         Relay_Master_Log_File: mysqld-bin.000001
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB: repl_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: 329
 (以下,略)

多くの情報が表示されるが重要なことは以下の二点.
  • Slave_IO_Stateが "Waiting for master to send event" であること
  • Read_Master_Log_Pos 及び Exec_Master_Log_Pos が共に,マスター側のPosition と等しいこと



以上を確認できた場合,置いておいたマスター側に戻り,repl_db を作成する.
 MariaDB [(none)]> CREATE DATABASE repl_db;

再びスレーブ側でデータベースを確認すると,repl_db が作成されている(はず)
 MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| repl_db            | ← repl_dbが作成されている
+--------------------+

最後にマスター情報とスレーブ情報を再確認する.マスター情報のPosition,スレーブ情報のRead_Master_Log_Pos 及び Exec_Master_Log_Pos がそれぞれ増加していることがわかる.
 MariaDB [(none)]> SHOW MASTER STATUS\G;
 *************************** 1. row ***************************
             File: mysqld-bin.000002
         Position: 464
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 

 MariaDB [(none)]> SHOW SLAVE STATUS\G;
 *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: master
                    Master_User: repl
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: mysqld-bin.000001
            Read_Master_Log_Pos: 464
                 Relay_Log_File: mysqld-relay-bin.000001
                  Relay_Log_Pos: 691
          Relay_Master_Log_File: mysqld-bin.000001
               Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
                Replicate_Do_DB: repl_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: 464
 (以下,略)

マスター・スレーブ相互に同期したい場合は,同様の設定を逆向きに設定するだけ.

また,既存のデータベースのレプリケーションを作成する場合は,データを一旦エクスポートしてスレーブ側でインポートする必要がある.

0 件のコメント:

コメントを投稿