ElastiCacheのオートディスカバリ機能を検証してみた

RCOのエンジニアのSHです。

今回が初投稿です。よろしくお願いします。

みなさん、Amazon Web Services、使ってますか? RCOではサービスの開発にAWSをバリバリと活用しています。(そして、RCOではAWSに精通したエンジニアを 募集 しています!)

最近、サービスの開発でAWSのElastiCacheの「オートディスカバリ機能」を使ったのですが、リリースにあたって調査と動作検証を行ったので、その結果をご紹介します。

オートディスカバリ機能とは

ElastiCacheを一言で説明すると、AWS内で利用できるmemcached互換のインスタンスです。そこで、オートディスカバリ機能について調べる前に、memcachedのノード分散について復習をしましょう。

  • memcachedのクライアントライブラリでは、複数サーバへの接続をサポートします
  • memcachedのクライアントライブラリの初期化時に複数のサーバを指定するか、ライブラリに対してサーバの増減するメソッド等をアプリケーションから呼び出す必要があります
  • 値の格納や読み出しの際には、キーの値からどのノードを使用するかをライブラリが決定し、そのサーバと格納や読み出しの通信を行います

オートディスカバリ機能は、1年くらい前にElastiCacheに追加された機能です。詳しくは アマゾンクラウド公式ブログさんのこちらのリリース ご覧ください。

この機能によって、クライアントライブラリはendpointだけを参照しておけば、ライブラリがサーバと定期的にやりとりをしてendpointの配下のノードの状態を内部で管理してくれるため、アプリケーションコードからはノードの増減にかかわるやりとりや管理についてのコードを一掃することができます。

ちょっと詳細をはしょっていますが、アプリケーションとライブラリ、endpoint、ノードは以下の図ようなやりとりを行います。

アプリケーションとライブラリ、endpoint、ノード間のやりとりのシーケンス図

Amazonさんによるライブラリへの実装を見てみる

元々の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

オートディスカバリ機能がカバーする範囲は、ノードの一覧についてのやりとり部分だけです。
キーに対してどのノードを割り振るかを決定する機能についても、 NodeLocator という Interface を実装することで、切り替えが可能です。

SpyMemcachedには ArrayModNodeLocatorKetamaNodeLocator という2つのNodeLocatorが組み込まれており、それぞれに得手不得手があるようです。いつかこの中身も詳しく見て行きたいですね。