MySQL NDB Cluster (NDB) はとても素晴らしいプロダクトです。高可用性と耐久性が基本設計に織り込まれています。非常に高速で、オンラインでスケーラブルかつアップグレード可能です。NDB は実証済みの「5ナイン」(99.999%) の可用性で、ミッションクリティカルなアプリケーションやインフラストラクチャに機能を提供します。データベースサイズの増加中やアップグレード中もダウンタイムなしで、毎秒数百万のトランザクションを処理できます。これらの機能によって、NDB は世界中の最も重要なビジネスワークロードの処理に選ばれています。

しかし、高性能の実現には常にコストがかかります。NDB の場合は管理するコストでしょう。NDB が多くのホスト間に分散され、より多くの容量が追加されるにつれて、データベースを管理するための複雑さと時間は増加し続けます。MySQL Cluster Manager (MCM) を使うと、これらの複雑で時間のかかる管理タスクがはるかに簡素化され、DBA は他の作業に集中できるようになります。

この記事は MCM を使って NDB を管理する、2 番目の記事です。最初の記事ではインストールの基本と単一ホスト上でのブートストラップについて説明しました。本記事では以下の内容を採りあげます。

  • マルチホストのセットアップ
  • NDB のバックアップと復元
  • NDB のスケーリング
  • NDB のアップグレード

まだお読みでない方は、最初の記事「MySQL NDB Cluster のための MySQL Cluster Manager」をまずご覧ください。本記事では、前記事で説明した内容の一部は省略します。

マルチホストセットアップ

--bootstrap オプションを使うと、ダウンロード完了からとりあえず動かすまでの時間を最小化し、NDB をすぐに起動して試すことができますが、単一ホストのクラスターは正直なところ、現実的なクラスターとは言えません。実用にはより多くのホストが必要です。

最初の記事と同様に、本記事の例ではOracle Linux 8 を実行する OCI 上のホストを使います。MCM は複数のプラットフォームをサポートしており、オンプレミスでの実行も可能ですので、お使いの環境に合わせて読み替えてください。

まず、2 つの OCI ホスト (便宜的に lagoonreef と名付けましょう) を起動します。次に、MCM とクラスターパッケージをインストールし、各ホストで mcmd を起動します。そして、2 つのホストにまたがるサイト s を作成します。

mcm> create site --hosts=lagoon,reef s;
+---------------------------+
| Command result            |
+---------------------------+
| Site created successfully |
+---------------------------+
1 row in set (0.40 sec)

list hosts コマンドは、新しく作成したサイトのホスト情報を表示します。

mcm> list hosts s;
+--------+-----------+---------+
| Host   | Status    | Version |
+--------+-----------+---------+
| lagoon | Available | 8.4.4   |
| reef   | Available | 8.4.4   |
+--------+-----------+---------+
2 rows in set (0.20 sec)

次に、パッケージ (NDB バイナリの場所) を追加し、論理名を付けます。ここでは NDB 8.4 バイナリなので、「8.4」というパッケージ名にでもしてみましょう。

mcm> add package --basedir=/export/home/tmp/foo/mcm-8.4.4-linux-glibc2.28-x86-64bit/cluster 8.4;
+----------------------------+
| Command result             |
+----------------------------+
| Package added successfully |
+----------------------------+
1 row in set (0.20 sec)

パッケージを配置すると、クラスターを作成できます。--package オプションを使用して、1 つ前の手順で追加した「8.4」パッケージを指定し、今度はクラスターに「c」という名前を付けましょう。-R オプションは「プロセス@ホスト」記法を使用して、クラスターのプロセスとホストの場所を指定します。ホスト間でラウンドロビンを行い、1 つの ndb_mgmd、2 つの ndbmtd データノード、2つの mysqld サーバー、および ndbapi 接続用のスロットを追加します。ndbapi には任意のホストから利用できるよう、ワイルドカードのホスト名が与えられます。

mcm> create cluster --package=8.4 -R ndb_mgmd@lagoon,ndbmtd@reef,ndbmtd@lagoon,mysqld@reef,mysqld@lagoon,ndbapi@* c;
+------------------------------+
| Command result               |
+------------------------------+
| Cluster created successfully |
+------------------------------+
1 row in set (0.30 sec)

ここで list clusters コマンドを使うと、新しく作成されたクラスターが表示されるはずです。

mcm> list clusters s;
+---------+---------+
| Cluster | Package |
+---------+---------+
| c       | 8.4     |
+---------+---------+
1 row in set (0.10 sec)

構成パラメータは get および set コマンドを用いて自由に変更できます。以下の例では割り当てられたデフォルト値を使っています。

mcm> get -d port:mysqld mycluster;
+------+-------+----------+---------+----------+---------+-------+---------+
| Name | Value | Process1 | NodeId1 | Process2 | NodeId2 | Level | Comment |
+------+-------+----------+---------+----------+---------+-------+---------+
| port | 3306  | mysqld   | 146     |          |         |       |         |
| port | 3306  | mysqld   | 147     |          |         |       |         |
+------+-------+----------+---------+----------+---------+-------+---------+
2 rows in set (0.10 sec)

クラスターの初期起動前は、すべてのプロセスが added ステータスにあります。

mcm> show status --process c;
+--------+----------+--------+--------+-----------+---------+
| NodeId | Process  | Host   | Status | Nodegroup | Package |
+--------+----------+--------+--------+-----------+---------+
| 145    | ndb_mgmd | lagoon | added  |           | 8.4     |
| 1      | ndbmtd   | reef   | added  | n/a       | 8.4     |
| 2      | ndbmtd   | lagoon | added  | n/a       | 8.4     |
| 146    | mysqld   | reef   | added  |           | 8.4     |
| 147    | mysqld   | lagoon | added  |           | 8.4     |
| 148    | ndbapi   | *      | added  |           |         |
+--------+----------+--------+--------+-----------+---------+
6 rows in set (0.10 sec)

起動後、実行したい NDB ツール用に追加した空の ndbapi スロットを除いて、すべてのプロセスは running 状態になるはずです。

mcm> start cluster c;
+------------------------------+
| Command result               |
+------------------------------+
| Cluster started successfully |
+------------------------------+
1 row in set (18.02 sec)

mcm> show status --process c;
+--------+----------+--------+---------+-----------+---------+
| NodeId | Process  | Host   | Status  | Nodegroup | Package |
+--------+----------+--------+---------+-----------+---------+
| 145    | ndb_mgmd | lagoon | running |           | 8.4     |
| 1      | ndbmtd   | reef   | running | 0         | 8.4     |
| 2      | ndbmtd   | lagoon | running | 0         | 8.4     |
| 146    | mysqld   | reef   | running |           | 8.4     |
| 147    | mysqld   | lagoon | running |           | 8.4     |
| 148    | ndbapi   | *      | added   |           |         |
+--------+----------+--------+---------+-----------+---------+
6 rows in set (0.11 sec)

ホストとプロセスの数が増えるにつれて、MCM の運用は相対的にさらに簡単になります。

MySQL NDB Cluster のバックアップと復元

クラスターバックアップの作成はとても簡単です。

mcm> backup cluster c;
+-------------------------------+
| Command result                |
+-------------------------------+
| Backup completed successfully |
+-------------------------------+
1 row in set (1.70 sec)

たったこれだけで、MCM が NDB クラスターのバックアップを実行しました。

バックアップは list backups コマンドを使うと一覧できます。

mcm> list backups c;
+----------+--------+--------+----------------------+-------+---------+
| BackupId | NodeId | Host   | Timestamp            | Parts | Comment |
+----------+--------+--------+----------------------+-------+---------+
| 1        | 1      | reef   | 2024-11-08 11:21:23Z | 1     |         |
| 1        | 2      | lagoon | 2024-11-08 11:21:23Z | 1     |         |
+----------+--------+--------+----------------------+-------+---------+
2 rows in set (0.30 sec)

しかし、復元する方法がなければ、バックアップすることに何の意味があるでしょうか、復元は --backupid オプションを用いて、引数には NDB バックアップ ID を取ります。list backups の出力を確認すれば、バックアップ ID を取得できます。ただし、これによりデータベースの内容が永続的に変更され戻せない点は注意が必要です — もちろん、それが復元の目的ではあるのですが。

mcm> restore cluster --backupid=1 c;
+--------------------------------+
| Command result                 |
+--------------------------------+
| Restore completed successfully |
+--------------------------------+
1 row in set (19.64 sec)

MCM 自体をバックアップおよび復元する機能もあるのですが、そちらの詳細については MCM のドキュメント (英語) をご確認ください。

MySQL NDB Cluster のスケーリング

NDB の使用量が増加してトラフィックが増えると、最後には NDB のスケーリングを行いたくなることでしょう。NDB をスケールするにはいくつかの方法があり、それ自体がひとつのトピックです。いくつか例を挙げると、

  • 既存のデータノードのストレージ容量を増やす
  • 読み書き容量を増やすために既存のホストに mysqld を追加する
  • ストレージ容量を増やすために既存のホストにデータノードを追加する
  • 読み書き容量を増やすためにより多くの mysqld を持つホストを追加する
  • ストレージ容量を増やすためにより多くのデータノードを持つホストを追加する

どの方法を使うにしても、MCM を使えば簡単です。

サンプルクラスターのホスト、データノード、および mysqld の数を倍増させましょう。2つの追加 OCI ホスト (pierbarrier)を起動し、その 2 つの新しいホストで、先と同様に MCM と NDB をインストールし、mcmd プロセスを起動します。

既存のサイト spierbarrier ホストを追加します。

mcm> add hosts --hosts=pier,barrier s;
+--------------------------+
| Command result           |
+--------------------------+
| Hosts added successfully |
+--------------------------+
1 row in set (1.90 sec)

mcm> list hosts s;
+---------+-----------+---------+
| Host    | Status    | Version |
+---------+-----------+---------+
| lagoon  | Available | 8.4.4   |
| reef    | Available | 8.4.4   |
| pier    | Available | 8.4.4   |
| barrier | Available | 8.4.4   |
+---------+-----------+---------+
4 rows in set (0.40 sec)

次に、新しく追加されたホストの新しいインストールパスでパッケージを更新します。

mcm> add package --hosts=pier,barrier --basedir=/export/home/tmp/foo/mcm-8.4.4-linux-glibc2.28-x86-64bit/cluster 8.4;
+----------------------------+
| Command result             |
+----------------------------+
| Package added successfully |
+----------------------------+
1 row in set (0.10 sec)

これで、create cluster からの「プロセス@ホスト」記法を使って、必要なプロセスを既存のクラスターに追加できます。これは既存クラスター全体のローリング再起動を伴うため、少し時間がかかるタスクです。NDB データベースのサイズが大きいほど、これに時間がかかる場合があります。

mcm> add process -R ndbmtd@pier,ndbmtd@barrier,mysqld@pier,mysqld@barrier c;
+----------------------------+
| Command result             |
+----------------------------+
| Process added successfully |
+----------------------------+
1 row in set (1 min 40.84 sec)

新しく追加されたプロセスが、added 状態として表示されるようになりました。

mcm> show status --process c;
+--------+----------+---------+---------+-----------+---------+
| NodeId | Process  | Host    | Status  | Nodegroup | Package |
+--------+----------+---------+---------+-----------+---------+
| 145    | ndb_mgmd | lagoon  | running |           | 8.4     |
| 1      | ndbmtd   | reef    | running | 0         | 8.4     |
| 2      | ndbmtd   | lagoon  | running | 0         | 8.4     |
| 3      | ndbmtd   | pier    | added   | n/a       | 8.4     |
| 4      | ndbmtd   | barrier | added   | n/a       | 8.4     |
| 146    | mysqld   | reef    | running |           | 8.4     |
| 147    | mysqld   | lagoon  | running |           | 8.4     |
| 149    | mysqld   | pier    | added   |           | 8.4     |
| 150    | mysqld   | barrier | added   |           | 8.4     |
| 148    | ndbapi   | *       | added   |           |         |
+--------+----------+---------+---------+-----------+---------+
10 rows in set (0.10 sec)

新しく追加されたプロセスは、start process コマンドの --added オプションを使って起動されます。

mcm> start process --added c;
+------------------------------+
| Command result               |
+------------------------------+
| Process started successfully |
+------------------------------+
1 row in set (21.63 sec)

ステータスを確認すると、全プロセスが実行中であることがわかります。

mcm> show status --process c;
+--------+----------+---------+---------+-----------+---------+
| NodeId | Process  | Host    | Status  | Nodegroup | Package |
+--------+----------+---------+---------+-----------+---------+
| 145    | ndb_mgmd | lagoon  | running |           | 8.4     |
| 1      | ndbmtd   | reef    | running | 0         | 8.4     |
| 2      | ndbmtd   | lagoon  | running | 0         | 8.4     |
| 3      | ndbmtd   | pier    | running | 1         | 8.4     |
| 4      | ndbmtd   | barrier | running | 1         | 8.4     |
| 146    | mysqld   | reef    | running |           | 8.4     |
| 147    | mysqld   | lagoon  | running |           | 8.4     |
| 149    | mysqld   | pier    | running |           | 8.4     |
| 150    | mysqld   | barrier | running |           | 8.4     |
| 148    | ndbapi   | *       | added   |           |         |
+--------+----------+---------+---------+-----------+---------+
10 rows in set (0.10 sec)

このように、MCM を用いたスケールアウトは本当に簡単です。

MySQL NDB Cluster のアップグレード

NDB の新しいバージョンが発表されると、確実にアップグレードしたくなるかもしれません。以下の例では、MySQL NDB Cluster の 9.2 イノベーション・リリースをダウンロードし、インストールおよびアップグレードします。ダウンロードした tarball は、以前の既存の cluster フォルダと同階層の、好きなフォルダに展開してください。ここではフォルダ名として cluster-9.2 を選択しましたが、お好きな名前を付けてください。


gt; ls
cluster
cluster-9.2
mcm-8.4.4
...

インストール後、新しいパッケージを追加し、名前を付けます。ここでは前と同様、バージョン名から「9.2」としましょう。

mcm> add package --basedir=/export/home/tmp/foo/mcm-8.4.4-linux-glibc2.28-x86-64bit/cluster-9.2 9.2;
+----------------------------+
| Command result             |
+----------------------------+
| Package added successfully |
+----------------------------+
1 row in set (0.20 sec)

アップグレードは、特定のクラスターに対して異なるパッケージを使用するよう mcmd に指示するだけで簡単に実現できます。

mcm> upgrade cluster --package=9.2 c;
+--------------------------------------+
| Command result                       |
+--------------------------------------+
| Cluster version changed successfully |
+--------------------------------------+
1 row in set (3 min 27.98 sec)

upgrade cluster コマンドは、すべてのクラスタープロセスのローリング再起動をトリガーし、プロセス全体を通じて NDB をオンラインに保ちながら、新しいバージョンで再起動します。

ndb_mgm クライアントを用いると、クラスターが確かに 9.2.0 にアップグレードされたことが確認できます。

$ ./cluster/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to management server at localhost port 1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)]    4 node(s)
id=1    @100.103.27.101  (mysql-9.2.0 ndb-9.2.0, Nodegroup: 0)
id=2    @100.103.28.238  (mysql-9.2.0 ndb-9.2.0, Nodegroup: 0)
id=3    @100.103.28.83  (mysql-9.2.0 ndb-9.2.0, Nodegroup: 1, *)
id=4    @100.103.24.226  (mysql-9.2.0 ndb-9.2.0, Nodegroup: 1)

[ndb_mgmd(MGM)]    1 node(s)
id=145    @100.103.28.238  (mysql-9.2.0 ndb-9.2.0)

[mysqld(API)]    5 node(s)
id=146    @100.103.27.101  (mysql-9.2.0 ndb-9.2.0)
id=147    @100.103.28.238  (mysql-9.2.0 ndb-9.2.0)
id=148 (not connected, accepting connect from any host)
id=149    @100.103.28.83  (mysql-9.2.0 ndb-9.2.0)
id=150    @100.103.24.226  (mysql-9.2.0 ndb-9.2.0)

あるいは mysql クライアントで、いずれかの mysqld に接続して確認することもできます。

$ ./cluster/bin/mysql --protocol=tcp -h 127.0.0.1 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 9.2.0-cluster MySQL Cluster Enterprise Server - Commercial

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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 variables like 'version';
+---------------+---------------+
| Variable_name | Value         |
+---------------+---------------+
| version       | 9.2.0-cluster |
+---------------+---------------+
1 row in set (0.00 sec)

MCM 自体を新しいバージョンにアップグレードすることもとても簡単で、MCMドキュメントの「Upgrading MySQL Cluster Manager」の章 (英語) で詳しく説明されています。

セキュリティ

MCM 8.4 は NDB クラスター用の TLS 構成を扱います。興味がございましたら、ブログ記事「TLS in MySQL NDB Cluster 8.4 with MCM 8.4」(英語) をご確認ください。

まとめ

MySQL NDB Cluster は素晴らしい製品であり、高パフォーマンスで、ニーズに合わせてスケーラブルに構成できます。スケーラビリティの向上に伴い、管理コストが増加しがちになりますが、MySQL Cluster Manager を使うと、複雑さを排除し、一般的な管理タスクを限りなくシンプルにできます。管理するホストとクラスタープロセスが多いほど、MCM による使いやすさの向上は大きくなります。MySQL NDB Cluster のバックアップ、復元、ローリング再構成、スケーリング、そしてアップグレードなどの複雑で時間のかかる手動操作が簡単になります。ぜひ試してみてください!

(訳者註: 本記事の元記事は、2025年3月18日に公開されました)