MySQL Clusterの主要な設定、設定変更時の注意点

2015年8月17日(月)
山﨑 由章

本連載では、実際に「MySQL Cluster」を利用するためのチュートリアルとなるように、その特徴と基本的なアーキテクチャからインストール方法、基本的な操作などをコマンド付きで解説していきます。第3回の今回は、MySQL Clusterの主要な設定や、設定変更時の注意点について紹介します。

※記事中のコマンド例は、第2回でインストールした環境を前提としています(追加設定として、mysqlユーザーの環境変数"PATH"に"/home/mysql/mysqlc/bin"も追加した状態を前提としています)。

パラメータ変更時の注意点とパラメータ変更例

パラメータ変更時の再起動タイプ

MySQL Cluster固有のパラメータは、動的に変更できるようにはなっていません。しかし、各ノードを1つずつ順番に再起動する「ローリングリスタート」という手法を用いることで、システム全体としてはサービスを停止せずにパラメータを変更できます。

ただし、NodeIdなど一部のパラメータを変更する時はローリングリスタートではなく、「システムリスタート」というシステム全体の再起動が必要です(パラメータ変更時にシステムリスタートが必要なものは全体の1割程度と少数で、大半のパラメータはローリングリスタートにより変更可能です)。

また、ログファイルのサイズ変更やデータファイルの配置ディレクトリ変更といった一部のパラメータ変更では、「イニシャルリスタート」と呼ばれる、データファイルを初期化する再起動方法が必要となります。イニシャルリスタート実行時は、--initialオプションを使用してデータノードを再起動します。

それぞれのパラメータを変更する時にどの再起動方法が必要となるかは、下記のマニュアルで確認できます。マニュアル中の「再起動タイプ」の項目から必要な再起動方法を確認してください。

コンフィグレーションキャッシュ

デフォルト設定では、管理ノードで「コンフィギュレーションキャッシュ」という機能が有効になっています。この機能は、管理ノードがconfig.iniを読み込んだ時にその内容を独自の形式に変換し、--configdirオプションで指定したディレクトリに格納します。そして、次回起動時にはconfig.iniを読み込まずにキャッシュから設定をロードします。そのため、「config.iniを変更して再起動したが、設定変更した内容が反映されていない」という現象が発生し得ます。

config.iniを読み込みし直すには、管理ノード起動時に--reloadオプションもしくは--initialオプションを指定します。--reloadオプションを指定した場合は古い設定の履歴が--configdirに溜まり続けます。履歴を削除したい場合は--initialオプションを指定します。

ローリングリスタートの例

リスト1は、ローリングリスタートによりデータノードのパラメータを変更している例です。ここではパラメータ"DataMemory"および"IndexMemory"の設定値を拡張し、ローリングリスタートによってシステムを停止せずに設定変更を反映しています(DataMemoryおよびIndexMemoryの説明は後述)。管理ノード→データノード→SQLノードの順番に1台ずつ再起動していますが、管理ノードを再起動する前にconfig.iniに”DataMemory”、”IndexMemory”を追加しています(リスト2)。

リスト1:ローリングリスタートの例(メモリ設定の変化が確認できる部分に"//メモリ設定が変わっている"と記入)

$ ndb_mgm -e "SHOW"
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @127.0.0.1  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=3    @127.0.0.1  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @127.0.0.1  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]   2 node(s)
id=4 (not connected, accepting connect from any host)
id=5 (not connected, accepting connect from any host)

$ #データノードのメモリ設定および現在のメモリ使用量を確認
$ ndb_mgm -e "ALL REPORT MEMORY"
Connected to Management Server at: localhost:1186
Node 2: Data usage is 0%(23 32K pages of total 2560)
Node 2: Index usage is 0%(20 8K pages of total 2336)
Node 3: Data usage is 0%(23 32K pages of total 2560)
Node 3: Index usage is 0%(20 8K pages of total 2336)

$ #下記コマンド実行前に設定ファイルconfig.iniを修正しておく
$ #config.iniの修正内容はリスト2参照
$
$ #管理ノードの再起動
$ #管理ノードのノードID(1)を指定して、STOPコマンドを実行
$ ndb_mgm -e "1 STOP"
Connected to Management Server at: localhost:1186
Node 1 has shutdown.
Disconnecting to allow Management Server to shutdown
$ #config.iniの変更を反映するために、--reloadオプション付きで管理ノードを起動
$ ndb_mgmd --reload --configdir=/home/mysql/mysqlc -f /home/mysql/mysqlc/config.ini
MySQL Cluster Management Server mysql-5.6.24 ndb-7.4.6
$
$ #データノードの再起動
$ #データノードのノードID(2)を指定して、RESTARTコマンドを実行
$ ndb_mgm -e "2 RESTART"
Connected to Management Server at: localhost:1186
2015-07-20 11:43:20 2702 [Note] NDB Schema dist: Data node: 2 failed, subscriber bitmask 00
2015-07-20 11:43:20 2629 [Note] NDB Schema dist: Data node: 2 failed, subscriber bitmask 00
Node 2 is being restarted

