MySQL ClusterをDockerで起動して、実際の動作を確認し、まとめました。
MySQLClusterを最小のデフォルト構成で起動する
Dockerコンテナは、mysql提供のものを使用しました。OS/ARCHはlinux/amd64です。MySQL Clusterのバージョンは7.6.12です。
参考)mysql/mysql-cluster – Docker Hub
下記コマンドを実行して、管理ノードを起動します。
$ docker run -d --net=cluster --name=management1 --ip=192.168.0.2 mysql/mysql-cluster ndb_mgmd
mysql/mysql-clusterの最新イメージがpullされ、ノードが立ち上がります。
Unable to find image 'mysql/mysql-cluster:latest' locally latest: Pulling from mysql/mysql-cluster a316717fc6ee: Pull complete 866cb79fcddd: Pull complete 9a1fb4d8391d: Pull complete 72d3c0bc335c: Pull complete 8902f96f4114: Pull complete 8b7efa57d819: Pull complete Digest: sha256:a3caeb4b83877f708c3424be886440087a3f20db3a4389259b96ed206053681e Status: Downloaded newer image for mysql/mysql-cluster:latest a8bd94d470bef11938dfc82f3ce56856b2c0e48c58579c42acc2a0c696fb676d
下記コマンドを実行し、データノードその1を起動します。
$ docker run -d --net=cluster --name=ndb1 --ip=192.168.0.3 mysql/mysql-cluster ndbd
下記コマンドを実行し、データノードその2を起動します。
$ docker run -d --net=cluster --name=ndb2 --ip=192.168.0.4 mysql/mysql-cluster ndbd
下記コマンドを実行し、SQLノードを起動します。
$ docker run -d --net=cluster --name=mysql1 --ip=192.168.0.10 -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql/mysql-cluster mysqld
最小構成は管理ノード1個、データノード2個、SQLノード1個のようです。SQLノード起動時に、ログにパスワードが出力されるので、下記コマンドを実行してパスワードを表示させます。
$ docker logs mysql1 2>&1 | grep PASSWORD
SQLノードが起動するまでは、ログにパスワードが出力されません。上記コマンドを、パスワードが表示されるまで何度か実行します。
[Entrypoint] GENERATED ROOT PASSWORD: ig94q4hQ4SaxUz-AG#Of]Er*uNu
パスワードが表示されました。このパスワードを使って、SQLノードにログインします。
$ docker exec -it mysql1 mysql -uroot -p
先ほど表示されたパスワードを使ってログインします。
Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.28-ndb-7.6.12-cluster-gpl MySQL Cluster Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQLのrootのパスワードを変更しておきましょう。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'q2O2t#m6Q6&1';
これで、最小構成でMySQL Clusterが起動しました。
Query OK, 0 rows affected (0.00 sec)
クラスタ操作 ノードのstop/startをおこなう
管理ノードからクラスタ情報を確認する
下記コマンドを実行し、管理用のCUIコマンドを実行します。
$ docker run -it --net=cluster mysql/mysql-cluster ndb_mgm
ndb_mgm>とプロンプトが表示されることを確認します。
[Entrypoint] MySQL Docker Image 7.6.12-1.1.13-cluster [Entrypoint] Starting ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm>
showと入力します。
ndb_mgm> show
ノード情報が表示されます。
Connected to Management Server at: 192.168.0.2:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.3 (mysql-5.7.28 ndb-7.6.12, Nodegroup: 0, *) id=3 @192.168.0.4 (mysql-5.7.28 ndb-7.6.12, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.2 (mysql-5.7.28 ndb-7.6.12) [mysqld(API)] 1 node(s) id=4 @192.168.0.10 (mysql-5.7.28 ndb-7.6.12)
id=1がMGM(管理ノード)、id=2、id=3がNDB(データノード)、id=4がAPI(SQLノード)です。
ノードのstop
データノードの一つをstop(シャットダウン)してみましょう。
「2 stop」でid=2のノードがシャットダウンします。
ndb_mgm> 2 stop Node 2: Node shutdown initiated Node 2 has shutdown.
showで確認すると、id=2のノードが「not connected」になってます。
ndb_mgm> show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 192.168.0.3) id=3 @192.168.0.4 (mysql-5.7.28 ndb-7.6.12, Nodegroup: 0, *) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.2 (mysql-5.7.28 ndb-7.6.12) [mysqld(API)] 1 node(s) id=4 @192.168.0.10 (mysql-5.7.28 ndb-7.6.12) ndb_mgm> exit
mysqlコマンドでデータベースへの接続を確認します。
docker exec -it mysql1 mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 53 Server version: 5.7.28-ndb-7.6.12-cluster-gpl MySQL Cluster Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | ndbinfo | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
問題なく接続できています。
ノードのstart
停止させたノードを再度起動しましょう。
docker container pruneで停止済みのコンテナを全削除します。
$ docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y Deleted Containers: 79af3abb839fca0d9930a163768b7ad42399bc0d76a9e8a12dc597bd80e3f898
id=2のコンテナを起動します。
$ docker run -d --net=cluster --name=ndb1 --ip=192.168.0.3 mysql/mysql-cluster ndbd
管理用CUIでクラスタの状態を確認しましょう。下記コマンドを実行します。
$ docker run -it --net=cluster mysql/mysql-cluster ndb_mgm
ndb_mgm>とプロンプトに、showと入力します。
[Entrypoint] MySQL Docker Image 7.6.12-1.1.13-cluster [Entrypoint] Starting ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm>show
全てのノード情報が起動していることを確認します。
Connected to Management Server at: 192.168.0.2:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.3 (mysql-5.7.28 ndb-7.6.12, Nodegroup: 0, *) id=3 @192.168.0.4 (mysql-5.7.28 ndb-7.6.12, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.2 (mysql-5.7.28 ndb-7.6.12) [mysqld(API)] 1 node(s) id=4 @192.168.0.10 (mysql-5.7.28 ndb-7.6.12)
まとめ
- MySQL Clusterの4ノード構成はdockerコンテナ起動で試すのが簡単
- クラスタの状態は、管理用CUIコマンドを使う
- 指定したノードをstart/stopさせることが可能