詳しくは https://dev.mysql.com/doc/refman/5.7/en/mysql-innodb-cluster-production-deployment.html をご確認ください。
はじめに
CentOS7サーバを3から4台くらい起動します。
最低3台のDBサーバと一台のルーターサーバが必要です。
ルーターサーバはDBサーバと同居できますが、できれば分離した方が良いでしょう。
そうすると4台が最小構成となります(DBサーバx3台+ルーターサーバx1台)
初期設定
全台ともに
#vi /etc/selinux/config
とし
SELINUX=disabled
としてから reboot
し、
# yum install -y http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# yum remove -y mysql-libs
を実行しておきます。
dbサーバの設定
下記の設定を3台かそれ以上のdbサーバに適用してください。
# yum install -y mysql-server mysql-shell
# service mysqld start
$ cat /var/log/mysqld.log | grep temporary
とし、出てきたパスワードで mysql -u root -p
とします。
SET PASSWORD = "MySQL_5.7";
UNINSTALL PLUGIN validate_password;
SET PASSWORD = "なにがしかのパスワード";
\q
$ mysqlsh
とし、
>dba.configureLocalInstance('root@localhost:3306')
Please provide the password for 'root@localhost:3306':
Detecting the configuration file...
Found configuration file at standard location: /etc/my.cnf
Do you want to modify this file? [Y|n]: [Y|n]: Y
MySQL user 'root' cannot be verified to have access to other hosts in the network.
1) Create root@% with necessary grants
2) Create account with different name
3) Continue without creating account
4) Cancel
Please select an option [1]: 2
account name= clusteradmin
>\q
# service mysqld restart
します。
クラスタの作成
クラスタのうちのどれかから以下を実行します。
$ mysqlsh
dba.checkInstanceConfiguration('clusteradmin@クラスタ内dbサーバ1のIPアドレス:3306')
dba.checkInstanceConfiguration('clusteradmin@クラスタ内dbサーバ2のIPアドレス:3306')
dba.checkInstanceConfiguration('clusteradmin@クラスタ内dbサーバ3のIPアドレス:3306')
shell.connect('clusteradmin@クラスタ内dbサーバ1のIPアドレス:3306')
var cluster = dba.createCluster('Cluster001(←クラスタ名、任意の名前でokです)')
cluster.addInstance('clusteradmin@クラスタ内dbサーバ2のIPアドレス:3306');
cluster.addInstance('clusteradmin@クラスタ内dbサーバ3のIPアドレス:3306');
クラスタ化されたコンフィグの保存
各dbサーバで修正されたコンフィグをセーブします。
三台かそれ以上のdbサーバすべてで実行してください。
$ mysqlsh
>dba.configureLocalInstance('clusteradmin@localhost:3306')
スレーブサーバの場合、以下のようになります
Do you want to disable super_read_only and continue? [y|N]:y
routerサーバの設定
通常、dbサーバではないサーバでrouterを実行します。
# yum install -y mysql-router mysql-shell
$ mysqlrouter --bootstrap clusteradmin@クラスタ1のIPアドレス:3306 --user=mysqlrouter --conf-base-port 3306
# service mysqlrouter start
おまけ
ちゃんと動いてるかどうかテスト
# クラスタ内dbサーバ1が r/w serverになっていると思うので、 rootでログインし、以下のようにします。 本番環境ではadminの接続元を制限し、パスワードを設定してください。
create user admin@'%' identified by 'admin';
grant all on *.* to admin@'%';
# ルーターサーバで以下を実行し、sqlがクラスタ内dbサーバすべてに反映されているか確認します。
$ mysql-shell
mysql-sql> \connect admin@10.10.16.209 //ルーターサーバ自身のアドレス
create database testbase;
use testbase;
CREATE TABLE item (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
description VARCHAR(30),
price INT UNSIGNED,
created_at DATETIME
);