データノード設定時のポイント!

2008年7月22日(火)
奥野 幹也

ディスクのレイアウト設計

 メモリにデータを格納するMySQL Clusterでは、クラスタ全体が停止してもデータが消えてなくならないように、チェックポイント処理によってデータをディスクへ書き込む処理をしています。MySQL Clusterには、ローカルチェックポイント(LCP)とグローバルチェックポイント(GCP)の2種類のチェックポイントがあります。

 LCPは、データノードがメモリ上に格納しているデータの完全なコピーです。LCPは3つ作成され、それぞれ順番に更新されます。つまり、データノードはメモリ上に格納しているデータの3倍の容量をディスクへ格納しなければなりません。

 GCPは、直近にあった変更を記録するための領域です。いわゆるREDOログです。

 クラスタの稼働時、LCPとGCPは常に行われています。クラスタをシャットダウンすると、再起動時にこれら2つのチェックポイントからデータを再構成します。まず、最も新しいLCPを読み込み、その後GCPの内容を再適用します。

 LCPやGCPはそれぞれ同じディレクトリの下に置かれます。そのディレクトリはFileSystemPathオプションで設定します。FileSystemPathのデフォルト値はDataDirと同じなので、実質的にはDataDirオプションで指定します。現在のところは残念ながらLCPとGCPのPATHを別々に指定することができません。更新処理が多い場合には高速なディスク装置を使いましょう。

 LCPが行われる頻度は、TimeBetweenLocalCheckpointsオプションで設定します。このオプションは時間間隔を示すような名前がついていますが、更新のあったデータ量を指定するものです。データサイズは2のべき上で指定します。デフォルトは20ですが、これはデータサイズが2の20乗ワード(1ワード=4バイト)=4MB(厳密には4メビバイト)であることを意味し、4MB以上の更新が発生するたびにLCPが行われます。更新が多い場合には25程度まで増やすとよいでしょう。

 また、LCPがディスクへ書き込まれる速度を調整するDiskCheckpointSpeedというオプションがあります。こちらのオプションも更新頻度が高い場合には、ディスク性能の約半分程度まで増やすといいでしょう。単位はバイト/秒です。

 GCPが行われる頻度はTimeBetweenGlobalCheckpointsオプションで設定します。こちらは名前の通り時間間隔です。単位はミリ秒で、デフォルトは2000です。ほとんどの場合変更する必要はないでしょう。

 GCPを行うためのREDOログは、FragmentLogFileSizeとNoOfFragmentLogFilesという2つのオプションを使って設定します。REDOログファイルはそれぞれサイズがFragmentLogFileSizeバイトで、それが4xNoOfFragmentLogFiles個作成されます。デフォルトはそれぞれ16MBと16で、16MBx4x16=1GBのREDOログ領域が作成されることになります。REDOログは、LCPが3回実行されるまでキープしておく必要がありますので、少なくともLCP間隔の3倍より大きくなるように構成しましょう。

 また、GCPが行われるまで(デフォルトでは2000ミリ秒ごと)に更新のあったデータはすべてメモリ上に格納しておかなければなりません。そのためのバッファサイズは、RedoBufferオプションで指定します。一度に大量の変更を加えたいような場合にはRedoBufferを大きくする必要があります。デフォルトは8Mバイトです。

 ファイル操作を行う際、カーネルはファイルシステムのキャッシュを使ってデータをキャッシュしようと試みます。しかし、データノードにおいては自分自身でキャッシュやバッファの管理を行うため、ファイルシステムのキャッシュは無駄になってしまいます(いわゆるダブルバッファの問題です)。そのような事態を避けるには、ODirectオプションを1に設定します。

 MySQL Clusterにはオンラインバックアップ機能がありますが、バックアップを格納するディレクトリはBackupDataDirオプションで指定することができます。バックアップ中にLCPやGCPが遅くならないようにするには、DataDirとは別のディスクを使ってI/Oの負荷を分散しましょう。

ディスクへデータを格納する

 これまでメモリ上へデータを格納する場合の話ばかりでしたが、今度はディスクへデータを格納するときの設定について説明します。

 ディスク上へデータを格納するには、テーブルスペースとログファイルグループを定義する必要があります。それぞれCREATE TABLESPACE、CREATE LOGFILE GROUPステートメントでSQLノードから定義します。各ファイルが作成されるのはデータノード上です。ログファイルグループから先に作成します。

mysql> CREATE LOGFILE GROUP lg1 ADD UNDOFILE '/datadir/undofile'
-> INITIAL_SIZE 1073741824 UNDO_BUFFER_SIZE 33554432 ENGINE NDB;

 バージョン6.2.15ではバグがあり、128Mや1Gなどの省略形を利用してサイズを指定することができません。上記のようにバイトで指定してください。次に、事前に作成したログファイルグループを用いてテーブルスペースを作成します。

mysql> CREATE TABLESPACE ts1 ADD DATAFILE '/datadir/datafile'
-> INITIAL_SIZE 214748364800 USE LOGFILE GROUP lg1 ENGINE NDB;

 このテーブルスペースを使ってテーブルを作成するには、TABLESPACE ts1 STORAGE DISKオプションを使用します。

mysql> CREATE TABLE t1 (col1 INT UNSIGNED NOT NULL PRIMARY KEY,
-> col2 VARCHAR(200), col3 ....) TABLESPACE ts1 STORAGE DISK ENGINE=NDB;

 性能と容量のバランスをとるために特定のカラムだけをディスクへ格納するには、次のようにカラムごとにSTORAGE DISKを指定します。

mysql> CREATE TABLE t2 (col1 INT UNSIGNED NOT NULL PRIMARY KEY,
-> col2 VARCHAR(200) STORAGE DISK, col3 ....) TABLESPACE ts1 ENGINE=NDB;

 テーブルスペースおよびログファイルグループで用いるファイルは、絶対パスで指定することも相対パスで指定することも可能です。相対パスの場合、FileSystemPathにデータ(またはログ)ファイルが作成されます。I/Oの負荷を分散させるためには、絶対パスで別のディスク上に構成されたファイルシステムを使うように指定しましょう。

 ディスクベースのテーブルを多用する場合には、DiskPageBufferMemoryおよびSharedGlobalMemoryオプションを適切に設定しましょう。特にDiskPageBufferMemoryは大きめに設定しておいた方がいいでしょう。

 次はボトルネックについて、説明しましょう。

サン・マイクロシステムズ株式会社
MySQLサポートエンジニア。MySQLサーバー本体のほかにMySQL Cluster、DRBDなどを担当。障害解析からパフォーマンスチューニングまで幅広く対応。OSSの普及をライフワークとしている。http://nippondanji.blogspot.com/

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

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

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

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