2&>1

AWSとかGCPとかGolangとかとか

keepalivedとmysqlで冗長構成組んだ1

目的

mysqlを冗長構成したいかつ節約(管理サーバとか置きたくない)

構成

冗長構成のためVIPを持てるツール「keepalived」を使用

mysqlと同居して構成

f:id:piyojir0:20200519201533j:plain

マスター1:192.168.1.1

マスター2:192.168.1.2

OS

# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

構築

もろもろ設定

両サーバで実行

  1. iptableの変更

マスター1とマスター2で双方向で3306ポートを開放

  1. 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-idauto_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の設定は次に。