読者です 読者をやめる 読者になる 読者になる

はざまブログ

cybozu.com の中の人の個人ブログ

yrmcds 1.0.0 の補足

エンジニアなら詳細が気になるもの。というわけで、個人ブログのほうで yrmcds 1.0.0 リリース記事の技術的な補足をしておきます。

keepalived 使うの、split brain になるんじゃないの?

さてはプロの方ですね。困りますな、そういう突っ込みは!

気になる人は split brain 起こさない heartbeat をご利用ください。 用途次第でまあどうでもいっかなーという人は keepalived の方が手軽かと思います。

サーバーサイドロックとレプリケーション

ロック状態はレプリケーションされません。非同期レプリケーションなのでしても無駄というか。 するとロックした後、フェイルオーバーするとオブジェクトがロックされない状態になるわけです。危険です。

対策として導入したのが、バイナリプロトコルの RaU (Replace and Unlock) です。 このコマンドはロックしていなければ失敗するので、間違って更新するってことが防止できるんですね。LaG (Lock and Get)は必須ではないのですが、RaU は必須なのです。

テキストプロトコルには RaU も LaG も存在しないです。手抜きました。バイナリプロトコル万歳!

slab なしでどうしてるの?

tcmalloc にメモリ管理は丸投げです。 それで memcached と互角以上の速度がでるわけですから、自前メモリ管理なんていらなかったんだ!と思う。

チューニングは何をしたの?

リアクタースレッドがボトルネックになっていたのでそこの仕事を減らしました。 今や epoll の通知をワーカースレッドにピッと lock-free で投げているだけですが、リアクターがボトルネックなのは変わってません。

つまり、これ以上速くするなら複数リアクターな実装が必要です。 業務上の必要性がないのでやる予定はありませんが、やってみたい人がいれば歓迎します。

速さの工夫については別途誰得な記事を書くつもりです。

なんでクライアントライブラリを作ったの?

libmemcached を改造しようと思ったけど、ソースが読みにくいのでやめました。てへぺろ(・ω<)

本音でいうとコンシステントハッシングとかいいから、生プロトコルなライブラリが欲しかったんですよ。UNIX流が好みなので。お好みに合えばどうぞお使いください。

付属の yc コマンドも yrmcds/memcached の全機能にアクセスできるので便利ですよ。

SipHash どうよ?

元は速さで知られた MurmurHash3 使っていたので、性能が心配でした。

置き換えてベンチマークとったところ、誤差レベルではありますが若干性能向上したのでびっくりです。 速くてセキュアなんて素晴らしい。SipHash 万歳!

実装は csiphashちょっぴり変更したものを使っています。

ソースコード綺麗

偉そげに「教材としての yrmcds」とか書いてましたが、0.9.0 の時点ではワーカースレッドに memcached の実装がべったりしていたり、リアクターが中途半端に書き込みを抽象化していたりして、見苦しい点がありました。あとハッシュ実装が std::vector を使った手抜きだったり。

1.0.0 までに、そういう見苦しさを綺麗さっぱり整理しました。ワーカーの実装も、リアクターも、読みやすく汎用性が高いものになってます。Lock-free な job dispatch ができる汎用ワーカースレッド実装は特に気に入ってるので、ぜひご覧ください。

https://github.com/cybozu/yrmcds/blob/master/cybozu/worker.hpp

cybozu/ 以下は汎用ライブラリになっているので、いずれ C++11 のネットワークライブラリとして独立させてもいいかもです。

以上です。乱文失礼しました。