目的
mysqlを冗長構成したいかつ節約(管理サーバとか置きたくない)
構成
冗長構成のためVIPを持てるツール「keepalived」を使用
mysqlと同居して構成
マスター1:192.168.1.1
マスター2:192.168.1.2
OS
# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core)
構築
もろもろ設定
両サーバで実行
- iptableの変更
マスター1とマスター2で双方向で3306ポートを開放
- SElLinux の無効化
keepalived
両サーバで実行
# yum install keepalived # yum list | grep keepalived keepalived.x86_64 1.3.5-16.el7 @base
mysql
両サーバで実行
# yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y # yum-config-manager --disable mysql80-community # yum-config-manager --enable mysql57-community # yum info mysql-community-server # yum install mysql-community-server -y
# mysqld --version mysqld Ver 5.7.30 for Linux on x86_64 (MySQL Community Server (GPL))
# systemctl start mysqld.service 初期パスワード確認 # cat /var/log/mysqld.log | grep password 最初のDB初期化 # mysql_secure_installation
この辺の詳細は割愛
Mysqlの双方向レプリケーション設定
今回はmaster/slave構成ではなくマルチmaster構成となる双方向レプリケーションを行います。
master/slave構成だとslaveからmasterへのファイルオーバー構成が必要になるからです。
マスター1の設定
/etc/my.chf
# 各MySQLサーバを識別するためのIDの設定 server-id=1 # GTIDの有効化 gtid_mode=ON # GTIDと併用できないSQL文を禁止する enforce_gtid_consistency # バイナリログの有効化 log_bin=mysql-bin # バイナリログをコミットと同時にディスクに書込む sync_binlog=1 # 基本設定 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 文字コードの設定 character-set-server=utf8 skip-character-set-client-handshake # タイムスタンンプ関連の設定 log_timestamps=SYSTEM explicit_defaults_for_timestamp=TRUE # スロークエリログの設定 slow_query_log=ON long_query_time=1.0 slow_query_log_file=/var/log/mysql/slow_query.log log-error=/var/log/mysql/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # Auto Increment auto_increment_increment=5 auto_increment_offset=1 [client] default-character-set=utf8mb4
マスター2の設定
/etc/my.chf
[mysqld] # 各MySQLサーバを識別するためのIDの設定 server-id=2 # スレーブSQLスレッドによって実行される更新をバイナリログに書き込む log_slave_updates # リレーログファイルの名前 relay_log=mysql-relay-bin # クラッシュセーフなレプリケーション設定 relay_log_info_repository=TABLE relay_log_recovery=ON relay_log_purge=ON # GTIDの有効化 gtid_mode=ON # GTIDと併用できないSQL文を禁止する enforce_gtid_consistency # バイナリログの有効化 log_bin=mysql-bin # バイナリログをコミットと同時にディスクに書込む sync_binlog=1 # 基本設定 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 文字コードの設定 character-set-server=utf8 skip-character-set-client-handshake # タイムスタンンプ関連の設定 log_timestamps=SYSTEM explicit_defaults_for_timestamp=TRUE # スロークエリログの設定 slow_query_log=ON long_query_time=1.0 slow_query_log_file=/var/log/mysql/slow_query.log log-error=/var/log/mysql/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # Auto Increment auto_increment_increment=5 auto_increment_offset=2 [client] default-character-set=utf8mb4
server-id
とauto_increment_offset
はそれぞれ違います。
ログ出力をデフォルトから変更してますので以下が必要
# mkdir /var/log/mysql # chown mysql:mysql /var/log/mysql
最後にmysqlを再起動
systemctl restart mysqld.service
レプリケーションユーザー作成(マスター1)
# mysql -uroot -p ユーザー作成(IPは適宜変更) # GRANT REPLICATION SLAVE ON *.* TO repl@192.168.1.2 IDENTIFIED BY '<パスワード>'; 作成されたの確認 # SELECT user,host FROM mysql.user;
マスター1のDBバックアップ取得
mysqldump -u root -p \ --single-transaction \ --flush-logs \ --master-data=2 \ --all-databases \ --hex-blob \ --triggers \ --routines \ --events > master_db.sql
バックアップしたファイルをマスター2へ移動
scp master_db.sql user@192.168.1.2:/tmp
マスター2でデータ読み込みとレプリケーション
# mysql -u root -p # RESET MASTER; # exit # mysql -u root -p < /tmp/master_db.sql
GTIDを使用したレプリケーションなのでポジション設定は簡単です。
# mysql -u root -p
CHANGE MASTER TO MASTER_HOST='192.168.1.1', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='<パスワード>', MASTER_AUTO_POSITION=1;
START SLAVE;
レプリケーションの確認(2つYESが並べば成功)
# SHOW SLAVE STATUS\G (略) Slave_IO_Running: Yes Slave_SQL_Running: Yes (略)
レプリケーションユーザー作成(マスター2)
# mysql -uroot -p ユーザー作成(IPは適宜変更) # GRANT REPLICATION SLAVE ON *.* TO repl@192.168.1.1 IDENTIFIED BY '<パスワード>'; 作成されたの確認 # SELECT user,host FROM mysql.user;
マスター1でレプリケーション
# mysql -uroot -p
CHANGE MASTER TO MASTER_HOST='192.168.1.2', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='<パスワード>', MASTER_AUTO_POSITION=1;
START SLAVE;
レプリケーションの確認(2つYESが並べば成功)
# SHOW SLAVE STATUS\G (略) Slave_IO_Running: Yes Slave_SQL_Running: Yes (略)
これで双方向レプリケーションができてるかと思います。
keepalivedの設定は次に。