MySQL Cluster 2台構成セットアップ

MySQL Cluster は NDBCLUSTER のストレージエンジンを用いたインメモリデータベースで、MySQL Server とは別の製品です。
Active/Active なクラスタ構成をとり、単一障害点を無くすことが可能になります。

※ 構築のみの手順のため、実際の性能評価や障害時の復旧オペレーション対応までは行いません

MySQLクラスタ関連を調べていて似た用語が多く混乱したのでいくつか整理します。

  • MySQL NDB Cluster
    • 管理ノード, データノード, SQL ノード の3つで構成されるクラスタ
    • 今回はこれを構築します
  • MySQL InnoDB Cluster
    • MySQL Router や MySQL Group Replication を使用した高可用性構成

検証環境

  • CentOS 7.6.1810 * 2
    • サーバ1 (192.168.100.21)
    • サーバ2 (192.168.100.22)
  • MySQL Cluster 7.6.11
    • ndb_mgmd (:1186)
    • ndbd (:2202)
    • mysqld (:3306)

ダウンロード

Download MySQL Cluster にアクセスし、ORACLE アカウントでログインしてダウンロードします。

適当な作業ディレクトリなどでパッケージをダウンロードして tar アーカイブを展開します。bundle.tar は 700MB ほどありました。

# mkdir mysqlpkg && cd $_
# curl -OL https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-community-7.6.11-1.el7.x86_64.rpm-bundle.tar
# tar xvf mysql-cluster-community-7.6.11-1.el7.x86_64.rpm-bundle.tar

パッケージインストール

依存パッケージのインストール

依存パッケージを事前にインストールしておきます。

# yum -y install epel-release
# yum -y install perl-DBI
# yum -y install perl-Class-MethodMaker

先ほどダウンロードしてきた MySQL の依存関係を解決するために、いくつかのパッケージを先にインストールします。

# rpm -Uhv mysql-cluster-community-common-7.6.11-1.el7.x86_64.rpm
# rpm -Uhv mysql-cluster-community-libs-7.6.11-1.el7.x86_64.rpm
# rpm -Uhv mysql-cluster-community-libs-compat-7.6.11-1.el7.x86_64.rpm

データノードのインストール

# rpm -Uhv mysql-cluster-community-data-node-7.6.11-1.el7.x86_64.rpm

SQL ノードのインストール

# rpm -Uhv mysql-cluster-community-client-7.6.11-1.el7.x86_64.rpm
# rpm -Uhv mysql-cluster-community-server-7.6.11-1.el7.x86_64.rpm

管理ノードのインストール

# rpm -Uhv mysql-cluster-community-management-7.6.11-1.el7.x86_64.rpm

クラスタ初期設定

MySQL 用のディレクトリを作成し、公式ドキュメントに倣って2つの構成ファイルを作成していきます。

# mkdir /var/lib/mysql-cluster
# mkdir -p /usr/local/mysql/data

/etc/my.cnf を編集します。

[mysqld]
ndbcluster
ndb-connectstring=192.168.100.21,192.168.100.22
character-set-server=utf8

[mysql]
default-character-set=utf8

[mysql_cluster]
ndb-connectstring=192.168.100.21,192.168.100.22

/var/lib/mysql-cluster/config.ini を作成します。

[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
ServerPort=2202

[ndb_mgmd]
# Management node 1
NodeId=1
HostName=192.168.100.21
DataDir=/var/lib/mysql-cluster

[ndb_mgmd]
# Management node 2
NodeId=2
HostName=192.168.100.22
DataDir=/var/lib/mysql-cluster

[ndbd]
# Data node 1
NodeId=21
HostName=192.168.100.21
DataDir=/usr/local/mysql/data

[ndbd]
# Data node 2
NodeId=22
HostName=192.168.100.22
DataDir=/usr/local/mysql/data

[mysqld]
# SQL node 1
NodeId=11
HostName=192.168.100.21

[mysqld]
# SQL node 2
NodeId=12
HostName=192.168.100.22

設定ファイルを作成したら所有者とグループを mysql に変更します。

# chown -R mysql: /var/lib/mysql-cluster
# chown -R mysql: /usr/local/mysql

起動

MySQL Cluster は以下の順で起動をする必要があります。

  1. 管理ノード
  2. データノード
  3. SQL ノード

まず管理ノードを起動します。

# ndb_mgmd -f /var/lib/mysql-cluster/config.ini

次にデータノードを起動します。

# ndbd

最後に SQL ノードを起動します。

# systemctl start mysqld

管理コンソールでステータスを確認することができます。
最初は SQL ノードが not connected と表示されていましたが、mysqld のサービス再起動で認識してくれました。

# ndb_mgm
ndb_mgm> SHOW
Connected to Management Server at: 192.168.100.21:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=21   @192.168.100.21 (mysql-5.7.27 ndb-7.6.11, Nodegroup: 0, *)
id=22   @192.168.100.22 (mysql-5.7.27 ndb-7.6.11, Nodegroup: 0)

[ndb_mgmd(MGM)] 2 node(s)
id=1    @192.168.100.21 (mysql-5.7.27 ndb-7.6.11)
id=2    @192.168.100.22 (mysql-5.7.27 ndb-7.6.11)

[mysqld(API)]   2 node(s)
id=11   @192.168.100.21 (mysql-5.7.27 ndb-7.6.11)
id=12   @192.168.100.22 (mysql-5.7.27 ndb-7.6.11)

なお、ndb_mgm -e show のコマンドでも同様の表示が可能です。

データベース初期設定

サーバ1、サーバ2の両方で初期パスワードを確認し、初回起動を行います。

# grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'
pbIFgj)gr7ru

# mysql_secure_installation
Enter password for user root: pbIFgj)gr7ru

New password:
Re-enter new password:

Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

All done!

サーバ1でデータベースとテーブルを作成するとサーバ2にも反映されています。

テーブル作成時のストレージエンジンは NDBCLUSTER を指定します。
従来通り InnoDB のストレージエンジンでも作成できますが、テーブルのクラスタ化はされません。

# mysql -uroot -p
> CREATE DATABASE testdb;
> USE testdb;
> CREATE TABLE testtable (id INTEGER PRIMARY KEY, name VARCHAR(255)) ENGINE=NDBCLUSTER;

スキーマ情報を参照するとストレージエンジンが NDBCLUSTER であることが確認できます。

> USE information_schema;
> SELECT table_schema, table_name, engine FROM tables WHERE table_schema = 'testdb';
+--------------+------------+------------+
| table_schema | table_name | engine     |
+--------------+------------+------------+
| testdb       | testtable  | ndbcluster |
+--------------+------------+------------+

参考サイト