第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のアーキテクチャ
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 Clusterの拡張性
高いスループットを実現するMySQL Cluster
データノードはデフォルトではデータとインデックスを全てメモリ上で管理するインメモリデータベースとして稼働するため、通常のMySQLサーバと比較して極めて低いレイテンシとなり、より多くの処理に対応できます。インメモリデータベースといっても、トランザクションログはディスクに書き込まれ、LCPと呼ばれるタイミングでメモリ上のデータも定期的にディスクに書き出されるため、クラスタ全体の停止時にもデータを失うことはありません。
MySQL Clusterを利用する最大のメリットは極めて高いスループットを実現でき、かつデータノードの追加に応じてスループットが向上していく点です。下記の図2 はMySQL Cluster開発チームが実施したベンチマークテストにて、16台のデータノードで参照更新のSQLを秒間250万件処理した際のグラフです。極めて高い性能を実現できているだけではなく、ノードを追加するにつれて線形に性能が向上している点にもご注目ください。
図2 MySQL Cluster 7.4のベンチマーク結果(DBT-2)( 注1 )
参考URL
Mikael Ronstrom: 200M reads per second in MySQL Cluster 7.4
無停止拡張とオンラインメンテナンス
ノード追加による高い性能拡張性があったとしても、ノードを追加するたびにクラスタを停止するようなことがあってはミッションクリティカルなシステムで採用できません。MySQL Clusterは無停止でノードを追加することが可能になっています。
またオンラインバックアップが可能なことはもちろん、列の追加などのテーブル定義の変更もアプリケーションの処理を邪魔することなく実施できます。データノードのバージョンアップやOSのパッチ適用、またプロセスの再起動が必須となるハードウェアの更新なども、データノードを1台ずつ順番に再起動するローリングアップグレード機能によって、クラスタ全体としては停止することなく実施可能です。
地理的な複数拠点を活用した拡張性
MySQL Clusterには複数のデータセンターやクラウドの地理的に異なる拠点間をむすんでさらなる可用性と拡張性を実現する機能が用意されています。複数のクラスタ内のSQLノード間をMySQLサーバのレプリケーション機能で非同期レプリケーションを行うのがGeo Replication機能です。通常のMySQLサーバのレプリケーション機能とは異なり、MySQL ClusterのGeo Replicationでは2つのクラスタをそれぞれマスタとして双方向レプリケーションが可能になっています。
さらに高い可用性が求められるシステムでは、データの多重化を行って同じデータを持っているデータノードを複数の拠点に配置することで、拠点間で同期レプリケーションを行うのと同じ構成が可能です。この構成では拠点間のネットワークのレイテンシが全体の処理性能に大きく影響するため、低レイテンシの専用回線で結ばれていることが前提となります。
参考URL
Oracle's MySQL Blog: Synchronously Replicating Databases Across Data Centers – Are you Insane?
トランザクション対応NoSQLとしてのMySQL Cluster
MySQL Clusterは高性能と高可用性を実現したデータベースクラスタとしてだけではなく、トランザクション対応のNoSQLとして利用することができます。NoSQLのAPIからのアクセスとSQLでのアクセスはデータノードにてトランザクショナルに処理され、どちらから書いた内容もどちらからでも読むことができる、ハイブリッドなデータ管理システムとなっています。
SQLノードのndbclusterストレージエンジンは、データノードの通信にC++のNDB APIを利用しています。このNDB APIはデータノードへの接続やデータの読み書きの機能を提供しています。データの追加にはINSERT文の代わりにNdbOperation::insertTuple()メソッドを使用します。
参考URL
NDB API Examples
C++のアプリケーションからこのNDB APIを直接利用することで、SQLノードを介さずにデータノードのデータにアクセスできるため、より高い応答性能が期待できます。下記の図3 は図2と同じハードウェアとネットワークを使って、NDB APIを使用した場合のベンチマーク結果です。データノード32台を使って秒間で2億件の参照を実現しています。
図3 MySQL Cluster 7.4のベンチマーク結果(DBT-2)( 注2 )
MySQL Clusterの各種NoSQL API
C++のNDB APIに加えて、MySQL Clusterには各種のNoSQL APIが用意されています。
図4 MySQL ClusterのAPI
Cluster JはNDB APIをJNI(Java Native Interface)でラップしたJava用のNoSQL APIになります。JPAに準拠するためにOpenJPAのライブラリを使用したCluster JPAも用意されています。Cluster JPAはCluster Jでは対応していないテーブルのJOINを含むような処理はSQLノードにJDBCドライバ経由でアクセスさせることができます。
参考URL
4.2. Using MySQL Cluster Connector for Java
memcached APIは、オープンソースの分散キャッシュmemcachedにMySQL Clusterの開発チームがプラグインを追加し、アプリケーションはキャッシュにデータを格納したつもりでも自動的にデータノードにデータが多重化されて格納される仕組みを持っています。データ参照の際も自動的にデータノードとmemcachedが連携します。memcached APIを使用すると、データを多重化して永続化するキーバリューデータストア(KVS)として利用することができます。
他にもNode.js用のAPIも用意されており、MySQL Clusterは、SQLとNoSQLのどちらのAPIからでも同一のデータにアクセスでき、かつトランザクショナルに処理されます。高い可用性と拡張性に加えて、SQLとNoSQLのハイブリッドなAPIを利用できることで、より多様なシステム要件に対応可能です。
次回は
次回はクラウド環境で利用できるMySQLのスケールアウト構成のためのツールなどを紹介いたします。