$ #データノード(ノードID=2)の設定が変わっていることを確認
$ ndb_mgm -e "ALL REPORT MEMORY"
Connected to Management Server at: localhost:1186
Node 2: Data usage is 0%(23 32K pages of total 32768)   //メモリ設定が変わっている
Node 2: Index usage is 0%(20 8K pages of total 32800)   //メモリ設定が変わっている
Node 3: Data usage is 0%(23 32K pages of total 2560)
Node 3: Index usage is 0%(20 8K pages of total 2336)

$ #データノードのノードID(3)を指定して、RESTARTコマンドを実行
$ ndb_mgm -e "3 RESTART"
Connected to Management Server at: localhost:1186
2015-07-20 11:44:07 2702 [Note] NDB Schema dist: Data node: 3 failed, subscriber bitmask 00
2015-07-20 11:44:07 2629 [Note] NDB Schema dist: Data node: 3 failed, subscriber bitmask 00
Node 3 is being restarted

$ #データノード(ノードID=3)の設定が変わっていることを確認(赤字部分から、メモリ設定が変わっていることが確認できる)
$ ndb_mgm -e "ALL REPORT MEMORY"
Connected to Management Server at: localhost:1186
Node 2: Data usage is 0%(23 32K pages of total 32768)
Node 2: Index usage is 0%(20 8K pages of total 32800)
Node 3: Data usage is 0%(23 32K pages of total 32768)   //メモリ設定が変わっている
Node 3: Index usage is 0%(20 8K pages of total 32800)   //メモリ設定が変わっている

$
$ #SQLノードの再起動(出力は省略)
$ mysqladmin -uroot -h 127.0.0.1 -P3306 shutdown
$ mysqld --defaults-file=/home/mysql/mysqlc/my1.cnf &
$ mysqladmin -uroot -h 127.0.0.1 -P3307 shutdown
$ mysqld --defaults-file=/home/mysql/mysqlc/my2.cnf &

リスト2:パラメータ変更後のconfig.ini(パラメータ追加部分に"//追加部分"と記入)

#管理ノードの設定項目
[ndb_mgmd]
DataDir = /home/mysql/mysqlc/data/mgmd/
HostName = localhost

#データノード共通の設定項目
[ndbd default]
#データの多重化の数 2-4が指定可能
NoOfReplicas = 2
#レコードとオーダードインデックスを格納するメモリ領域のサイズを指定      //追加部分
DataMemory=1G   //追加部分
#ハッシュインデックスを格納するメモリ領域のサイズを指定    //追加部分
IndexMemory=256M        //追加部分

#各データノードの個別設定項目
[ndbd]
DataDir = /home/mysql/mysqlc/data/data1/
[ndbd]
DataDir = /home/mysql/mysqlc/data/data2/

#各SQLノードの個別設定項目
[mysqld]
[mysqld]

config.iniの書式

config.iniにパラメータを設定する時には、それぞれのノードに対応するセクションに設定内容を記載します。config.iniのセクション名と意味については表1を参照してください。

表1:config.ini内のセクション名と意味

セクション名意味
[ndb_mgmd default]全管理ノードに共通する設定を記述する
(本連載の例では、管理ノードが1台の構成のため使用していない)
[ndb_mgmd]管理ノードの設定を記述する
[ndbd default]全データノードに共通する設定を記述する
[ndbd]データノードの設定を記述する
[mysqld]SQLノードの設定を記述する

注意事項として、「[XXX default]セクションは個別のセクションよりも前に記述する必要がある」という点です。本連載で使用しているconfig.iniでも、[ndbd]セクションより前に[ndb default]セクションを記述しています。

また、config.iniに設定しなかったパラメータについては、デフォルト値が自動的に設定されます。各パラメータのデフォルト値についても、前述のマニュアルで確認できます。

主要なパラメータ設定

ここからは、MySQL Clusterの主要なパラメータ設定について解説します。本記事で紹介していないパラメータや各パラメータの再起動タイプ、デフォルト値などの詳細は、前述のマニュアルを参照してください。

全ノードに設定できるパラメータ

”NodeID”と”HostName”は、管理ノード、SQLノード、データノードに共通して設定できます。実際に設定する時には、config.ini内の対応するセクションに設定値を記述します。

NodeId

ノードIDです。各ノードに一意な番号を割り当てる必要があります。省略することも可能で、その場合は各ノードに自動的にIDが割り振られます。

HostName

