takashi kono's blog

コーヒーとキーボードと共に何かを記録していくブログ

MariaDB 10.5 の 片方向レプリケーションの練習をしてみたまとめ

まとめてみる

元記事

takashikono.hatenadiary.jp

前提

  • 環境は元記事と同じ
  • 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 とかやってみたい