おつかれさまです。Dです。
MariaDB10.5でのDBレプリケーションを試す機会があったので備忘録がてらに残しておきます。
環境
OS:AlmaLinux9
DB:MariaDB10.5
実際の導入
レプリケーションなのでA→Bみたいな感じで同期されます。OSやDBのインストールは完了している前提で記載します。
~マスターサーバーでの作業~
まずはMariaDBの設定追加を実施します。
# vi /etc/my.cnf.d/mariadb-server.cnf
# [mysqld] セクション内に追記してバイナリログを取得するようにします。
log-bin=mysql-bin
# サーバー ID を定義します。
server-id=101
設定変更したのでMariaDBの再起動を実施します。
# systemctl restart mariadb
# systemctl status mariadb
次にレプリケーション用のデータベースユーザーを作成します。
# mysql
※****の部分は設定したいパスワードを記載してください。
> grant replication slave on *.* to rep_user@'%' identified by '****';
> flush privileges;
~スレーブサーバーでの作業~
こちらもMariaDBへ設定を追加していきます。
# vi /etc/my.cnf.d/mariadb-server.cnf
# [mysqld] セクション内に追記してバイナリログを取得するようにします。
log-bin=mysql-bin
# サーバー ID を定義します。 (マスター側とは異なる IDを設定する必要があります。)
server-id=102
# スレーブなので読み取り専用の設定を入れます。
read_only=1
# 自身のホスト名を定義します。
report-host=dbrep.exmample.com
こちらも設定変更したのでMariaDBの再起動を実施します。
# systemctl restart mariadb
# systemctl status mariadb
~マスターサーバーでの作業~
マスターサーバーとスレーブサーバーのデータを合わせるためにバックアップを取得します。
※target-dirはバックアップファイルの出力先です。お好みに。
# mariabackup --backup --target-dir /home/hogehoge/mariadb_backup -u root
completed OK!と出ればOKです。バックアップしたデータはrsyncやscpなりでスレーブサーバーへ転送しておきます。
~スレーブサーバーでの作業~
スレーブサーバー側のデータ削除
# systemctl stop mariadb
# rm -rf /var/lib/mysql/*
マスターサーバーから転送したバックアップデータをお好みの場所に配置してリストアします。
リストア前チェック
# mariabackup --prepare --target-dir /home/hogehoge/mariadb_backup
リストア
# mariabackup --copy-back --target-dir /home/hogehoge/mariadb_backup
権限がリストア実行ユーザになってしまうので修正します。
# ls -la /var/lib/mysql/
# chown -R mysql. /var/lib/mysql
# ls -la /var/lib/mysql/
修正できたらMariaDBのサービスを起動します。
# systemctl start mariadb
マスターのバックアップデータからマスターログのFile値とPostion値を確認します。
# cat /home/hogehoge/mariadb_backup/xtrabackup_binlog_info
mysql-bin.000001 642 0-101-2
レプリケーションの設定を入れてレプリケーションを開始します。
# mysql
> change master to
master_host='*.*.*.*', ←マスターサーバーのIPアドレス
master_user='rep_user', ←事前に作成したレプリケーション用ユーザ
master_password='****', ←レプリケーション用ユーザのパスワード
master_log_file='mysql-bin.000001', ←xtrabackup_binlog_infoで確認した値
master_log_pos=642; ←xtrabackup_binlog_infoで確認した値
> start slave;
ステータスを確認します。表示がなかなか長いので割愛しますが、大事なところは「Slave_IO_Stateが "Waiting for master to send event" であること」と「Read_Master_Log_Pos 及び Exec_Master_Log_Pos が共に,マスター側のPosition と等しいこと」を確認してみてください。
> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: *.*.*.*
Master_User: repl_user
マスター側のPostionは以下のステータスコマンドで確認出来ます。
> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 642
Binlog_Do_DB:
Binlog_Ignore_DB:
ちゃんとレプリケーションされるか確認します。
データベース確認
> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)
プライマリでデータベースを作成してみる。
> CREATE DATABASE test;
再度、データベースを確認。マスター側問題無く作成されていますね。
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4rows in set (0.000 sec)
後はスレーブサーバーでデータベースを確認して作成されていれば成功です!
【まとめ】
いかがでしたでしょうか。意外と簡単に構築できるので、バックアップ機が欲しい時におすすめです。ちなみなのですが、スレーブサーバーは読み取り専用ですが、root権限では書き込みが出来てしまうので、間違えてスレーブサーバーへ更新しないように注意です。データの不整合が起こってしまうので、レプリケーションやり直しになります。。ではまた!