はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
最近、ネットワークだけでなくセキュリティやデータベース、AI、DNSといった異なる分野の勉強もしているので、そのアウトプットをちょいちょいしていきたいと思います。
レプリケーションとは?
レプリケーションとは?
レプリケーションとは、「同じデータを持った複数のデータベースによる可用性向上や負荷分散手法の1つ」です。

レプリケーションは、主に更新可能な「マスタデータベース」と読込のみ可能な「スレーブデータベース」の2種類があります。
レプリケーション方法
レプリケーションの方法には、「シングルマスタ」と「マルチマスタ」の2つがあります。
シングルマスタ
主に「シングルマスタ」が用いられることが多く、これは「マスターデータベースが1つ、その他は読み取り専用のスレーブデータベース」の構成です。
マスターデータベースが1つのため、データの一貫性は保てますが、アプリケーション側の設計考慮が必要となり、処理速度の低下がデメリットとなります。

マルチマスタ
もう1つは、複数のマスターデータベースを構成する「マルチマスタ」があります。

レプレケーションの構築方法
今回、シングルマスタでのレプリケーションを構築してみたので、その方法を紹介します。
Step1:マスタDBの設定
最初に実施することは、マスタDB側の「my.cnf」の変更です。
MariaDBを使っている場合は「 /etc/mysql/mariadb.conf.d/50-server.cnf」の場合もあります。
変更内容は以下の3行となります。(特にserver-id)
[mysqld]
server-id = 1 #DBに紐づけるサーバID指定
log_bin = /var/log/mysql/mysql-bin.log
bind-address = 10.1.1.1 #DBに紐づけるIPアドレスの指定

Bind-AddressはSlave DBからアクセスする際に指定するIPアドレスです!
上記設定を終えた後はスレーブDBがアクセスするためのユーザを作成します。
mysql> CREATE USER 'ユーザ名'@'アクセスで利用するアドレス' IDENTIFIED BY 'パスワード';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'ユーザ名'@'アクセスで利用するアドレス';
上記コマンドで登録することで完了します。
イメージがつきにくいと思うので、具体例も記載したいと思います。
mysql> CREATE USER 'daimaru'@'10.1.1.1' IDENTIFIED BY 'daimaru_passwd';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'daimaru'@'10.1.1.1';
この設定ではスレーブDBから「ユーザ:daimaru、宛先:10.1.1.1」のアクセスに対するユーザを作成することになります。
そして、設定を終えた後は、バックアップ用のDBを作成します。
mysqldump -u root -p<root用パスワード> -x --all-databases > "バックアップファイル名.sql"
上記でバックアップ用DBを作成後は、このバックアップファイルをスレーブDBに転送し、スレーブDBを構築するサーバにログインします。
Step2:スレーブDBの設定
マスタDBの設定を終えた後は「スレーブDBの設定」になります。
最初に行うべきことは、こちらも「my.cnf」の設定変更になります。
こちらも基本的に変更内容は同じですが、server-idのID値とスレーブDBと認識させるための「read-only」が異なる点となります。
[mysqld]
server-id = 2 #DBに紐づけるサーバID指定
log_bin = /var/log/mysql/mysql-bin.log
read_only
上記設定を終えた後は、マスタDBでバックアップ生成したファイルをリストアします。
mysql -u root -p<rootパスワード> < バックアップファイル名.sql
リストア後にやるべきことは「スレーブDBの設定」です。
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.1.1.1', #マスタDBのIPアドレス指定(今回の例では10.1.1.1)
-> MASTER_PORT=3306, #マスタDBのポート番号指定(デフォルトは3306)
-> MASTER_USER='repl', #マスタDBアクセス用のユーザ名
-> MASTER_PASSWORD='repl9999', #上記ユーザのパスワード指定
-> MASTER_LOG_POS=1277; #マスタDBのPOS番号指定
「MASTER_LOG_POS」で指定する番号は、マスタDB側で以下コマンドで確認することができます。
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000317 | 1043 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.000 sec)
上記設定後は、「mysql> START SLAVE;」でSLAVEDBとして起動させます。
これでマスタDBとスレーブDBの構築は完了です。
最後にスレーブDBの状態確認を行います。
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.1.1
Master_User: daimaru
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000317
Read_Master_Log_Pos: 1043
Relay_Log_File: mysqld-relay-bin.000627
Relay_Log_Pos: 1342
Relay_Master_Log_File: mysql-bin.000317
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master_Server_Id: 1
Parallel_Mode: optimistic
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 1450
1 row in set (0.000 sec)
上記の状態であれば、問題なしとなります。
最後に
今回の構築方法の紹介はいかがでしたか?
ネットワークだけでなく様々な分野についてもちょっとずつ勉強したことをアウトプットしていきたいと思います。
もしみなさんの参考になれれば幸いです。
