ローカルネットワーク内でMariaDBレプリケーション設定


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

さくらのクラウドサーバーで、MariaDBのレプリケーション設定を下記記事を参考に行いました。

ただ、スレーブ側にリストアする方法が若干異なるので、自分用メモとして残しておきます、

概要としては、さくらのクラウドのスイッチを介したローカルネットワーク内で、MariaDBをインストールしたサーバー(マスターサーバー・スレーブサーバー)2台を用意し、GTID(マスターで作成された各トランザクションの識別子)を使ってレプリケーション設定を行っています。

なお設定の流れを簡易的に記載しているため、細かい説明は省略しています。

前提条件

・CentoOS7
・MariaDB ver10.3
・スイッチ 1台
・MariaDBインストールサーバー(192.168.0.1)
・MariaDBインストールサーバー(192.168.0.2)
・ローカルネットワークの構築が完了している

マスター側でfirewallの許可設定

まず準備段階として、マスタ側のデータをスレーブ側に送るので、マスタ側でfirewallの許可設定が必要となります。

そのためマスタ側で、スレーブ側のプライベートIPアドレスである192.168.0.2のみの接続をfirewallコマンドで許可します。

# firewall-cmd --zone=public --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.2" service name="mysql" accept'
# firewall-cmd --reload

レプリケーションのみ権限を付与したユーザーを作成

マスター側でレプリケーションの権限を持ったユーザーを作成。(後にスレーブ側のマスタDB設定でユーザー情報を記述します)

MariaDB [(none)]> CREATE USER 'repl'@'localhost' IDENTIFIED BY 'repl';
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

マスター側にレプリケーション用のパラメーターを設定

マスター側なのでserver-idを1とし、任意のバイナリログ(レコード変更などの履歴)ファイル名とします。

# systemctl stop mariadb

# vi /etc/my.cnf.d/server.cnf
[mysqld]
server-id = 1    # スレーブと異なるサーバIDにする
log-bin=master-bin   # 任意のバイナリログファイル名
binlog-format = ROW 
log-slave-updates

# systemctl start mariadb

MariaDB [(none)]> SHOW VARIABLES LIKE 'server_id'; #server_idが設定されている確認

スレーブ側にレプリケーション用のパラメータを設定

スレーブ側なのでserver-idを2とし、任意のバイナリログファイル名とします。

# systemctl stop mariadb

# vi /etc/my.cnf.d/server.cnf

[mysqld]
server-id = 2        # マスターと異なるサーバIDにする
log-bin=slave-bin   # 任意のバイナリログファイル名
read_only # 読み込み専用 
log-slave-updates
# systemctl start mariadb

MariaDB [(none)]> SHOW VARIABLES LIKE 'server_id'; #server_idが設定されている確認

マスターDBのダンプファイル作成

レプリケーションの開始時のみ、手動でマスターのDB全体を、スレーブにコピーする必要があります。
そのため、マスターのDBのデータを保存するためにダンプ(データベースに含まれるテーブルなどの構造やデータを SQL 文の形式で保存すること)をして、適当なファイル(dump.sql)にデータを入れます。

# mysqldump --all-databases -u root -p --master-data=2 --single-transaction --routines > dump.sql

ダンプファイルのバイナリログファイル名とポジションを確認

GTIDを調べるための、バイナリログファイル名とポジションを確認

MariaDB [(none)]> SHOW MASTER STATUS; #File名とPosition番号を確認

マスタサーバーの現時点のGTIDを調べる

GTIDはx-x-xのような記載で、ドメインID + サーバID + サーバーごとのトランザクション番号の構成となっています。

MariaDB [(none)]> SELECT BINLOG_GTID_POS( “File名”, Position番号);

スレーブ側にGTIDを設定

このGTIDを目印として、レプリケーションを行います。

MariaDB [(none)]> SET GLOBAL gtid_slave_pos = ‘X-X-X’;

スレーブ側にリストア

マスター側のダンプファイルを、スレーブ側にコピーします。

# scp dump.sql [email protected]:dump.sql

スレーブ側でマスタサーバー設定とスレーブ開始設定

MariaDB> CHANGE MASTER TO
           → MASTER_HOST     = '192.168.0.1',
           → MASTER_USER     = 'repl',
           → MASTER_PASSWORD = 'replユーザのパスワード',
           → MASTER_USE_GTID = slave_pos;

MariaDB> START SLAVE;
MariaDB> SHOW SLAVE STATUS \G  #GTIDが合っているか、スレーブ起動がYESになっているかなど確認

最終確認

適当にデータベースを作ってみて、slave側でも反映されているか確認します。

MariaDB [(none)]> USE test;
MariaDB [(test)]> CREATE TABLE testTable(num int, name varchar(50));
MariaDB [(test)]> SHOW TABLES;