Posted on Apr 27
twemproxy を使うことで memcached クラスタを負荷分散させることは出来そうだが、ノード間に散らばったデータの可用性や冗長性を担保しなければいけない状況ではチト辛そう…ということは解ったのでもう悩んではいませんが…
RDS for MySQL 5.6 + memcached Plugin の簡単なベンチマークを取ってみるtwemproxy-web というツールがあるのでそちらを使ってみるtwemproxy のメトリクスを graphite に飛ばす sensu のプラグインもあるみたい!(今回触るのは止めておきます)尚、ベンチマーク結果は環境等により異なるのであくまでも指標の一つとして見て頂ければ幸いです。
以下のようなステップで設定する。
Options Groups にて新しいオプショングループを作成するAdd Option をクリックして MEMCACHED を選択するMEMCACHED オプション自身にもセキュリティグループを指定する必要があるので環境に応じて設定を行うOption Group(s) を RDS のインスタンスに適用する設定後は以下の様な状態になる(はず)。

個人的な注意点としては下記の通り。
VPC 内の RDS に MEMCACHED オプションを指定する場合にはセキュリティグループは VPC のセキュリティグループを指定する必要がある以下のような環境となる。

前回と同様に memslap を利用してベンチマークを実行するので以下のように実行する。
memslap -s ${memcached_host}
結果は下記の通り。尚、RDS のインスタンスタイプは db.m1.small を利用した。
比較として普通に VPC 外に構築した ElastiCache に対してもベンチマークを実行してみた結果は下記の通り。尚、インスタンスタイプは cache.m1.small とした。
と同じ環境とは言いがたいが素の ElastiCache と比較すると RDS for MySQL 5.6 + memcached Plugin は 20 倍程度の処理時間が必要になるようだ。ムム。
mysqld プロセスの中で memcached Plugin がバックエンドとして innodb を利用するElastiCache の方が良さそうMySQL と memcached を別々で運用する場合に MySQL と memcached 間の問い合わせオーバーヘッド軽減には貢献しそうtwemporxy を Ruby から操作したい場合に nutcracker という gem がある。その gem を利用して twemproxy に Web インターフェースを提供するのが twemproxy-web だ(という認識)。
インストールは下記の通り。但し、Ruby 1.9 以上が必要になる。
sudo gem install nutcracker-web --no-ri --no-rdoc -V
インストール後、下記のように起動する。
nutcracker-web --config /path/to/nutcracker.yml --port 22122 -d
--config に twemporxy(nutcracker) の設定ファイルを指定して --port には nutcracker-web で利用するポートを指定する。また、-d でデーモンモードでの起動となる。起動してブラウザでアクセスすると以下のようなページが表示される。

おお…だが…nodes 等のプルダウンに何も表示されない等で現時点では利用出来る機能は限定的なのでも少し調べる。
最後になるが、今回の記事を書くにあたり参考にさせて頂いたサイトや資料を自分の Bookmark 代わりにメモっておく。
今回、ElastiCache for memcached の分散処理についてちょっとだけ調べてみたが、ストアするデータの可用性、冗長性を考慮するのであれば、そもそも論だが memcached よりもレプリケーション機能のある Redis を選択するのもアリだと感じた。但し、自動でのフェイルオーバー等の細かい機能の調査を続けたい。
また、twemproxy を使えば複数ノードで構成された memcached クラスタにおいて、オーバーヘッドは最小限なままで分散構成は取れると思われる。
RDS for MySQL 5.6 + memcached Plugin の組み合わせについてはクエリキャッシュとして、単体の memcached を使っている構成の場合には置き換えることを検討しても良いかもしれない。
2014 かっぱのほげふが