はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
最近、ネットワークだけでなくセキュリティやデータベース、AI、DNSといった異なる分野の勉強もしているので、そのアウトプットをちょいちょいしていきたいと思います。
そもそもレプリケーションとは?
レプリケーションとは「データベースの複製化」
そもそもレプリケーションとは何か?
レプレケーションとは「複数のデータベースを用いた可用性向上や負荷分散のための手法の1つ」です。
レプリケーションは、主に更新可能な「マスタデータベース」と読込のみ可能な「スレーブデータベース」の2種類があります。
2種類のレプリケーション「シングルマスタ」と「マルチマスタ」
レプリケーションで主に用いられる構成は「シングルマスタ」になります。
これは「マスタデータベースが1つ、その他はスレーブデータベース」の構成です。
この手法では更新可能なデータベースが1つのため、一貫性の担保は容易になります。
一方、データベースの更新は1つのため、アプリケーション側での考慮が必要となり、処理速度の低下等のデメリットもあります。
一方、複数のマスタデータベースで構成する「マルチマスタ」もあります。
これは「マスタデータベースを複数構築し運用する手法」のため、先程の「シングルマスタ」のメリット・デメリットを逆転させた効果があります。
今回の構築では、「シングルマスタ」かつ「ウォームスタンバイ」の状態で構築していきます。
レプレケーションの構築方法
今回構築したレプリケーションの方法を紹介していきたいと思います。
スレーブ側のDB初期設定等の説明は、本記事の目的とは異なるため、割愛します。
Step1:マスタ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アドレスの指定
上記設定を終えた後はスレーブ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='192.168.1.2', #マスタ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)
上記の状態であれば、問題なしとなります。
最後に
今回の構築方法の紹介はいかがでしたか?
ネットワークだけでなく様々な分野についてもちょっとずつ勉強したことをアウトプットしていきたいと思います。
もしみなさんの参考になれれば幸いです。