まとめてみる
元記事
前提
- 環境は元記事と同じ
- MariaDB はインストール済み
- mysql_secure_installation は実施済み
- host と username と password を extra file に記述している
チョットだけ環境
Master
key | value |
---|---|
IP | 192.168.100.102 |
HOST NAME | radius0 |
server_id | 1 |
Slave
key | value |
---|---|
IP | 192.168.100.103 |
HOST NAME | radius1 |
server_id | 2 |
server_id で 1
, 2
を使わないほうがいいという意見も見かけるので本番では変える
Firewall 設定 (Master, Slave 両方)
sudo firewall-cmd --list-all sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --add-port=4567/tcp --permanent sudo firewall-cmd --add-port=4444/tcp --permanent sudo firewall-cmd --reload sudo firewall-cmd --list-all
Replication の準備
Master の設定
sudo cp -av /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf.$(date +%F_%H-%M-%S) sudo vim /etc/my.cnf.d/server.cnf
--- /etc/my.cnf.d/server.cnf.2021-06-13_12-20-30 2021-05-06 06:00:20.000000000 +0900 +++ /etc/my.cnf.d/server.cnf 2021-06-13 12:25:26.852880021 +0900 @@ -10,6 +10,8 @@ # this is only for the mysqld standalone daemon [mysqld] +log-bin +server_id=1 # # * Galera-related settings
mariadb の再起動
sudo systemctl restart mariadb.service sudo systemctl status mariadb.service | grep -iE "Active|PID"
replication_user を作る
mysql --defaults-extra-file=mariadb_root.cnf CREATE USER 'replication_user'@'%' IDENTIFIED BY 'bigs3cret'; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; QUIT;
Slave の設定
sudo cp -aiv /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf.$(date +%F_%H-%M-%S) sudo vim /etc/my.cnf.d/server.cnf
sudo vim /etc/my.cnf.d/server.cnf --- /etc/my.cnf.d/server.cnf.2021-06-13_12-43-25 2021-05-06 06:00:20.000000000 +0900 +++ /etc/my.cnf.d/server.cnf 2021-06-13 12:43:55.141704371 +0900 @@ -10,6 +10,8 @@ # this is only for the mysqld standalone daemon [mysqld] +log-bin +server_id=2 # # * Galera-related settings
mariadb の再起動
sudo systemctl restart mariadb.service sudo systemctl status mariadb.service | grep -iE "Active|PID"
replication_user を作る
mysql --defaults-extra-file=mariadb_root.cnf CREATE USER 'replication_user'@'%' IDENTIFIED BY 'bigs3cret'; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; QUIT;
Master の書き込みを止めてバックアップする
mysql --defaults-extra-file=mariadb_root.cnf
FLUSH TABLES WITH READ LOCK;
FLUSH TABLES
をしたターミナルは起動しっぱなしで!
別ターミナルを開いてバックアップする
mysqldump --defaults-extra-file=mariadb_root.cnf --all-databases \ --flush-logs --single-transaction --master-data=2 > \ all_databases_on_master_$(date +%F_%H-%M-%S).sql
SLAVE にバックアップデータを転送
sftp <username>@<ip address> put <file name> exit
SLAVE でデータをリストア
mysql --defaults-extra-file=mariadb_root.cnf < <file name>
MASTER のデータを得る
SHOW MASTER STATUS;
SELECT @@global.gtid_binlog_pos;
Sample
MariaDB [(none)]> SHOW MASTER STATUS; +--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | radius1-bin.000001 | 1402844 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec) MariaDB [(none)]> SELECT @@global.gtid_binlog_pos; +--------------------------+ | @@global.gtid_binlog_pos | +--------------------------+ | 0-2-157 | +--------------------------+ 1 row in set (0.001 sec) MariaDB [(none)]>
SLAVE で CHANGE MASTER TO
する
Sample の値を使うと以下のようになる。環境に合わせて適宜変更する
CHANGE MASTER TO MASTER_HOST='192.168.100.102', MASTER_USER='replication_user', MASTER_PASSWORD='bigs3cret', MASTER_PORT=3306, MASTER_LOG_FILE='radius1-bin.00001', MASTER_LOG_POS=1402844, MASTER_CONNECT_RETRY=10, MASTER_USE_GTID=slave_pos;
SLAVE で START SLAVE
する
START SLAVE;
確認
SHOW SLAVE STATUS\G
出力の一部が以下のようになっていること
Slave_IO_Running: Yes Slave_SQL_Running: Yes
これで片方向レプリケーション出来た
MASTER のロックしたテーブルを UNLOCK する
UNLOCK TABLES;
Failover
手動で master を止める
バックアップした時の要領ですすめる
まず、 MASTER を読み取り専用にする
FLUSH TABLES WITH READ LOCK;
同期していた かつ MASTER を読み取り専用にしたので特にバックアップを採る必要はないだろうが、不安ならとること。その際は別ターミナルでやること
mysqldump --defaults-extra-file=mariadb_root.cnf --all-databases \ --flush-logs --single-transaction --master-data=2 > \ all_databases_$(date +%F_%H-%M-%S).sql
MASTER で現在のポジションを確認する
SHOW MASTER STATUS;
SELECT @@global.gtid_binlog_pos;
SLAVE 側でも同じポジションになるのを待つ
SHOW SLAVE STATUS\G
Read_Master_Log_Pos
の値を確認すること
Exec_Master_Log_Pos
の値を確認すること
SLAVE の状態が MASTER と同期しなかったらバックアップから復元する
mysql --defaults-extra-file=mariadb_root.cnf < FILENAME
SLAVE が最新の状態になったらマスターをダウンさせる
MASTER をダウンさせる
SHUTDOWN; QUIT;
SLAVE を new MASTER にする
STOP ALL SLAVES; RESET SLAVE ALL; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; SELECT @@global.gtid_binlog_pos; SET @@global.read_only=0;
RESET SLAVE ALL
でおそらく MASTER が変わっている
MASTER になった瞬間に書き込みに来られても困るのでその次の瞬間に READ LOCK
している
ほかに SLAVE が居る場合以下のコマンドで new MASTER 配下に参加させる
STOP SLAVE [connection_name]; CHANGE MASTER [connection_name] TO MASTER_HOST="new_master_name or IP address", MASTER_PORT=3306, MASTER_USER='<user>', MASTER_PASSWORD='<pass>', MASTER_USE_GTID=current_pos, MASTER_LOG_FILE="XXX", MASTER_LOG_POS=XXX; START SLAVE;
connection_name
は特別付けていなければ無視できる
MASTER を new SLAVE にする
SHUTDOWN
したのでプロセスがおちている。起動する
mariadb をバージョンアップしたければ、このプロセス起動前に行う
sudo systemctl status mariadb.service sudo systemctl start mariadb.service sudo systemctl status mariadb.service
new SLAVE を new SLAVE として START させる
set @@global.read_only=1; STOP ALL SLAVES; RESET MASTER; RESET SLAVE ALL; CHANGE MASTER TO MASTER_HOST="<master host name or master ip address>", MASTER_PORT=3306, MASTER_USER='<user>', MASTER_PASSWORD='<pass>', MASTER_USE_GTID=slave_pos, MASTER_LOG_FILE="<file name>", MASTER_LOG_POS=<position>; START SLAVE;
new MASTER を UNLOCK する
UNLOCK TABLES;
動作確認
お好きなように!
感想
なんとかまとめられた?かな?
もっとこうするといいなどの意見が有りましたら優しくご教示下さい。m(_ _ )m
次は Multi-Source Replication
とか Semisynchronous Replication
とか Galera Cluster
とかやってみたい