More info...

2009-02-19

MySQL Clusterへの接続方法

MySQL Clusterを使うにあたって直感的に理解しにくいことを一つ挙げると

どうやってたくさんあるSQLノードに接続すればいいんだ?
ロードバランスは?
フェイルオーバーは?

ということがあると思う。このテーマを扱ったドキュメントはありそうだちょうど良いものが見あたらない。おそらくこの点が明確でないために「よし、最近サイトのトラフィックも増えてきたことだし、いっちょMySQL Clusterを試してみようか!」という気にならず、多くの人が利用を躊躇ってしまっているのではないだろうか?なので今日はこの点について5パターンのソリューションを紹介したいと思う。

その前に、「MySQL Clusterって何だ?シラネーヨ!」って人は、MySQL Clusterの特徴やセットアップ方法などを以前にThinkITへ投稿したのでそちらを参照して貰いたい。
http://www.thinkit.co.jp/article/95/

では本題。

1. mysqldをアプリと共存

恐らく最もシンプルかつ最も幸せになれるソリューションである。mysqldをアプリケーションと同じホストで動作させれば、アプリケーションはmysqldと1:1で通信するだけで良いので、ロードバランスやフェイルオーバーを考えなくて良い。アプリケーションに対してはDNSラウンドロビンなど安価な手法で負荷分散してやればいいのである。ホストがクラッシュしたときにはアプリもMySQLも一蓮托生であるが、セットで冗長化されていれば問題はない。

同じホストにmysqldがある場合、アプリケーションとmysqldとの通信はUNIXドメインソケットを利用出来るので、非常に高速に行われるというメリットがある。また、利用するストレージエンジンがNDBCLUSTERだけであれば、mysqldが消費するメモリは非常に少ない。もちろん消費するメモリ量は接続数やバッファの量にも因るが、1:1で通信するだけならばそれほど多くはならないので、500MBも見ておけば十分だろう。

mysqldを共存させる場合のデメリットは、ホストを一定数以上増設できないことである。MySQL Clusterを構成するホストの台数は最大で255台までという制限があり、これにはSQLノード(mysqld)も含まれる。即ち、この構成はあまり大規模なアプリケーションには向かないのである。(と言っても255台を超える規模ってなかなかないんだけど。)


この図では、アプリケーションとSQLノードが同じホストに同居している。必要な数だけこのセットを用意しよう。

2. Connector/J

http://dev.mysql.com/downloads/connector/j/5.1.html

アプリケーションの開発に利用している言語がJavaであればこの問題は非常に容易に解決できる。あまり知られてないことであるが、MySQLのJDBCドライバであるConnector/Jには、複数のmysqldに対して負荷分散を行うための機能が備わっているのだ。なのでConnector/Jを利用すれば、MySQL ClusterのSQLノードへの負荷分散や、レプリケーションによる参照系の負荷分散を容易に行う事が可能だ。MySQL ClusterのSQLノードに接続する時には、接続URLにおいてSQLノードを並べて記述し次のプロパティを設定する。

autoReconnect=true
failOverReadOnly=false
roundRobinLoadBalance=true

3つめのプロパティはloadBalanceStrategy=randomまたはloadBalanceStrategy=bestResponseTimeでもOKだ。どれにしてもそれほど大差はないし、どれにすればいいかということについて明確なガイドラインはない。従って実際に負荷をかけてみて、最も性能の良いものを選択するといいだろう。


この場合も必要な数だけアプリケーションを用意しよう。ただし、1の場合とは違って利用出来る台数に制限はない。図ではSQLノードとデータノードが同居しているが、アプリケーションのノードがとても多くて同時接続数が増える場合には、SQLノードをデータノードから分離して台数を増やせばいい。

3. MySQL Proxy

https://launchpad.net/mysql-proxy

開発言語がJavaでなく、さらにmysqldをアプリと共存させたくないような場合には、MySQL Proxyをアプリケーションと同じホストにインストールすると良い。MySQL ProxyはMySQLサーバへのロードバランスとフェイルオーバーをおこなってくれるソフトウェアである。Luaスクリプトを使って高度な分散処理をさせることもできるが、ただ単にロードバランスとフェイルオーバーだけが必要なのであれば、別に高度なことは何もしなくていいので使い方は簡単である。アプリケーションはMySQL Proxyと1:1で通信するだけでいい。

MySQL Proxyは次のように起動する。

shell> mysql-proxy --proxy-backend-address=host1:3306
--proxy-backend-address=host2:3306
... 中略 ...
--proxy-backend-address=hostN:3306



4. LVS

MySQL ProxyはMySQL専用のロードバランサーなので、敢えて他のソフトウェアを使う必要などないと思うかも知れないが、MySQL Proxyの問題点はまだα版だということである。バコバコとクラッシュするような品質ではないけれども、本番環境では不安があるよ!と思う人は実績のあるLVSの利用を検討するといいだろう。LVSを使ったソリューションについては下記のブログなどを参照にしてほしい。(なのでここでは割愛!)
http://d.hatena.ne.jp/naoya/20060901/1157109663

MySQL Proxyの安定版が出れば、そちらのほうが簡単・便利なのでLVSでロードバランスする必要はないと思う。ちなみに、MySQL Proxyは商用のクエリアナライザでも利用されているのだが、MySQL Proxyの部分でトラブルが発生した事例はまだ聞いたことがない。

5. アプリケーション側で管理する

上記全ての方法が利用できなくても、データベースへの処理を行うときにアプリケーションが自ら接続先を振り分けるなどにより管理すればいい。MySQL ProxyやLVSなどのように間に何かを挟む必要はないからスッキリ!!と言えば聞こえが良いが、アプリケーション側で煩雑な接続処理(振り分けや再接続、フェイルオーバーなど)を実装する必要があるので、他の手段が使えなければ仕方なく使うしかない手法であるといえる。最も手間がかかる方法なのでお勧めはしない。(だったら紹介するなよ!>俺)

このようにならないために1〜4のような手法が編み出されたわけである。



最後に。

MySQL Clusterは高可用性・負荷分散を行うための非常に手軽なソリューションである。参照系の処理だけでなく、更新系の処理も負荷分散させることが出来るのが特徴的である。さらにMySQL Cluster自身がフェイルオーバー機能を備えているため別途クラスタリングソフトウェアを利用する必要がない。ただし現時点ではJOINの性能があまり良くない、分離レベルがREAD-COMMITTEDだけであるなどの欠点はあるので既存のアプリケーションをそのままMySQL Clusterに移行するのは難しい。しかしMySQL Clusterはストレージエンジンの一つであり、InnoDBやMyISAMと同じようにSQL文を発行することができるのである。使いどころさえ間違えなければお手軽に前述のメリットが得られるソリューションなのでぜひ利用してみよう。

MySQL Cluster Community版(GPL)は、次のページからダウンロード可能である。
http://dev.mysql.com/downloads/cluster/index.html

0 件のコメント:

コメントを投稿