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 のスケーリング
As your usage of NDB increases and traffic ramps up you may eventually want to start scaling NDB. There are a number of ways you can scale NDB, and it is a topic in its own. To name a few, you mayNDB の使用量が増加してトラフィックが増えると、最後には 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 を選択しましたが、お好きな名前を付けてください。
$> 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日に公開されました)

