MySQL NDB Cluster を自動管理したい
MySQL NDB Cluster はそれ単体でも管理ノードの mgmd を用いることで管理ノード・データノードの停止やデータノードのメモリ使用状況等の操作は可能です
しかし、今回紹介する MySQL Cluster Manager(以下 MCM)を使用することで、API ノードを含めた管理を行うことが可能になり、運用面でさらなる簡素化(自動化)が可能になる製品です
そこで MCM によりどのような自動化が可能かを紹介したいと思います
検証環境
構成
- 管理ノード
- mgm01: 192.168.31.201
- mgm02: 192.168.31.202
- API ノード
- sql01: 192.168.31.51
- sql02: 192.168.31.52
- データノード
- data01: 192.168.31.1
- data02: 192.168.31.2
※全て CentOS Linux release 7.4.1708 (Core) で構成
MySQL NDB Cluster を構成するパッケージ
- 管理ノード
- mysql-cluster-community-libs-7.5.8-1.el7.x86_64
- mysql-cluster-community-common-7.5.8-1.el7.x86_64
- mysql-cluster-community-client-7.5.8-1.el7.x86_64
- mysql-cluster-community-libs-compat-7.5.8-1.el7.x86_64
- mysql-cluster-community-management-server-7.5.8-1.el7.x86_64
- API ノード
- mysql-cluster-community-libs-7.5.8-1.el7.x86_64
- mysql-cluster-community-common-7.5.8-1.el7.x86_64
- mysql-cluster-community-client-7.5.8-1.el7.x86_64
- mysql-cluster-community-libs-compat-7.5.8-1.el7.x86_64
- mysql-cluster-community-server-7.5.8-1.el7.x86_64
- データノード
- mysql-cluster-community-data-node-7.5.8-1.el7.x86_64
11/20 時点の最新版を RPM でインストール(こちらはコミュニティ版をインストール)
MCM のパッケージ
- mcm-1.4.4-linux-el7-x86-64bit.tar.gz
11/20 時点で OracleLinux/RHEL 7 用の RPM パッケージは存在していないため、tar ball 版を使用しています
MCM のインストール
- 基本的にはマニュアルのChapter 2 MySQL NDB Cluster Manager Installation, Configuration, Cluster Setupを参考にして、ほぼそのまま実施しています
- 一部ディレクトリ構成を変更したり、MySQL NDB Cluster が同梱版でない等の違いはあるが、基本的にはそのまま実施しています
MCM の初期設定
- こちらもマニュアルのChapter 3 Using MySQL NDB Cluster Manager に沿って進めていきますが、上記構成の場合はパッケージが足らずエラー(遭遇したエラー その1)になりました
- また、RPMパッケージが足りない以外にも以下のようなエラー(遭遇したエラー その2から5)に遭遇しています
- サイト名・パッケージ名・クラスタ名はそれぞれ、ss-site、7.5.8-RPM、ss-cluster に変更して実施しています
遭遇したエラー その1
1 2 |
mcm> add package --basedir=/usr 7.5.8-RPM; ERROR 7006 (00MGR): Process error: Could not locate valid executable 'mysqldump' on host 192.168.31.2 |
データノードに mysqldump コマンドが必要らしいので、mysql-cluster-community-client パッケージを追加インストールしました
※依存関係で、mysql-cluster-community-common、mysql-cluster-community-libs、mysql-cluster-community-libs-compat も追加インストールしています
※mariadb-libs がすでにインストールされていますが、mysql-cluster-community-libs-compat をインストールすることで mariadb-libs はアンインストールされ、依存関係も mysql-cluster-community-libs-compat で解消されます
遭遇したエラー その2
1 2 |
mcm> create cluster --import --package=7.5.8-RPM xxxxx ss-cluster; mcm> import config ss-cluster; |
ndb_cluster_connection_pool = 2 にしていたのと、mysqld の NodeId を不定にしていたのが悪かったのか、正常に import config できませんでした
そのため、ndb_cluster_connection_pool はコメントアウトし、各 API ノードも含めて NodeId は固定で設定しました
※マニュアルに NodeId は全てのノードで設定してくださいと書かれていました
ndb_cluster_connection_pool に関してもマニュアル に set を用いて設定する記述がありますので、そのようにすれば問題無いかもしれません
遭遇したエラー その3
データノードの起動オプションに –nostart オプションを付けて起動していたのですが、 import config 時に
1 |
ERROR 5314 (00MGR): Process ndbmtd 11 was started with unsupported option --nostart |
とエラーになりますので、–nostart オプションは削除して起動する必要があります
遭遇したエラー その4
API ノードの MySQL と MCM エージェントの起動ユーザが異なっていると、mysqld の pid ファイルが読めずエラーになりました
ディレクトリのパーミッションや OS ユーザのサブグループを設定しても解決できず、MCM エージェントを mysql ユーザで動かすことでなんとか動きました
また、その際の mysqld の起動オプションでも –defaults-file か –no-defaults が必要と怒られたりもしていますので、起動ユーザやオプションは要注意ポイントとなります
※管理ノードとデータノードのプロセスも MCM エージェントと同じユーザで起動する必要がありますので、各プロセスと MCM エージェントは同一ユーザで起動しなければなりません
遭遇したエラー その5
すでに構築済みの MySQL NDB Cluster に MCM を設定していたのですが、API ノードのデータディレクトリパスに関する設定不備・認識不足のため、通常の /var/lib/mysql で動かそうとしていました
しかし、MCM が要求していたデータディレクトリのパスは別のところに設定されていたため、API ノード停止後に起動しようとしても、mysqld の必要ファイル郡が存在しないため、エラーで起動できませんでした
MCM 上で mysqld を初期化して起動することで mysqld の実行に必要なファイル群がデータディレクトリに配置され、起動可能になりました
MCM による MySQL NDB Cluster の操作(一例)
いろいろと躓きはしましたが、なんとか設定が完了したようなので、MCM で MySQL NDB Cluster の管理(起動・停止等)を行ってみたいと思います
設定された各ノード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# ndb_mgm -e "SHOW" Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=11 @192.168.31.1 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *) id=12 @192.168.31.2 (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0) [ndb_mgmd(MGM)] 2 node(s) id=201 @192.168.31.201 (mysql-5.7.20 ndb-7.5.8) id=202 @192.168.31.202 (mysql-5.7.20 ndb-7.5.8) [mysqld(API)] 2 node(s) id=51 @192.168.31.51 (mysql-5.7.20 ndb-7.5.8) id=52 @192.168.31.52 (mysql-5.7.20 ndb-7.5.8) |
1 2 3 4 5 6 7 8 9 10 11 12 |
mcm> show status --process ss-cluster; +--------+----------+----------------+---------+-----------+------------+ | NodeId | Process | Host | Status | Nodegroup | Package | +--------+----------+----------------+---------+-----------+------------+ | 201 | ndb_mgmd | 192.168.31.201 | running | | 7.5.8-RPM | | 202 | ndb_mgmd | 192.168.31.202 | running | | 7.5.8-RPM | | 11 | ndbmtd | 192.168.31.1 | running | 0 | 7.5.8-RPM | | 12 | ndbmtd | 192.168.31.2 | running | 0 | 7.5.8-RPM | | 51 | mysqld | 192.168.31.51 | running | | 7.5.8-RPM | | 52 | mysqld | 192.168.31.52 | running | | 7.5.8-RPM | +--------+----------+----------------+---------+-----------+------------+ 6 rows in set (0.02 sec) |
クラスタ全体の停止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mcm> stop cluster ss-cluster; +------------------------------+ | Command result | +------------------------------+ | Cluster stopped successfully | +------------------------------+ 1 row in set (21.53 sec) mcm> show status --process ss-cluster; +--------+----------+----------------+---------+-----------+------------+ | NodeId | Process | Host | Status | Nodegroup | Package | +--------+----------+----------------+---------+-----------+------------+ | 201 | ndb_mgmd | 192.168.31.201 | stopped | | 7.5.8-RPM | | 202 | ndb_mgmd | 192.168.31.202 | stopped | | 7.5.8-RPM | | 11 | ndbmtd | 192.168.31.1 | stopped | 0 | 7.5.8-RPM | | 12 | ndbmtd | 192.168.31.2 | stopped | 0 | 7.5.8-RPM | | 51 | mysqld | 192.168.31.51 | stopped | | 7.5.8-RPM | | 52 | mysqld | 192.168.31.52 | stopped | | 7.5.8-RPM | +--------+----------+----------------+---------+-----------+------------+ 6 rows in set (0.07 sec) |
クラスタ全体の起動
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mcm> start cluster ss-cluster; +------------------------------+ | Command result | +------------------------------+ | Cluster started successfully | +------------------------------+ 1 row in set (54.63 sec) mcm> show status --process ss-cluster; +--------+----------+----------------+---------+-----------+------------+ | NodeId | Process | Host | Status | Nodegroup | Package | +--------+----------+----------------+---------+-----------+------------+ | 201 | ndb_mgmd | 192.168.31.201 | running | | 7.5.8-RPM | | 202 | ndb_mgmd | 192.168.31.202 | running | | 7.5.8-RPM | | 11 | ndbmtd | 192.168.31.1 | running | 0 | 7.5.8-RPM | | 12 | ndbmtd | 192.168.31.2 | running | 0 | 7.5.8-RPM | | 51 | mysqld | 192.168.31.51 | running | | 7.5.8-RPM | | 52 | mysqld | 192.168.31.52 | running | | 7.5.8-RPM | +--------+----------+----------------+---------+-----------+------------+ 6 rows in set (0.06 sec) |
特定プロセスの停止(ex. 管理ノード1号機の管理プロセス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mcm> stop process 201 ss-cluster; +------------------------------+ | Command result | +------------------------------+ | Process stopped successfully | +------------------------------+ 1 row in set (12.73 sec) mcm> show status --process ss-cluster; +--------+----------+----------------+---------+-----------+------------+ | NodeId | Process | Host | Status | Nodegroup | Package | +--------+----------+----------------+---------+-----------+------------+ | 201 | ndb_mgmd | 192.168.31.201 | stopped | | 7.5.8-RPM | | 202 | ndb_mgmd | 192.168.31.202 | running | | 7.5.8-RPM | | 11 | ndbmtd | 192.168.31.1 | running | 0 | 7.5.8-RPM | | 12 | ndbmtd | 192.168.31.2 | running | 0 | 7.5.8-RPM | | 51 | mysqld | 192.168.31.51 | running | | 7.5.8-RPM | | 52 | mysqld | 192.168.31.52 | running | | 7.5.8-RPM | +--------+----------+----------------+---------+-----------+------------+ 6 rows in set (0.06 sec) |
特定プロセスの起動(ex. 管理ノード1号機の管理プロセス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mcm> start process 201 ss-cluster; +------------------------------+ | Command result | +------------------------------+ | Process started successfully | +------------------------------+ 1 row in set (2.17 sec) mcm> show status --process ss-cluster; +--------+----------+----------------+---------+-----------+------------+ | NodeId | Process | Host | Status | Nodegroup | Package | +--------+----------+----------------+---------+-----------+------------+ | 201 | ndb_mgmd | 192.168.31.201 | running | | 7.5.8-RPM | | 202 | ndb_mgmd | 192.168.31.202 | running | | 7.5.8-RPM | | 11 | ndbmtd | 192.168.31.1 | running | 0 | 7.5.8-RPM | | 12 | ndbmtd | 192.168.31.2 | running | 0 | 7.5.8-RPM | | 51 | mysqld | 192.168.31.51 | running | | 7.5.8-RPM | | 52 | mysqld | 192.168.31.52 | running | | 7.5.8-RPM | +--------+----------+----------------+---------+-----------+------------+ 6 rows in set (0.11 sec) |
感想
- 単純な停止だけだと管理ノードからでもある程度操作は可能だが、起動まで可能なのは自動化を考えるとメリットは大きいと思います
- 停止だけでも API ノードが複数存在していると、それぞれのサーバにログインして停止する必要があるので、煩雑な操作が解消されそうです
- プロセスの稼動状態が MCM から取得可能なため、プロセス監視・制御を一元管理することも可能になります
- 今回は未検証だが、MCM からバックアップ・リストアが可能です
- こちらも未検証だが、レプリケーション設定やアップグレードも可能です
- マニュアルをかなり読み込まないと設定に詰まるポイントが多いのはデメリットです
- MCM を利用する環境ならオラクルサポートを受けれる状態なはずなので、本番運用時にはサポートに頼れば良いと思います
- ただ、試用・検証時に詰まってしまうと導入に躊躇してしまうかもしれないです
- Package という機能で各コマンドのインストールパスを指定できるため、RPM 版と Tar ball 版の両方に対応できています
- 今回は最新版で検証を行った都合もあり、アップグレード操作の検証ができなかったが、RPM 版でどのようにアップグレードできるのかが不明です
- Tar ball 版の場合は、add package –basedir=/usr/local/ndb-7.5.x 7.5.x; の様にし、バージョンごとにパッケージを登録したのち、そのパッケージを使うように指定すればアップグレードすることができる模様です