【CentOS7】 MySQL InnoDB Cluster の構築

詳しくは 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
);