MySQL Cluster:NoSQL+SQL、NoSQLも使える高可用性インメモリRDBMS

2014年2月25日(火)
山﨑 由章

MySQL Clusterとは?

MySQL ClusterはMySQLとは開発ツリーの異なる別製品で、共有ディスクを使わずにアクティブ−アクティブのクラスタ構成が組めるリレーショナルデータベースです。単一障害点が無い構成を組むことができ、可用性が高いため、米国海軍の航空母艦における航空機管制システムなど、ミッションクリティカルな分野でも多く利用されています。また、デフォルトではデータをメモリ上に持つインメモリデータベースであり、トランザクションを高速に処理できるため、リアルタイム性が求められるアプリケーションにも向いています(インメモリデータベースであっても、データの永続性は担保されています)。

MySQL Clusterの基礎となっている技術は、通信機器ベンダのエリクソンで携帯通信網の加入者データベース向けに開発された Ericsson Network DataBase(NDB)と呼ばれていた技術です。携帯通信網の加入者データベースは、一つ一つの処理は比較的シンプルですが、処理を大量に実行する必要がありますし、携帯電話の加入者増加に合わせて性能を拡張していく必要があります。また、通信障害が起きると収益機会も逃してしまうため、高可用性が求められます。このような環境に向けて最適化されて設計されたEricsson Network DataBase が、その後MySQLと統合され、現在のMySQL Clusterとなっています。

また、元々はSQLを使わないデータベースだったのですが、MySQLと統合されたことによりSQLも使えるようになったため、現在はNoSQL(KVS)とSQLの両方が使えるデータベースになっています。そして、NoSQLによる処理であっても、ACID準拠のトランザクションに対応しています。

図1のような企業が、MySQL Clusterを使用しています。元々、携帯通信網の加入者データベースで使われていたということもあり、Alcatel Lucent、Juniper Networksといった通信機器ベンダでも広く使われていますし、MySQLと統合されたことにより、オンラインゲームやクラウドサービスなど、Webアプリケーションのバックエンドとしての使用事例も増えています。

図1:MySQL Clusterの使用企業(クリックで拡大)

NECが通信基盤システムのデータベースにMySQL Clusterを採用しているなど、MySQL Clusterの使用事例は、こちらのページでも紹介しています。

MySQL Clusterの特徴

MySQL Clusterの主な特徴をご紹介します。

読み込み処理だけでなく、書き込み処理に対しても高い拡張性を実現

MySQL Clusterは、内部的に自動的にデータをシャーディング(分解して複数のサーバーに分散)することにより、書き込み処理に対しても高い拡張性を持っています。もちろん、どのような処理でも拡張性が出せる、という訳ではありませんが、MySQL Cluster向きのアプリケーションで使用すれば、図2のベンチマーク結果のように高い拡張性を実現可能です。

図2:UPDATE処理によるベンチマーク結果(クリックで拡大)

このベンチマークでは、更新処理(UPDATE)のスループットを、Data Nodeというサーバーの台数を2台、4台、16台、30台の4つの構成で取得していますが、ベンチマーク結果がほぼ線形であり、Data Nodeの台数を増やすことで性能がリニアに拡張していることが確認できます。

ベンチマークの詳細はこちらの資料で公開しています。また、このベンチマークはMySQL Cluster 7.2 時点でのベンチマークですが、現在の最新バージョンは7.3となっています。MySQL Cluster 7.3では、後述の通り更に性能が向上しています。

99.999%の高可用性(年間5分程度の停止時間)

99.999%の高可用性を達成するための設計がされています。単一障害点が無い構成を組めるだけでなく、カラムの追加やインデックスの追加など各種のメンテナンス処理、ノードの追加/削除などもオンラインで実行できるため、停止時間を最小限に抑えることができます。

リアルタイム処理

インメモリデータベースであるため、トランザクションを高速に実行でき、リアルタイム性が求められるアプリケーションにも適しています。

SQL+NoSQLの柔軟性

より高い性能を出したい場合にはNoSQLを使用し、柔軟にデータにアクセスしたい場合にはSQLを使用する、というNoSQLとSQLのいいとこ取りした使い方ができます。また、NoSQLのAPIをどんどん拡張していて、C++やMemcached、Java、JPA、HTTP/REST、JavaScript / Node.jsと、各種のAPIを取り揃えています。

低いTCO

共有ディスクを使用せずに、コモディティ化しているハードウェアを複数台並べて、スケールアウトにより性能を拡張できるため、トータルコストを下げることができます。

MySQL Clusterのアーキテクチャ概要

MySQL Clusterのアーキテクチャを解説します。

3つのノードで構成

MySQL Clusterは、データノード、SQLノード、管理ノード、という3種類のノードから構成されます。

