MySQLをチューニング,そしてスケールアップ/スケールアウトへ

第9回 MySQL Clusterによるスケールアウト構成

この記事を読むのに必要な時間:およそ 3 分

第9回はMySQL Clusterを用いたスケールアウト構成に関して,アーキテクチャと特徴的なSQLとNoSQLのハイブリッドAPIについて解説します。

MySQL Clusterとは

MySQL Clusterはシェアードナッシング型(共有ディスクや共有ストレージ不使用)のアクティブ・アクティブ型データベースクラスタです。MySQL Cluster内の全てのコンポーネントが多重化され,単一障害点(SPOF:Single Point Of Failure)がなく,データを管理するノードに障害が発生した場合はそのノードを切り離すだけで処理を継続できるため高い可用性を持っています。

システム拡張性の観点からは,MySQL Clusterのノードを追加することで処理負荷の分散と格納できるデータ容量の拡張ができる,スケールアウト型の構成となります。特に重要なのは,参照処理性能の向上だけではなく,MySQLサーバのレプリケーションでは性能向上させることができない更新処理性能の向上を図ることができる点です。

MySQL Clusterの開発の経緯

元々エリクソン社が立ち上げたベンチャーAlzato社を2003年に旧MySQL社が買収し,Alzato社が通信業界向けに分散型の高可用性データベースクラスタとして開発していたNDB ClusterをMySQLサーバのndbclusterストレージエンジンとして統合したのがMySQL Clusterです。MySQL 5.1.23までは,MySQLサーバとMySQL Clusterは同一のパッケージに含まれていましたが,MySQL 5.1.24で別パッケージに分離され,MySQL Cluster 6.2.15以降はMySQLサーバとは別の製品としてリリースされています。バージョン番号や製品リリースのタイミングはMySQLサーバとは独立しています。2015年6月現在の最新製品版はMySQL Cluster 7.4です。

MySQL Clusterの用途と事例

開発当初のターゲットとしていた通信業界でMySQL Clusterは幅広く利用されています。携帯電話ネットワーク向けの機器への組込みではAlcatel-Lucent,NokiaやNECなど大手通信機器ベンダでの活用事例があるほか,携帯電話キャリアでのユーザ情報管理やコンテンツ配信プラットフォームとしても多数利用されています。MySQL Clusterのスケールアウト構成を活かして利用者やトラフィックが急激に増加していくオンラインゲームでの利用が国内でも広がっています。

また単一障害点が無いため高い耐障害性を持ち,かつ共有ディスクを必要としないシンプルなアーキテクチャのため,アメリカ海軍の航空母艦における航空管制支援システムやクラウド上にMySQL Clusterを導入して世界的な不正な取引の検知に活用しているPayPalなど,ミッションクリティカルなシステムでの利用事例も少なくありません。

MySQL Clusterのアーキテクチャ

MySQL Clusterは別々の役割を持つ複数のノードがあります。以下では各ノードの役割を解説していきます。下記の図1はSQLノード2台,データノード4台,管理ノード2台で構成した例です。

図1 MySQL Clusterのアーキテクチャ

図1 MySQL Clusterのアーキテクチャ

SQLインターフェースとしてのSQLノード

アプリケーションやアプリケーションサーバからドライバ等を経由して接続する先はSQLノードです。このSQLノードは基本的にMySQLサーバにndbclusterストレージエンジンを追加したものになり,OS上のプロセスもmysqldです。SQLノードではユーザ認証関連やテーブル定義などのメタデータは持っていますが,ndbclusterストレージエンジンを使用しているテーブルのデータはデータノードに格納されます。

トランザクションとデータを管理するデータノード

データノードはMySQL Clusterの構成の中でも最も重要な役割を持っています。データやインデックス,およびトランザクションはデータノードが管理します。新しいレコードが追加される際は,データノードの内の1台がトランザクションの管理を行います。また自動的にパーティショニングが行われ,かつ複数のデータノードに記録されてから応答を返します。主キーのハッシュ値によるパーティショニングが基本となり,他にユニークキーのハッシュ値によるパーティショニングも可能です。

データは多重化されているため,1台のデータノードが停止した場合はハートビートで検出次第クラスタから切り離し,SQLノードからのアクセスも問題が発生していないノードのみに振り分けられてクラスタとしては継続的に利用できます。同じデータを管理するノードはデフォルトでは2台ですが,最大で4重の冗長性を持たせることができます。データを多重化する台数を増やせば耐障害性が高まりますが,同時に応答時間が長くなりスループットの低下を招きます。

構成の設定を管理する補助的な役割の管理ノード

管理ノードは名前から感じるほどの重要度はありません。管理ノードの役割は,各ノードの設定を管理し,各ノードの起動の際はまず管理ノードにアクセスしてこの設定情報を受け取り起動します。その他,データノードの停止やバックアップ,リカバリの指示を出しています。

ネットワーク障害が発生してデータノード間で通信が途絶えたものの,SQLノードからはアクセスできてしまうスプリットブレイン状態になった場合は,管理ノードがArbitration(調停)を行ってデータの不整合が起きないように一部のデータノードを停止します。ただしこのArbitrationは管理ノードだけではなくSQLノードが実行するように設定することができます。

表1 MySQLの各ノードの役割

ノード プロセス名 主な役割
SQLノード mysqld SQLアプリケーションとのデータのやり取り
ユーザ認証と権限付与
SQL文のパースと実行計画の最適化
データノードへの処理の命令と結果の取得
データノード ndbmtd トランザクション管理
データ管理
管理ノード ndb_mgmd 各ノードの設定の管理
起動停止
バックアップ開始の指示
Arbitration(スプリットブレイン解消)

著者プロフィール

梶山隆輔

MySQL Sales Consulting Senior Manager。

日本オラクル(株)において,MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リーダー。多国籍なMySQL部門にて,オーストラリア,インド,台湾などに在籍するチームメンバーを束ね,アジア太平洋地域の25以上の国や地域でのMySQL普及やビジネスの拡大をミッションとする。

コメント

コメントの記入