Kageを使う時にやっておくと便利なこと
先ほど、Kageというgemが公開されました。
https://rubygems.org/gems/kage
https://github.com/cookpad/kage
このgemは、クライアントからのリクエストを複製し、バックエンドの複数のサーバに同じリクエストを送る事が出来ます。これを使うことで、これから本番に適用するコードの負荷試験や、書き込みをDummyDBに逃がして、slaveを本番に接続するなどして本番データを使用した負荷テスト、ミドルウェアのバージョンアップのテストを行うことが出来ます。
実際にクライアントに返されるレスポンスデータはproductionサーバとして指定されたサーバから返却されるため、本番のリクエストを使用してテストが簡単に行えるようになります。
実際に本番のアクセスを流す方法にはいくつかあると思います。Kageが導入されたサーバに直でトラフィックを流す方法や、既存のLBの配下にKageを組み込んで普通のアプリケーションサーバと同等に扱う方法などなど。
手軽な方法として、Apacheのmod_proxy_balancer を使う方法もあります。mod_proxy_balancer配下にKageを導入したサーバや本番サーバを接続して、loadFactorやcookieやpathでKageに流すアクセスを制御する事も簡単に出来ます。アプライアンスのLBなどでも同様の条件・構成で一部のアクセスをKageに流す構成もあると思います。
しかし、Kageが導入されたサーバの故障やプロセスが死んでしまった場合など、Kagaeのサーバを冗長化などしていないと、こちらに振り分けられたアクセスがエラーになってしまいます。それを防ぐために、apache(mod_proxy_balancer)を使う場合(LBなどでも)Sorryサーバの仕組みを使うと楽に回避出来ます。
簡単な構成は以下の通りです。
あ、図のBackupスペル間違ってた…
RewriteCond %{HTTP_COOKIE} hogeflag=1 RewriteRule ^/(.*)$ balancer://hoge_upstream/$1 [P,L] <Proxy balancer://hoge_upstream/> BalancerMember http://kage-server retry=30 max=9280 keepalive=Off ttl=30 loadfactor=100 disablereuse=off BalancerMember http://production-server status=+H </Proxy>
この設定では、cookieにhogeflag=1と入っていると、Kageサーバにリクエストが行くようになっています。
status=+Hを設定したBalancerMemberを用意することで、もし、kage-serverにアクセス出来ない場合だけ、production-serverにアクセスが行くようになります。
これは
status of this worker: 'D' is disabled, 'S' is stopped, 'I' is ignore-errors, 'H' is hot-standby and 'E' is in an error state. Status can be set (which is the default) by prepending with '+' or cleared by prepending with '-'. Thus, a setting of 'S-E' sets this worker to Stopped and clears the in-error flag.
http://httpd.apache.org/docs/2.2/en/mod/mod_proxy.html#proxypass
もともとこの設定はSorryサーバ用のものなのですが、Kageを使う際にも便利に使えます。
Sorryサーバとして設定する場合は大抵は以下の用になっていると思います。
RewriteRule ^/(.*)$ balancer://hoge_app_upstream/$1 [P,L] <Proxy balancer://hoge_app_upstream/> BalancerMember http://hoge001 retry=30 max=9280 keepalive=Off ttl=30 loadfactor=100 disablereuse=on BalancerMember http://hoge002 retry=30 max=9280 keepalive=Off ttl=30 loadfactor=100 disablereuse=on BalancerMember http://hoge002 retry=30 max=9280 keepalive=Off ttl=30 loadfactor=100 disablereuse=on BalancerMember http://sorry status=+H </Proxy>