データノード 名前の通りですが、データを格納するノードです。MySQL Clusterの中心となるノードです。
SQLノード MySQLサーバーです。クライアントから発行されたSQLを解析し、データノードへアクセスして応答を返します。
管理ノード データノードとSQLノードを管理するためのノードです。クラスタの起動/停止や状態の確認、オンラインバックアップなどの操作を実行します。

データノードでは、複数のノードで同じデータを保持

データノードでは、データを各テーブルの主キーのハッシュ値に基づいて水平分割(行単位で分割)して格納します。更に、分割したデータを同じグループ内のデータノードに複製して持つことで、データが冗長化されます。

図3を例にすると、あるテーブルのデータがF1、F2、F3、F4という4つのフラグメントに分割され、4つのノードに分散して格納されています。そして、各フラグメントの複製が同じグループ内の別のノードに保持されるため、ノード1はF1のデータだけではなくF3の複製を保持しています。また、同様にノード2はF3のデータだけではなくF1の複製を保持しています。

図3:MySQL Clusterのアーキテクチャ概要図(クリックで拡大)

同じデータを複数のノードで保持することにより、あるノードに障害が発生した場合でも、別のノードで処理を継続可能です。また、障害が発生したノードを復旧する際も、オンラインでノードをクラスタに戻すことができます。

データノードへのアクセスがボトルネックになっている場合は、データノードの台数を増加することで1ノードあたりが持つデータ量が少なくなり、負荷分散によって性能を向上できます(前ページのベンチマーク結果参照)。

SQLノードや管理ノードも複数台で構成可能

SQLノードや管理ノードについても、冗長化のために複数台で構成可能です。また、SQLノードへのアクセスがボトルネックになる場合は、SQLノードの台数を増加することで負荷分散でき、性能を向上できます。

各種のNoSQLインターフェース

データノード上のデータは、NoSQLによっても読み込み/書き込み可能です。MySQL Clusterの基礎となっているEricsson Network DataBase(NDB)では、C++のAPIを使ってデータを読み書きしていましたが、現在ではC++のNDB API以外にも各種のNoSQLインターフェースが用意されています。NoSQLインターフェースを使用した場合はキー・バリュー型データストア(KVS)のように利用できますが、KVSとしてMySQL Clusterをとらえると、他のKVSと比較して多数のメリットがあります。

  • ACID準拠のトランザクションをサポート
  • データの永続化と冗長化が担保されている
  • 障害発生時の自動フェイルオーバー機能
  • オンラインバックアップ機能
  • NoSQLだけでなく、SQL文も利用可能
  • SQLノード経由でレプリケーション機能も使用可能

レプリケーション機能も使用可能 (災害対策やMySQLサーバーとの連携)

MySQL Clusterでは、MySQLサーバーのレプリケーション機能も使用できます。レプリケーションを使うことで、MySQL ClusterからMySQL Clusterへデータを複製できるため、データセンターをまたいでディザスタリカバリ構成を組むことでシステムの信頼性を更に高めることができます。

また、MySQL Clusterと通常のMySQLサーバーの間でもレプリケーションを設定できます。そのため、高可用性が求められる大量のトランザクションをMySQL Clusterで処理し、分析処理などアーキテクチャ上MySQL ClusterよりもMySQLの方が向いている処理はMySQLサーバーで処理する、という風にMySQLサーバーと組み合わせて利用することもできます。

図4:レプリケーションの柔軟性(クリックで拡大)

MySQL Clusterでは複数のSQLノードからデータが更新されますが、バイナリログ・インジェクションという仕組みによって、データノードでのデータ変更が完了した時点で、
他のSQLノードから実行されたデータ更新についても、バイナリログにシリアライズ化された上で書き込まれます。また、NoSQLインターフェースを使用してデータを更新した場合でも、同様の仕組みで更新データがバイナリログに記録されるため、NoSQL経由で変更したデータをRDBMSにレプリケーションする、といった使い方も可能です。

MySQL Cluster 7.3の特徴

2013年6月に、最新バージョンのMySQL Cluster 7.3がリリースされました。MySQL Cluster 7.3では、性能を大幅に向上している他、インストール&設定を自動的に行うAuto-Installerや、新しいNoSQL APIとしてNode.js APIなどが追加されていますので、主要な機能強化点について解説します。

Auto-Installer

MySQL Clusterの環境を簡単にセットアップできるインストーラーを用意しました。MySQL Clusterを使用する場合、複数のノードで1つのデータベースを構成するため、セットアップ時に複数のノードを操作する必要があります。この作業を簡素化するために、ブラウザベースのインストーラーを提供しています。

