RHEL9でMySQLのインストールとInnoDB Clusterを構築、リカバリしてみよう

※ 本記事は Container.sios.jp にて公開されていた記事となります。

はじめに

説明

RHEL9でMySQLのインストールとクラスタを構築し、壊してクローンによりリカバリを行います。

構築所要時間

1時間前後となります。

慣れている方は30分程度です。

SELinuxの無効化とFWの無効化

SELinuxの無効化はRHEL8以前と異なりますのでこちらの記事を参考にしてください。

まずInnoDB Clusterは複数のポートを使用するので一旦FWを無効化します。

必要に応じてsudo systemctl stop firewalldを設定して下さい。

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

MySQLをインストール

RHEL9のレポジトリの設定に成功していれば以下のようにリストが表示され、インストールができるはずです。

InnoDB Clusterを構築する場合はMySQL ShellやMySQL Routerも欲しいですよね。

4/11時点ではMySQL公式サイトにはRHEL9のレポジトリがないようです。
https://dev.mysql.com/downloads/repo/yum/

$ sudo dnf search mysql
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:00:27 時間前の 2022年03月23日 14時32分59秒 に実施しました。
=========================== 名前 & 概要 一致: mysql ============================
mysql.x86_64 : MySQL client programs and shared libraries
apr-util-mysql.x86_64 : APR utility library MySQL DBD driver
dovecot-mysql.x86_64 : MySQL back end for dovecot
mysql-common.x86_64 : The shared files required for MySQL server and client
mysql-errmsg.x86_64 : The error messages files required by MySQL server
mysql-selinux.noarch : SELinux policy modules for MySQL and MariaDB packages
mysql-server.x86_64 : The MySQL server and related files
pcp-pmda-mysql.x86_64 : Performance Co-Pilot (PCP) metrics for MySQL
perl-DBD-MySQL.x86_64 : A MySQL interface for Perl
php-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases
postfix-mysql.x86_64 : Postfix MySQL map support
python3-PyMySQL.noarch : Pure-Python MySQL client library
qt5-qtbase-mysql.x86_64 : MySQL driver for Qt5's SQL classes
qt5-qtbase-mysql.i686 : MySQL driver for Qt5's SQL classes
rsyslog-mysql.x86_64 : MySQL support for rsyslog
rubygem-mysql2.x86_64 : A simple, fast Mysql library for Ruby, binding to
                      : libmysql
=============================== 概要 一致: mysql ===============================
mariadb-java-client.noarch : Connects applications developed in Java to MariaDB
                           : and MySQL databases
mariadb-server-utils.x86_64 : Non-essential server utilities for MariaDB/MySQL
                            : applications
perl-DBD-MariaDB.x86_64 : MariaDB and MySQL driver for the Perl5 Database
                        : Interface (DBI)
$ sudo dnf install -y mysql-server

InnoDB Clusterの構築(起動まで)

InnoDB Clusterの名前解決をするために各サーバにてホスト名を設定します。

(1台目)
$ sudo hostnamectl set-hostname 192-168-0-162
(2台目)
$ sudo hostnamectl set-hostname 192-168-0-164
(3台目)
$ sudo hostnamectl set-hostname 192-168-0-166

InnoDB Clusterの設定にするため一度MySQLを停止します。

$ sudo systemctl stop mysqld

設定を編集します。
デフォルト設定に設定を追加します。
server_idとIPアドレス、group_replication_group_nameは逐次変更してください。
また、エラーで起動しなくなるのでloose-を頭につけて
エラーの回避を行います。
InnoDB Clusterに必要なパラメータで一部デフォルトのものは除外しております。

$ sudo vi /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON

binlog_checksum=NONE

loose-plugin_load_add='group_replication.so;mysql_clone.so'
loose-group_replication_group_name="5f0e506a-58f3-4256-ba8b-78101b3b3b39"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.0.162:33061"
loose-group_replication_group_seeds="192.168.0.162:33061,192.168.0.164:33061,192.168.0.166:33061"
loose-group_replication_bootstrap_group=off

MySQLを起動します。
loose-でエラーになる設定が無視されるので起動に成功するはずです。

$ sudo systemctl start mysqld

先程の起動でプラグインがインストールされるはずです。
loose-が付与されているパラメータが無効にされたままなので再起動し、有効にします。

$ sudo systemctl restart mysqld

InnoDB Clusterの構築(コマンド投入)

MySQL ShellからセットアップしていないのでクエリでInnoDB Clusterをセットアップします。
まずMySQLにログインします。

$ mysql -u root

各サーバにユーザを追加します。
レプリケーション用ユーザ作成と共に
リカバリしやすいようにCLONE権限を付与します。

(全サーバにて)
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> GRANT CLONE_ADMIN ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

1台のサーバからInnoDB Clusterの設定を行います。

(サーバの1台にて)
mysql>  CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> SHOW PLUGINS;
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

他のサーバもInnoDB Clusterを起動させます。

(残りのサーバの2台にて)
mysql> START GROUP_REPLICATION;

InnoDB Clusterの動作確認

最後に構築された確認します。

全てONLINEなら動作してます。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 43852267-aafd-11ec-ada3-0800276ff680 | 192-168-0-164 |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
| group_replication_applier | 6ebf6f21-aaff-11ec-ac60-080027d8804f | 192-168-0-166 |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
| group_replication_applier | a516952f-aafe-11ec-b089-0800276f5f8a | 192-168-0-162 |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

他のノードからのリカバリ

MySQL8.0.17よりCloneプラグインを使って障害から復旧できますので試してみます。

既にプラグインはloose-plugin_load_add=’group_replication.so;mysql_clone.so’でインストールされてます。

意図的に壊し、現在の構築状態を確認します。



mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 43852267-aafd-11ec-ada3-0800276ff680 | 192-168-0-164 |        3306 | RECOVERING   | SECONDARY   | 8.0.28         | XCom                       |
| group_replication_applier | 6ebf6f21-aaff-11ec-ac60-080027d8804f | 192-168-0-166 |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
| group_replication_applier | a516952f-aafe-11ec-b089-0800276f5f8a | 192-168-0-162 |        3306 | RECOVERING   | SECONDARY   | 8.0.28         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.02 sec)

Cloneコマンドが実行できるようにリストを追加し、コピーを行います。

(.162と.164のサーバにて)
mysql> SET GLOBAL clone_valid_donor_list = '192.168.0.162:3306,192.168.0.164:3306,192.168.0.166:3306';
mysql> CLONE INSTANCE FROM 'rpl_user'@'192.168.0.166':3306
       IDENTIFIED BY 'password';
mysql> SHOW GLOBAL VARIABLES LIKE 'gtid_executed';

正常に戻っているか確認します。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 43852267-aafd-11ec-ada3-0800276ff680 | 192-168-0-164 |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
| group_replication_applier | 6ebf6f21-aaff-11ec-ac60-080027d8804f | 192-168-0-166 |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
| group_replication_applier | a516952f-aafe-11ec-b089-0800276f5f8a | 192-168-0-162 |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)

あとがき

今回はMySQLクラスタの構築と復旧について記載しました。

次回はPostgreSQLのクラスタを構築します。


ここまでお読みいただき、ありがとうございました!