サイドバーの壁紙
博主头像
tin博主等级

子の曰わく、我れ三人行なえば必ず我が師を得(う)。其の善き者を択びてこれに従う。其の善からざる者にしてこれを改む。

  • 累積執筆 72 記事
  • 累計作成 32 タグ
  • 累計受入 2 コメント

目 次CONTENT

記事目次

DockerでMySQLのレプリカを作成する(片方をマスターに、片方をスタンバイにする)

tin
tin
2023-04-05 / 0 コメント / 2 いいね! / 280 読み / 1,929 文字

UbuntuでDockerを使ってMySQLのレプリカを作成する(片方をマスターに、片方をスタンバイにする)

1. マスターMySQL側

1-1. 作業ディレクトリを準備

mkdir -p /tin/mysql-master/{log,data,conf}
mkdir -p /tin/mysql-slave/{log,data,conf}

1-2. マスターMySQLのconfigファイルを編集

vi /tin/mysql-master/conf/my.cnf
▼編集内容

[mysqld]
# サーバーIDを設定し、同じローカルネットワーク内で一意である必要があります
server_id=101
# 同期しないデータベース名を指定する
binlog-ignore-db=mysql
#バイナリログ機能を有効にする
log-bin=mall-mysql-bin
#トランザクションごとに使用するバイナリログキャッシュのサイズを設定する
binlog_cache_size=1M
# 使用するバイナリログ形式を設定する(mixed、statement、row)
binlog_format=mixed
# バイナリログの期限切れのクリーンアップ時間を設定する。デフォルト値は0で、自動クリーンアップは行われません。
expire_logs_days=7
# マスター・スタンバイレプリケーション中にすべてのエラーまたは指定されたタイプのエラーをスキップして、
# スタンバイ側のレプリケーションが中断されるのを防ぎます。
# たとえば、1062エラーはいくつかのプライマリキーが重複していることを指し、
# 1032エラーはマスター・スタンバイデータベースのデータ不一致によるものです。
slave_skip_errors=1062

1-3. マスターMySQLのコンテナを起動

docker run -d -p 3307:3306 --privileged=true \
-v /tin/mysql-master/log:/var/log/mysql \
-v /tin/mysql-master/data:/var/lib/mysql \
-v /tin/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123 \
--name mysql-master \
mysql:5.7

1-4. mysql-masterコンテナに入り、スタンバイDBのユーザを新規

  • コンテナに入る
docker exec -it mysql-master /bin/bash
mysql -uroot -p123
  • スタンバイDB用のユーザを新規
CREATE USER 'slave'@'%' IDENTIFIED BY '123';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

2. スタンバイ側

2-1. スタンバイMySQLのconfigファイルを編集

vi /tin/mysql-slave/conf/my.cnf

[mysqld]
# サーバーIDを設定し、同じローカルネットワーク内で一意である必要があります
server_id=102
# 同期しないデータベース名を指定する
binlog-ignore-db=mysql
# スタンバイとして他のデータベースインスタンスのMasterとして使用するために、バイナリログ機能を有効にする
log-bin=mall-mysql-slave1-bin
# トランザクションごとに使用するバイナリログキャッシュのサイズを設定する
binlog_cache_size=1M
# 使用するバイナリログ形式を設定する(mixed、statement、row)
binlog_format=mixed
# バイナリログの期限切れのクリーンアップ時間を設定する。デフォルト値は0で、自動クリーンアップは行われません。
expire_logs_days=7
# マスター・スタンバイレプリケーション中にすべてのエラーまたは指定されたタイプのエラーをスキップして、
# スタンバイ側のレプリケーションが中断されるのを防ぎます。
# たとえば、1062エラーはいくつかのプライマリキーが重複していることを指し、
# 1032エラーはマスター・スタンバイデータベースのデータ不一致によるものです。
slave_skip_errors=1062
# 中継ログを設定する
relay_log=mall-mysql-relay-bin
# log_slave_updatesはスタンバイが自分自身のバイナリログにレプリケーションイベントを書き込むことを示します。
log_slave_updates=1
# スタンバイを読み取り専用に設定します(super権限を持つユーザーを除く)
read_only=1

2-2. スタンバイMySQLのコンテナを起動

docker run -d -p 3308:3306 --privileged=true \
-v /tin/mysql-slave/log:/var/log/mysql \
-v /tin/mysql-slave/data:/var/lib/mysql \
-v /tin/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123 \
--name mysql-slave \
mysql:5.7

2-3. マスターMySQLに入り、ステータス及び情報を確認

root@ubuntu01:/# docker exec -it mysql-master bash
bash-4.2# mysql -uroot -p123
mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 |      617 |              | mysql            |                   |
+-----------------------+----------+--------------+------------------+-------------------+

2-4. スタンバイMySQLに入り、マスターDBの情報を設定

docker exec -it mysql-slave bash
mysql -uroot -p123
change master to master_host=‘192.168.1.5’, master_user=‘slave’, master_password=‘123’, master_port=3307, master_log_file=‘mall-mysql-bin.000003’, master_log_pos=617, master_connect_retry=30;

2-5. スタンバイMySQLからステータスを確認

show slave status \G;
image

2-6. 同期を起動

start slave;
show slave status \G;

image-1680667609136

2-7. 同期を稼働確認

  • マスターMySQLにDB・tableを新規し、データを挿入
docker exec -it mysql-master bash
mysql -uroot -p123
create database demo;
use demo;
CREATE TABLE `t_user` (	
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,	
  `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'user-name',	
  PRIMARY KEY (`id`)	
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='user-table';

INSERT INTO t_user values(1,'tin01');
INSERT INTO t_user values(2,'tin02');
  • スタンバイMySQLの同期状況を確認
root@ubuntu01:/# docker exec -it mysql-slave bash
bash-4.2# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| demo               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use demo;
Database changed
mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
|  1 | tin01    |
|  2 | tin02    |
+----+----------+
2 rows in set (0.00 sec)

2-8. 注意事項

マスター・スタンバイ構成を設定した後、スタンバイデータベースのユーザーはrootユーザーであってはいけません。そうでない場合、スタンバイデータベースで変更されたデータがマスターデータベースに反映されず、マスターとスタンバイ間で不整合が生じます。
スタンバイで新ユーザを追加、及び権限を設定。

①ユーザを新規
create user 'user1' identified by 'user1';

②全ての権限を付与
grant all privileges on *.* to 'user1'@'%'; OR grant all on *.* to 'user1'@'%';
⇒ここでの「%」は、任意のリモートホストからの接続を許可するためのワイルドカード文字列です。つまり、このユーザーアカウントは、どのリモートホストからでも接続することができます。ただし、セキュリティ上の理由から、この種のアカウントは一般的に制限されることがあります。

③全ての権限を外す
revoke all on *.* from 'user1'@'%';

④検索のみの権限を付与

grant select on *.* to 'user1'@'%';
flush privileges;
show grants for 'user1';
bash-4.2# mysql -uuser1 -puser1
mysql> use demo;
mysql> INSERT INTO t_user values(3,'tin03');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
mysql> 
2
  • 2

コメント欄