ノードが存在するホスト名です。SQLノード、データノードにHostNameを明示的に指定すると、意図しないサーバがクラスタに組み込まれることを防ぐことができます。SQLノード、データノードが管理ノードに接続する時に、管理ノードはNodeIdとHostNameの組み合わせで一致するものがあるかどうかを検査し、接続を許可します。

管理ノードに設定できるパラメータ

管理ノードに設定すべきパラメータはそれほど多くありません。主要なものに”DataDir”と”ArbitrationRank”があります。

DataDir

管理ノードが生成する各種ファイル(ログファイルなど)が格納されるディレクトリを指定します。

ArbitrationRank

スプリットブレイン発生時、そのノードがArbitratorとして選択される優先順位を設定します。Arbitratorとして選択されたノードがArbitration(調停)を行います。設定できる値は3つあり、それぞれの設定値の意味は表2の通りです。

このパラメータはSQLノードにも設定できます。設定を変更すると、SQLノードをArbitratorとして使用することもできます。スプリットブレインおよびArbitrationについては、第1回を参照してください。

表2:ArbitrationRankの設定値

設定値意味
0(SQLノードのデフォルト値)Arbitratorとして使用されない
1(管理ノードのデフォルト値)優先度が高く、優先度の低いArbitratorより優先してArbitratorになる
2優先度が低く、優先度の高いArbitratorが使用できない場合のみArbitratorになる

SQLノードに設定できるパラメータ

config.iniで設定するSQLノードのパラメータは多くありません。また、今回のインストール例のconfig.iniでも採用している通り、SQLノードの数だけ[mysqld]セクションを書くだけでもSQLノードを使用できます。

ただし、通常のMySQLサーバと同じく、SQLノードはmy.cnfで各種パラメータを設定できます。その中にはMySQL Clusterに特化したパラメータもあり、主要なものにndb-cluster-connection-poolがあります。

ndb-cluster-connection-pool(config.iniではなくmy.cnfに設定するパラメータ)

複数のコネクションを用いてSQLノードからデータノードへ接続できます。デフォルト値は1で、SQLノードからデータノードへのコネクションは1本だけですが、2以上の値を設定すると複数のコネクションを生成でき、SQL処理の並列性が向上します。

複数のコネクションを生成した場合、図1のようにコネクション毎にNodeIdが割り振られます。そのため、ndb-cluster-connection-poolを2以上に設定する場合は、config.ini内の[mysqld]セクションを対応する数だけ増やす必要があります(例:SQLノードが2ノードで、それぞれのSQLノードにおいてmy.cnf内で”ndb-cluster-connection-pool=2”と設定した場合はconfig.iniの[mysqld]セクションが4つ必要)。

データノードに設定できるパラメータ

データノードはMySQL Clusterの中核であるため、設定できるパラメータも多数あります。主要なパラメータをいくつかのカテゴリに分けて解説します。なお、バックアップ関連のパラメータについては次回で解説予定のため、今回は割愛しています。

冗長化の設定、ファイル配置/ファイルサイズの設定

NoOfReplicas

レプリカの数を設定します。通常は2を指定します。2を指定するとデータが2重化され、データノードが2台1組で同じデータを持つようになります。

NoOfReplicasに2を指定した場合、データノードの台数は2の倍数になります。図2は、NoOfReplicas=2、データノード数4台の場合の構成イメージです。

※このパラメータは1~4の範囲で指定できますが、原稿執筆時点(2015年7月現在)で公式にサポートされているのは1~2までです(3~4に設定した場合に「動作しない」というわけではなく、本番環境で3以上に設定した稼働実績もあります。マニュアルには「指定可能な最大値は4ですが、現時点で実際にサポートされている値は1と2だけです。」と記載されています)。

DataDir

トレースファイル、ログファイル、PIDファイル、およびエラーログが格納されるディレクトリを指定します。

FileSystemPath

LCP、GCPなどの各種データが格納されるディレクトリを指定します。指定しない場合のデフォルト値はDataDirと同一です。LCP、GCPについては、次回で解説する予定です。

NoOfFragmentLogFiles

REDOログファイルの数を指定します。FragmentLogFileSizeとの組み合わせでREDOログファイルの総容量が決まります。

FragmentLogFileSize

REDOログファイルのサイズを指定します。REDOログファイルは4つのファイルが1セットとして扱われるため、「FragmentLogFileSize×4×NoOfFragmentLogFiles」がREDOログファイルの総容量となります。REDOログファイルのサイジングについては、今後の連載で解説予定です。

メモリ割り当て

インメモリデータベースであるMySQL Clusterにとって、メモリ割り当ての設定は非常に重要です。

特に、IndexMemoryとDataMemoryが不足すると新規データ追加時にエラーが発生し、データが追加できなくなります。そのため、システムで使用する全データが格納できるサイズをIndexMemoryとDataMemoryに設定しておく必要があります。IndexMemoryとDataMemoryのサイジング方法については、今後の連載で解説予定です。

IndexMemory

