@ymmt2005 こと山本泰宇です。 今回は memcached 互換で冗長構成を簡単に組める自社製 KVS である yrmcds のリリースをご案内します。
... この Redis 全盛なご時世になんで?とか、repcached や Kyoto Tycoon があるじゃない、といったツッコミの嵐が聞えてきそうです。わかってます、わかってますから物を投げないで! 順を追って説明しますので、批判はそれからにしてください!
何が欲しいのか
私は日頃 cybozu.com のインフラで動作するソフトウェアを開発しています。リリース後もうすぐ2年になりますが、お蔭様で 4,000 社以上にご利用いただくまでになりました。商売繁盛で嬉しいのですが、運用側は日々増えるデータとアクセスを捌くべく奮闘しています。
ここのところ問題になっていたのが、MySQL に保存しているセッション情報でした。アプリケーションの作りのせいもあるのですが、特に大規模なテナントでは非常に多くのトランザクションが流れ、ストレージの負荷となっていました。一時情報であるセッションデータをわざわざ高可用なストレージ(MySQLのストレージは自社製の Square です)に載せるのはもったいないので、オンメモリ化することにしました。
一時情報とはいっても、全ユーザーのセッションを扱うので高い耐障害性は必要です。故障時には数秒で回復してほしい。あと冗長構成はオペレーションコストがかかりがちなので、これは避けたい。オペレーションコスト=人件費=サービス原価ですから。さらに、cybozu.com は Office やガルーンや kintone などなどのアプリケーションが動いているのですが、それら全てが楽に対応できないと開発コストが高くつきます。
まとめると、以下のような要件となります。
- キャッシュとして使えるオンメモリ KVS
- 複数台のレプリケーション構成
- 障害発生時は数秒以内に回復すること
- 構築・障害発生・冗長性回復のオペレーションコストが低い
- 各種アプリ・言語から利用可能
- アプリ側の対応が楽な仮想 IP による冗長化
既存のものはどうか
Redis
まず筆頭に上がるのは、Redis だと思います。リストや集合といった多様なデータ型やトランザクションや Lua スクリプトによる拡張などの機能を備え、かつ高速です。素晴らしいですが、そういった機能に今のところ用はありません。欲しいのはレプリケーション、それも運用が楽で瞬時に切り替わるものです。
でも、残念なことに Redis のレプリケーションは夢のように楽ではないようです。あと各種アプリから利用可能という点でも、memcached より若干対応しているものが少ないです。たとえば Apache 2.4 では memcache プロトコルで SSL セッションを共有できますが、Redis には対応していません。
memcache 系
それではということで memcache に目を向けます。memcached と互換性があり、比較的良く利用されているものは以下になるかと思います。
-
本家本元ですが、レプリケーションはサポートしていません。
-
memcached-1.2.8 に対するパッチがリリースされて以来、更新されていないようです。最近の memcached に移植している人もいるようですが、利用状況・品質が不明瞭です。
-
memcached のプロトコルの一部のみカバーしており、バイナリプロトコルや Touch, GaT といったコマンドが実装されていません。レプリケーションは評価していませんが、仕様書を読む限りは対応コストが低いと確信はできませんでした。
yrmcds の特長
どれも一長一短に思えたのですが、memcached のプロトコルを読むと、とても単純です。これなら2週間もあれば作れるなと胸算用しました。ちょうど仕事の区切りで C++11 を調べていたこともあり、エイやで作ってしまったのが yrmcds です。
くどくどと述べてきましたが、レプリケーションに伴う運用・開発面のコストをとても低く抑えられるのが最大の特長になっています。
VIP 方式のフェイルオーバー
VIP の切り替えには keepalived 等を利用します。アプリケーションからみると同一の IP アドレスで必ずマスターサーバーが動作しているので冗長化に伴う工夫は必要ありません。また、障害発生時の切り替えも一瞬です。
動的なマスター・スレーブ
サーバーは固定した役割を持っておらず、VIP を持つサーバーが自動的にマスターになります。VIP を持たないサーバーは自動的にスレーブとなります。マスターを再起動するとスレーブの一台に瞬時にフェイルオーバーし、再起動が完了した後そのサーバーは自動的にスレーブとしてマスターに接続しなおします。
大きなデータはメモリ外で管理
これは自社都合で実装した機能なんですが、とても大きなセッションデータが入ることがあるのです。メモリをいたずらに浪費するのをさけるため、設定値以上の大きさのオブジェクトは一時ファイルに書き出されるようになっています。
memcached とのほぼ完全な互換性
テキストはもちろん、バイナリプロトコルもほぼ完全に実装されています。最近追加された Touch や GaT (Get and Touch) もサポートしています。
アクティブ!
cybozu.com というある程度の規模を持った B2B クラウドサービスで利用されています。yrmcds は memcached とは一切コードを共有していないので、パッチが廃れるといったこともありません。安心してご利用いただけるかと思います。
あと、おまけですが yrmcds は C++11 を全面的に採用しています。これから勉強しようという方には、ソースコードがお役にたてるかと思います。
現在の状況と今後の予定
本日 2013年 7 月 9 日に、最初のバージョンとなる 0.9.0 をリリースしました。
ポータビリティは一切考えていないので Linux でしか動作しませんが、よろしければお試しください。
今後 1.0.0 をリリースするまでに、多少の性能チューニングをしようと考えています。 その他の課題については、Future plans をご覧ください。
ご意見、ご要望は GitHub の Issues にお願いします。