何か着ていればいいよ

ソフトウェア技術者の日常や技術の話を書こうと思います。

キャッシュサーバーをスケールアウトしたい人はtwemproxyを使うといいよ

最近ちょこちょこ触っているtwemproxyの知見を書き残しておきます。
言いたいことはタイトルが全てって感じです。

twemproxyとは?

github.com

twitterでも使われている。memcacheまたはredis向けproxy。
以前はnutcrackerと呼ばれていたそうです。

twemproxyの使いどころ

例えば、普通のキャッシュサーバーを使ったこんな構成を考えてみます。 f:id:wkubota:20151223002602p:plain

この構成からキャッシュサーバーをスケールアウト複数台構成にする場合、普通のLBだとヒット率が下がるためあまり良くありません。 同じキーは必ず同じサーバーへと振り分けて欲しい。 そんな時にお手頃なのがtwemproxyというわけです。 構成はこんな感じ。 f:id:wkubota:20151223002849p:plain

twemproxyはアプリケーションとキャッシュサーバーの間で透過的に動作し、キャッシュサーバーのクラスタリングやそこからのスケールアウトを出来るようにするためのプロキシサーバーです。
デーモンとして、プロセスを立ち上げておきアプリケーションからキャッシュサーバーへのアクセスを振り分けたりするのが主な使い方でしょう。

また、twemproxyは動作中の状態をログ以外はディスクに書き込まない、つまりほぼオンメモリで動作するアプリケーションなので非常に軽快です。
永続化しないためdockerのようなコンテナベースの仮想化とも相性が良いと思います。

例えば、memcacheを複数台でクラスター化したい場合とか、redisの古いバージョンしか使えない状況でredis cluster使いたい場合とかに重宝する感じです。

利点

特徴でもある、メモリモデル。
キーの振り分けアルゴリズムさえ同じにしておけば容易にスケールする。(複数台のtwemproxyが同じ振る舞いをするので負荷分散が容易)

デメリット

あまりバッファリングできないためキャッシュサーバーへ接続できないとデータロストの可能性がある。
スループットには限界がありそう。*1

てな感じです。
ちょっと先にはなりますが、本番投入も見据えているので、そしたら運用面の知見も得られるかなー

*1:そこらへん見きれていないのでどの程度とかの知見はなし。