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

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

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

MySQL Clusterの拡張性

高いスループットを実現するMySQL Cluster

データノードはデフォルトではデータとインデックスを全てメモリ上で管理するインメモリデータベースとして稼働するため,通常のMySQLサーバと比較して極めて低いレイテンシとなり,より多くの処理に対応できます。インメモリデータベースといっても,トランザクションログはディスクに書き込まれ,LCPと呼ばれるタイミングでメモリ上のデータも定期的にディスクに書き出されるため,クラスタ全体の停止時にもデータを失うことはありません。

MySQL Clusterを利用する最大のメリットは極めて高いスループットを実現でき,かつデータノードの追加に応じてスループットが向上していく点です。下記の図2はMySQL Cluster開発チームが実施したベンチマークテストにて,16台のデータノードで参照更新のSQLを秒間250万件処理した際のグラフです。極めて高い性能を実現できているだけではなく,ノードを追加するにつれて線形に性能が向上している点にもご注目ください。

図2 MySQL Cluster 7.4のベンチマーク結果(DBT-2)注1

図2 MySQL Cluster 7.4のベンチマーク結果(DBT-2)(注1)

注1)
出典:MySQL Clusterのベンチマーク
参考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

図3 MySQL Cluster 7.4のベンチマーク結果(DBT-2)(注2)

注2)
出典:MySQL Clusterのベンチマーク

MySQL Clusterの各種NoSQL API

C++のNDB APIに加えて,MySQL Clusterには各種のNoSQL APIが用意されています。

図4 MySQL Clusterの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のスケールアウト構成のためのツールなどを紹介いたします。

著者プロフィール

梶山隆輔

MySQL Sales Consulting Senior Manager。

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