RCOのエンジニアのSHです。
今回が初投稿です。よろしくお願いします。
みなさん、Amazon Web Services、使ってますか? RCOではサービスの開発にAWSをバリバリと活用しています。(そして、RCOではAWSに精通したエンジニアを 募集 しています!)
最近、サービスの開発でAWSのElastiCacheの「オートディスカバリ機能」を使ったのですが、リリースにあたって調査と動作検証を行ったので、その結果をご紹介します。
ElastiCacheを一言で説明すると、AWS内で利用できるmemcached互換のインスタンスです。そこで、オートディスカバリ機能について調べる前に、memcachedのノード分散について復習をしましょう。
オートディスカバリ機能は、1年くらい前にElastiCacheに追加された機能です。詳しくは アマゾンクラウド公式ブログさんのこちらのリリース ご覧ください。
この機能によって、クライアントライブラリはendpointだけを参照しておけば、ライブラリがサーバと定期的にやりとりをしてendpointの配下のノードの状態を内部で管理してくれるため、アプリケーションコードからはノードの増減にかかわるやりとりや管理についてのコードを一掃することができます。
ちょっと詳細をはしょっていますが、アプリケーションとライブラリ、endpoint、ノードは以下の図ようなやりとりを行います。
元々のmemcachedにはオートディスカバリ機能は存在しません。また、この機能の実現には、サーバサイドとクライアントサイドの両方に修正が必要です。Amazonさんが各言語用に、オートディスカバリ機能が利用可能なmemcachedクライアントライブラリを配布しています。
一例を挙げれば、Javaの場合は、OSSの SpyMemcached をカスタマイズしたものを こちら で配布しています。
具体的にコードを見てみると、 このコミット で ConfigurationPoller というサーバとノードの情報をやりとりする機能を持つスレッドが実装されています。また、オートディスカバリ機能を使うには ClientMode.DYNAMIC を使う必要があることもわかりますね。
機能を理解しソースも読んだのでプロダクトで利用する前に実験を行ってみました。
その結果、想定どおりに動作していることが確認できました。
また、サーバとやりとりした結果、ノードの増減が以下のようなログとして出力されていました。:
2013-11-07 15:58:17.414 - [ERROR] - in pool-2-thread-1 Change in configuration - Existing configuration: Version:2 CacheNode List: (内緒!).0001.cache.amazonaws.com:11211 (内緒!).0002.cache.amazonaws.com:11211 New configuration:Version:3 CacheNode List: (内緒!).0001.cache.amazonaws.com:11211
どうでもいいことですが、正常な動作なのにログレベルが ERROR なのがちょっと不満です。
今回は、ElastiCacheのオートディスカバリ機能について調べたことを紹介しました。
オートディスカバリ機能は、ノードの増減について管理する部分を、アプリケーションコードではなくライブラリにもたせて楽をする仕組みでした。
オートディスカバリ機能がカバーする範囲は、ノードの一覧についてのやりとり部分だけです。
キーに対してどのノードを割り振るかを決定する機能についても、 NodeLocator という Interface を実装することで、切り替えが可能です。
SpyMemcachedには ArrayModNodeLocator と KetamaNodeLocator という2つのNodeLocatorが組み込まれており、それぞれに得手不得手があるようです。いつかこの中身も詳しく見て行きたいですね。