ハッシュインデックスを格納するためのメモリ領域です。主キーやユニークキーで使用されます。MySQL Clusterが使用するインデックスの構造については、今後の連載で解説予定です。

DataMemory

レコードとオーダードインデックスを格納するためのメモリ領域です。MySQL Clusterが使用するインデックスの構造については、今後の連載で解説予定です。

StringMemory

テーブル名などのメタデータに使用するメモリサイズを指定します。大半のプロジェクトではこの値はデフォルト値で問題ありませんが、MySQL Clusterに格納するテーブル数が非常に多い場合(1000個以上)などにメモリサイズが不足すると、エラー733「Out of string memory, please modify StringMemory config parameter: Permanent error: Schema error」が発生します。このエラーが発生する場合は、StringMemoryの設定値を大きくすることでエラーを回避できます。デフォルト値は25で、「テーブル数やテーブル名長などを元に自動的に計算された値の25%」を意味します。

RedoBuffer

REDOログに対するバッファサイズです。トランザクションをコミットするまでの変更は、REDOバッファに保持する必要があります。そのため、大きなトランザクション(COMMITを行うまでのデータ更新量が多いトランザクション)が実行される環境では、設定値を大きくする必要があります。このパラメータの設定値が低すぎる場合は、エラー1221「REDO log buffers overloaded」が発生します。その場合は、設定値を大きくしてください。

最大値の設定(MaxNoOfXXX)

MaxNoOfXXXには各種の上限値を設定します。これらの設定値を増やすと、その分メモリ領域が必要となるため、やみくもに大きな値を設定することは推奨されません。また、これらの設定値が不足すると実行した処理がエラーになる場合があります。その場合は、設定値を大きくすることでエラーを回避できます。

MaxNoOfAttributes

アトリビュート(属性)数の最大値を指定します。アトリビュートとは、カラムやインデックスなど、テーブルに含まれる要素のことです。

MaxNoOfTables

テーブルの最大個数を指定します。

MaxNoOfOrderedIndexes

オーダードインデックスの最大の個数を指定します。

MaxNoOfUniqueHashIndexes

ユニークキーの最大の個数を指定します。

MaxNoOfTriggers

データノード内で内部的に利用されるトリガーの最大値を指定します(ユーザーが作成するトリガーとは関係ありません)。

MaxNoOfConcurrentTransactions

個々のデータノードに割り当てられるアクティブなトランザクションに対するトランザクションレコード数の最大値を指定します。トランザクションレコード数には、「トランザクション内でアクセスするテーブルの数+1」が割り当てられます。

MaxNoOfConcurrentOperations

同時にロックできる行数の最大値を指定します。通常、このパラメータはデフォルト設定の32Kで十分ですが、多数のレコードを変更するバッチ系の処理がある場合には、この値を大きくする必要があります。

MaxNoOfConcurrentScans

同時に実行可能なスキャン操作(テーブルスキャンおよびインデックススキャン)の数の最大値を指定します。

MaxParallelScansPerFragment

フラグメント毎に実行できるスキャンの数の最大値を指定します。

パフォーマンスチューニング関係

ODirect

このパラメータを有効にすると、LCP、GCPおよびバックアップ時にO_DIRECT(Direct I/O)を使用します。これにより、多くの場合CPU使用率が下がります。特にLinux上でカーネル2.6以降を使用する場合は、ODirectを有効にすることを推奨します。このパラメータは、デフォルトでは無効になっています。

MaxNoOfExecutionThreads

データノードで実行されるスレッド数を制御できるパラメータです。通常は、データノードが存在するマシンのCPUコア数と同じ数を設定します。

ThreadConfig

スレッドの種類毎にスレッド数と割り当てるCPUを指定するためのパラメータです。前述のMaxNoOfExecutionThreadsを使用するよりも、より詳細にスレッドをチューニングできます。

おわりに

今回は、MySQL Clusterの主要な設定や、設定変更時の注意点について解説しました。次回は、MySQL Clusterのバックアップ/リストア方法について解説する予定です。

※本稿において示されている見解は、私自身の見解であって、私の所属するオラクルの見解を必ずしも反映したものではありません。

日本オラクル株式会社

MySQLのセールスコンサルタント。元々はOracleデータベースのコンサルティング、サポート等に従事していたが、オープンソースとフリーソフトウェア(自由なソフトウェア)の世界に興味を持ち、MySQLの仕事を始める。趣味は旅行と美味しいものを食べること。

連載バックナンバー

データベース技術解説

MySQL Clusterにおけるチューニングの基礎

2015/12/10
第9回の今回は、MySQL Clusterにおけるチューニングの基礎について解説します。
データベース技術解説

MySQL Clusterにおけるレプリケーション環境構築例

2015/11/19
MySQL Clusterにおけるレプリケーション環境構築の具体例について解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています