それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

MySQL 8.0 GTID+準同期レプリケーション構成のメモ

Google Cloud SQL でアレコレしている時に、MySQLのレプリケーション設定を1から試したくなった&別に遊べる環境が欲しかったのでサクッと立てるとこまでのメモ

MySQL リポジトリの登録とインストール

公式の Download MySQL Yum Repository からパッケージをインストールする。

$ sudo yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
$ sudo yum -y install mysql-community-server

マスター側の設定

$ sudo vi /etc/my.cnf
server-id=1
log-bin
log-slave-update
gtid-mode=ON
enforce-gtid-consistency
$ sudo systemctl start mysqld
設定 内容
server-id=X マスターとスレーブで異なるIDを設定
log-bin バイナリログの有効化
log-slave-update スレーブでもバイナリログを記述する
gtid-mode=ON GTIDの利用を有効化
enforce-gtid-consistency GTIDの一貫性を有効化

スレーブ側の設定

上記の server-id2 に変更して同じ対応を行う。

マスター/スレーブの初期設定

まずパスワードを初期パスワードを確認して mysql_secure_installation でパスワードの変更しとく。

$ grep password /var/log/mysqld.log
2018-07-03T02:22:57.041161Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ************
$ mysql_secure_installation
...

マスター側の設定

レプリケーション用のユーザの作成と、アクセス許可を設定する。

$ mysql -u root -p
mysql> CREATE USER 'repl'@'IPADDRESS(SLAVE)' IDENTIFIED BY 'PASSWORD';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'IPADDRESS(SLAVE)';
mysql> exit

スレーブ側の設定

$ mysql -u root -p
mysql> CHANGE MASTER TO
MASTER_HOST = 'IPADDRESS',
MASTER_PORT = 3306,
MASTER_USER = 'repl',
MASTER_PASSWORD = 'PASSWORD',
MASTER_AUTO_POSITION = 1;

同期を開始(SLAVE START)し、しばらく状態を確認する。

mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;

問題なければ下記のようなステータスになる

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Last_IO_Error:
Last_SQL_Error:

これで同期できた状態になった。

などを行い、マスター側の変更がスレーブに反映されたところまで確認した。

準同期レプリケーション設定

追加で ここ を参考に準同期レプリケーションの設定までしてみた。

マスター

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

# 確認
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%';

スレーブ

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

# 確認
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%';

マスター

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

スレーブ

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

あとは SHOW GLOBAL STATUS\G でステータスを確認して動いていること。先に確認していた内容を試して動作している事を確認した。

参考URL

あとでやる

  • マスター側にデータを書き込んだ状態から、スレーブの作成と同期
  • わざと障害を起こして復旧するところまでやる

以上、c⌒っ゚д゚)っφ メモメモ...