Auto-Installerを使用すると、ウィザード形式でセットアップ対象のサーバー情報や各種設定を入力することで、自動的にMySQL Clusterの環境を構築できます。リモートサーバーへのデプロイもできるので、インストール時の複数台のサーバーを触ってサーバー毎に作業する必要もありません。また、サーバーのリソース情報を検出して、ある程度最適化された暫定的なパラメーター値も設定しますので、セットアップ時のパラメーター設定も簡素化されます。

下の資料では、Auto-Installerを使用してMySQL Clusterの環境をセットアップし、簡単な稼働確認をする方法を画面キャプチャ付きで紹介しています。1台のサーバー上でテスト環境を作るぐらいであれば、5分程度で環境構築できるので、資料を参考にして是非MySQL Clusterを試してみてください。

外部キーを実現

MySQL Cluster 7.3では外部キーが実装されました。「RDBMSなのだから外部キーが使えて当たり前でしょ」、と突っ込まれてしまうかもしれませんが、前述の通りMySQL Clusterは元々NoSQLのデータストアだったため、MySQL Cluster 7.2まではRDBMSとして重要な機能がまだ実装できていませんでした。しかし、現在のバージョンでは外部キーも実装されたため、RDBMSとして完全な状態になっています。

また、MySQL Clusterのユニークな点としては、「SQLだけではなくNoSQLでのデータ操作についても外部キーが有効である」、ということです。

今まで外部キーが使えないためにMySQL Clusterの使用を断念していた方は、この機会に試して頂ければと思います。

性能の向上(Connection Thread Scalability)

MySQL Cluster 7.3では、内部的なロックの粒度を細かくしたことにより、SQLノードの性能が劇的に向上しています。以下はMySQL Cluster 7.2と7.3でのTPM(Transactions Per Minute)をDBT2とSysbenchで比較した結果ですが、7.3ではNDB API Connectionsが少ない場合でも(≒SQLノードの数が少ない場合でも)、高い性能が出ていることが確認できます。

図5:MySQL Cluster 7.2と7.3との比較(DBT2)(クリックで拡大)
図6:MySQL Cluster 7.2と7.3との比較(Sysbench)(クリックで拡大)

MySQL 5.6との統合

MySQL Clusterは、MySQL 5.6と統合されています。そのため、これまでの連載で紹介してきたオプティマイザの改善やレプリケーションの強化、といったMySQL 5.6での機能強化点は、MySQL Cluster 7.3にも当てはまります。

※MySQL Clusterを使用する場合は、InnoDBとは異なるNDBというストレージエンジンを使用するため、InnoDBに関する機能強化点はMySQL Cluster には当てはまりません (InnoDBとNDBを併用することは可能です)。

例えば、MySQL 5.6でのオプティマイザの改善の中にはBatched Key Access(BKA)とマルチ・レンジ・リード(MRR)というJOIN処理を高速化するアルゴリズムがあります。MySQL Clusterはデータを水平分割して複数のノードに分散しているため、アーキテクチャ上JOINが得意ではありませんが、このアルゴリズムが採用されたことによりJOINが高速化されるため、弱点が克服されています。

新たなNoSQL API(JavaScript / Node.js API)

MySQL ClusterはC++、Memcached、Java、JPA、HTTP/REST、と各種のNoSQL APIを搭載していますが、7.3では新しくJavaScript / Node.jsのAPIが追加されました。以下の記事でこのAPIの使い方を解説していますので、参考にしてください。

> Using JavaScript and Node.js with MySQL Cluster - First steps

MySQL Clusterを触ってみよう!!

SQLだけではなくNoSQLも使えて、単一障害点が無い高可用性構成を実現できるMySQL Clusterをご紹介してきましたが、いかがでしょうか? MySQL Clusterのことをもっと深く知りたい、という方には、MySQL / MySQL Clusterのサポートエンジニアである奥野氏が執筆している『MySQL Cluster構築・運用バイブル 〜仕組みからわかる基礎と実践のノウハウ〜』がお勧めです。こちらの書籍では、インストールから運用方法、アプリケーション設計時の注意事項など、MySQL Clusterを使用する上でのノウハウが一通り解説されています。

MySQL Clusterに興味を持って頂けた方は、この機会に是非MySQL Clusterを試してみてください!!

※本稿において示されている見解は、私自身の見解であって、私の所属するオラクルの見解を必ずしも反映したものではありません。

日本オラクル株式会社

MySQLのセールスコンサルタント。元々はOracleデータベースのコンサルティング、サポート等に従事していたが、オープンソースとフリーソフトウェア(自由なソフトウェア)の世界に興味を持ち、MySQLの仕事を始める。趣味は旅行と美味しいものを食べること。

連載バックナンバー

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

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

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

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