本連載では、実際に「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:ローリングリスタートの例(メモリ設定の変化が確認できる部分に"//メモリ設定が変わっている"と記入)
02 | Connected to Management Server at: localhost:1186 |
06 | id=2 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *) |
07 | id=3 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0) |
09 | [ndb_mgmd(MGM)] 1 node(s) |
10 | id=1 @127.0.0.1 (mysql-5.6.24 ndb-7.4.6) |
12 | [mysqld(API)] 2 node(s) |
13 | id=4 (not connected, accepting connect from any host) |
14 | id=5 (not connected, accepting connect from any host) |
16 | $ #データノードのメモリ設定および現在のメモリ使用量を確認 |
17 | $ ndb_mgm -e "ALL REPORT MEMORY" |
18 | Connected to Management Server at: localhost:1186 |
19 | Node 2: Data usage is 0%(23 32K pages of total 2560) |
20 | Node 2: Index usage is 0%(20 8K pages of total 2336) |
21 | Node 3: Data usage is 0%(23 32K pages of total 2560) |
22 | Node 3: Index usage is 0%(20 8K pages of total 2336) |
24 | $ #下記コマンド実行前に設定ファイルconfig.iniを修正しておく |
25 | $ #config.iniの修正内容はリスト2参照 |
28 | $ #管理ノードのノードID(1)を指定して、STOPコマンドを実行 |
30 | Connected to Management Server at: localhost:1186 |
32 | Disconnecting to allow Management Server to shutdown |
33 | $ #config.iniの変更を反映するために、--reloadオプション付きで管理ノードを起動 |
34 | $ ndb_mgmd --reload --configdir=/home/mysql/mysqlc -f /home/mysql/mysqlc/config.ini |
35 | MySQL Cluster Management Server mysql-5.6.24 ndb-7.4.6 |
38 | $ #データノードのノードID(2)を指定して、RESTARTコマンドを実行 |
39 | $ ndb_mgm -e "2 RESTART" |
40 | Connected to Management Server at: localhost:1186 |
41 | 2015-07-20 11:43:20 2702 [Note] NDB Schema dist: Data node: 2 failed, subscriber bitmask 00 |
42 | 2015-07-20 11:43:20 2629 [Note] NDB Schema dist: Data node: 2 failed, subscriber bitmask 00 |
43 | Node 2 is being restarted |
45 | $ #データノード(ノードID=2)の設定が変わっていることを確認 |
46 | $ ndb_mgm -e "ALL REPORT MEMORY" |
47 | Connected to Management Server at: localhost:1186 |
48 | Node 2: Data usage is 0%(23 32K pages of total 32768) //メモリ設定が変わっている |
49 | Node 2: Index usage is 0%(20 8K pages of total 32800) //メモリ設定が変わっている |
50 | Node 3: Data usage is 0%(23 32K pages of total 2560) |
51 | Node 3: Index usage is 0%(20 8K pages of total 2336) |
53 | $ #データノードのノードID(3)を指定して、RESTARTコマンドを実行 |
54 | $ ndb_mgm -e "3 RESTART" |
55 | Connected to Management Server at: localhost:1186 |
56 | 2015-07-20 11:44:07 2702 [Note] NDB Schema dist: Data node: 3 failed, subscriber bitmask 00 |
57 | 2015-07-20 11:44:07 2629 [Note] NDB Schema dist: Data node: 3 failed, subscriber bitmask 00 |
58 | Node 3 is being restarted |
60 | $ #データノード(ノードID=3)の設定が変わっていることを確認(赤字部分から、メモリ設定が変わっていることが確認できる) |
61 | $ ndb_mgm -e "ALL REPORT MEMORY" |
62 | Connected to Management Server at: localhost:1186 |
63 | Node 2: Data usage is 0%(23 32K pages of total 32768) |
64 | Node 2: Index usage is 0%(20 8K pages of total 32800) |
65 | Node 3: Data usage is 0%(23 32K pages of total 32768) //メモリ設定が変わっている |
66 | Node 3: Index usage is 0%(20 8K pages of total 32800) //メモリ設定が変わっている |
70 | $ mysqladmin -uroot -h 127.0.0.1 -P3306 shutdown |
71 | $ mysqld --defaults-file=/home/mysql/mysqlc/my1.cnf & |
72 | $ mysqladmin -uroot -h 127.0.0.1 -P3307 shutdown |
73 | $ mysqld --defaults-file=/home/mysql/mysqlc/my2.cnf & |
リスト2:パラメータ変更後のconfig.ini(パラメータ追加部分に"//追加部分"と記入)
03 | DataDir = /home/mysql/mysqlc/data/mgmd/ |
10 | #レコードとオーダードインデックスを格納するメモリ領域のサイズを指定 //追加部分 |
12 | #ハッシュインデックスを格納するメモリ領域のサイズを指定 //追加部分 |
13 | IndexMemory=256M //追加部分 |
17 | DataDir = /home/mysql/mysqlc/data/data1/ |
19 | DataDir = /home/mysql/mysqlc/data/data2/ |
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内の対応するセクションに設定値を記述します。
ノードIDです。各ノードに一意な番号を割り当てる必要があります。省略することも可能で、その場合は各ノードに自動的にIDが割り振られます。
ノードが存在するホスト名です。SQLノード、データノードにHostNameを明示的に指定すると、意図しないサーバがクラスタに組み込まれることを防ぐことができます。SQLノード、データノードが管理ノードに接続する時に、管理ノードはNodeIdとHostNameの組み合わせで一致するものがあるかどうかを検査し、接続を許可します。
管理ノードに設定できるパラメータ
管理ノードに設定すべきパラメータはそれほど多くありません。主要なものに”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があります。
複数のコネクションを用いて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の中核であるため、設定できるパラメータも多数あります。主要なパラメータをいくつかのカテゴリに分けて解説します。なお、バックアップ関連のパラメータについては次回で解説予定のため、今回は割愛しています。
冗長化の設定、ファイル配置/ファイルサイズの設定
レプリカの数を設定します。通常は2を指定します。2を指定するとデータが2重化され、データノードが2台1組で同じデータを持つようになります。
NoOfReplicasに2を指定した場合、データノードの台数は2の倍数になります。図2は、NoOfReplicas=2、データノード数4台の場合の構成イメージです。
※このパラメータは1~4の範囲で指定できますが、原稿執筆時点(2015年7月現在)で公式にサポートされているのは1~2までです(3~4に設定した場合に「動作しない」というわけではなく、本番環境で3以上に設定した稼働実績もあります。マニュアルには「指定可能な最大値は4ですが、現時点で実際にサポートされている値は1と2だけです。」と記載されています)。
トレースファイル、ログファイル、PIDファイル、およびエラーログが格納されるディレクトリを指定します。
LCP、GCPなどの各種データが格納されるディレクトリを指定します。指定しない場合のデフォルト値はDataDirと同一です。LCP、GCPについては、次回で解説する予定です。
REDOログファイルの数を指定します。FragmentLogFileSizeとの組み合わせでREDOログファイルの総容量が決まります。
REDOログファイルのサイズを指定します。REDOログファイルは4つのファイルが1セットとして扱われるため、「FragmentLogFileSize×4×NoOfFragmentLogFiles」がREDOログファイルの総容量となります。REDOログファイルのサイジングについては、今後の連載で解説予定です。
メモリ割り当て
インメモリデータベースであるMySQL Clusterにとって、メモリ割り当ての設定は非常に重要です。
特に、IndexMemoryとDataMemoryが不足すると新規データ追加時にエラーが発生し、データが追加できなくなります。そのため、システムで使用する全データが格納できるサイズをIndexMemoryとDataMemoryに設定しておく必要があります。IndexMemoryとDataMemoryのサイジング方法については、今後の連載で解説予定です。
ハッシュインデックスを格納するためのメモリ領域です。主キーやユニークキーで使用されます。MySQL Clusterが使用するインデックスの構造については、今後の連載で解説予定です。
レコードとオーダードインデックスを格納するためのメモリ領域です。MySQL Clusterが使用するインデックスの構造については、今後の連載で解説予定です。
テーブル名などのメタデータに使用するメモリサイズを指定します。大半のプロジェクトではこの値はデフォルト値で問題ありませんが、MySQL Clusterに格納するテーブル数が非常に多い場合(1000個以上)などにメモリサイズが不足すると、エラー733「Out of string memory, please modify StringMemory config parameter: Permanent error: Schema error」が発生します。このエラーが発生する場合は、StringMemoryの設定値を大きくすることでエラーを回避できます。デフォルト値は25で、「テーブル数やテーブル名長などを元に自動的に計算された値の25%」を意味します。
REDOログに対するバッファサイズです。トランザクションをコミットするまでの変更は、REDOバッファに保持する必要があります。そのため、大きなトランザクション(COMMITを行うまでのデータ更新量が多いトランザクション)が実行される環境では、設定値を大きくする必要があります。このパラメータの設定値が低すぎる場合は、エラー1221「REDO log buffers overloaded」が発生します。その場合は、設定値を大きくしてください。
最大値の設定(MaxNoOfXXX)
MaxNoOfXXXには各種の上限値を設定します。これらの設定値を増やすと、その分メモリ領域が必要となるため、やみくもに大きな値を設定することは推奨されません。また、これらの設定値が不足すると実行した処理がエラーになる場合があります。その場合は、設定値を大きくすることでエラーを回避できます。
アトリビュート(属性)数の最大値を指定します。アトリビュートとは、カラムやインデックスなど、テーブルに含まれる要素のことです。
テーブルの最大個数を指定します。
オーダードインデックスの最大の個数を指定します。
ユニークキーの最大の個数を指定します。
データノード内で内部的に利用されるトリガーの最大値を指定します(ユーザーが作成するトリガーとは関係ありません)。
個々のデータノードに割り当てられるアクティブなトランザクションに対するトランザクションレコード数の最大値を指定します。トランザクションレコード数には、「トランザクション内でアクセスするテーブルの数+1」が割り当てられます。
同時にロックできる行数の最大値を指定します。通常、このパラメータはデフォルト設定の32Kで十分ですが、多数のレコードを変更するバッチ系の処理がある場合には、この値を大きくする必要があります。
同時に実行可能なスキャン操作(テーブルスキャンおよびインデックススキャン)の数の最大値を指定します。
フラグメント毎に実行できるスキャンの数の最大値を指定します。
パフォーマンスチューニング関係
このパラメータを有効にすると、LCP、GCPおよびバックアップ時にO_DIRECT(Direct I/O)を使用します。これにより、多くの場合CPU使用率が下がります。特にLinux上でカーネル2.6以降を使用する場合は、ODirectを有効にすることを推奨します。このパラメータは、デフォルトでは無効になっています。
データノードで実行されるスレッド数を制御できるパラメータです。通常は、データノードが存在するマシンのCPUコア数と同じ数を設定します。
スレッドの種類毎にスレッド数と割り当てるCPUを指定するためのパラメータです。前述のMaxNoOfExecutionThreadsを使用するよりも、より詳細にスレッドをチューニングできます。
おわりに
今回は、MySQL Clusterの主要な設定や、設定変更時の注意点について解説しました。次回は、MySQL Clusterのバックアップ/リストア方法について解説する予定です。
※本稿において示されている見解は、私自身の見解であって、私の所属するオラクルの見解を必ずしも反映したものではありません。