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 ホスト (便宜的に lagoon と reef と名付けましょう) を起動します。次に、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 ホスト (pier と barrier)を起動し、その 2 つの新しいホストで、先と同様に MCM と NDB をインストールし、mcmd プロセスを起動します。
既存のサイト s に pier と barrier ホストを追加します。
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日に公開されました)

