MySQLでNoSQL!?
MySQLでNoSQL!?
MySQL 5.6では完全に新しい試みとしてNoSQLのインターフェースを追加しました。MySQLのデータは通常SQL文を使って読み書きをしますが、このインターフェースではSQL文を使わないデータアクセスが可能となりました。MySQLのNoSQLインターフェースは分散キャッシュのmemcachedを活用しています。
memcachedはブログサイトのLiveJournalで利用が始まったキャッシュの仕組みで、現在では多くのWebサイトでMySQLと組み合わせて利用されています。単純にMySQLとmemcachedを組み合わせた場合では、データの取得時はアプリケーションからmemcachedにアクセスして対象のデータがキャッシュされているかを確認し、データが無い場合はあらためてMySQLにアクセスする必要があります。また、データの更新時には、永続化のためにはMySQLにアクセスし、さらにキャッシュを更新する処理をなんらかの形で実装する必要があります。
MySQL 5.6では、memcachedをMySQLサーバのプラグインとして同一プロセス内部で稼働します。データはInnoDBのテーブルに永続化されて、テーブルの複数の列をまとめてバリューとしてmemcachedプロトコルから扱うこともできます。同じデータに対してキーバリュー型のアクセスが適しているシンプルなデータアクセスをするアプリケーションからはmemcachedのプロトコルで、JOINなど複雑なデータを操作する場合には、MySQLサーバのプロトコルでSQL文を利用します。特にデータをまとめてロードする場合などのオーバーヘッドを最小限に抑えることができます。
|
|
| 図3:MySQLのNoSQL実装 |
memcachedのプロトコルでデータを追加更新する場合、「memcachedへのキャッシュのみ」、「InnoDBへの永続化のみ」、「キャッシュと永続化」を選択できます。また、MySQLサーバのバイナリログにはデータの変更が記録されるため、レプリケーションも可能です。
フィードバックをお待ちしています。「実験室」版
MySQL 5.6での開発中の機能などよりも、さらに実験的な機能を搭載したバージョンをlabs.mysql.comで公開しています。ある程度基本的なテストはしているものの、製品品質は本番環境での利用をおすすめできるレベルではありませんのでご注意ください。あくまでも最新の実装をいち早くお試しになりたい方のためのリリースです。
例えばInnoDBのページサイズを通常より小さな4KBや8KBにしたものや、レプリケーションの性能向上のためのBinlog Group Commit、バイナリログの内容をC++のアプリケーションから読み書きするためのBinlog APIライブラリなどがあります。サーバのUUIDと一連の番号を使用して、サーバを超えてユニークなトランザクション番号をトランザクションに割り当て、レプリケーションのマスタからスレーブへの切り替え時にログの確認作業を不要にするGlobal Transaction IDも現在はここでの公開です。
新しい技術に興味のある方はぜひお試しいただき、機能や品質についてフィードバックをいただければと思います。
次回は開発中のMySQL Cluster 7.2での改善ポイントついて解説します。
[編集部注] 記事タイトルを内容に合わせて修正致しました。(2011.11.29)
