MySQL Cluster 2台構成セットアップ
MySQL Cluster は NDBCLUSTER のストレージエンジンを用いたインメモリデータベースで、MySQL Server とは別の製品です。
Active/Active なクラスタ構成をとり、単一障害点を無くすことが可能になります。
※ 構築のみの手順のため、実際の性能評価や障害時の復旧オペレーション対応までは行いません
MySQL のクラスタ関連を調べていて似た用語が多く混乱したのでいくつか整理します。
検証環境
- 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 アカウントでログインしてダウンロードします。
- Select Operating System:
- Select OS Version:
適当な作業ディレクトリなどでパッケージをダウンロードして 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 は以下の順で起動をする必要があります。
- 管理ノード
- データノード
- 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 | +--------------+------------+------------+