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 かっぱのほげふが