MariaDB10.5でのDBレプリケーション

D
2025-02-26
2025-02-26

 

おつかれさまです。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権限では書き込みが出来てしまうので、間違えてスレーブサーバーへ更新しないように注意です。データの不整合が起こってしまうので、レプリケーションやり直しになります。。ではまた!