nginxで特定ホスト以外からのアクセスをメンテナンス画面にする方法 (2)

d:id:sfujiwara:20100812:1281587030 の revise。

Nginxのifは条件節に&&(and)が使えない、ifのネストもできないので、複数の条件で判別したい場合は変数を使うといいよって感じです。

server {

  ...

  #error_page   500 502 503 504  /static/50x.html;
  ### maintenance
  error_page   500 502 504  /static/50x.html;
  set $go_maintenance "true";

  if ($uri ~ "^/error/") {
    set $go_maintenance "false";
  }
  if ($remote_addr ~ "^192\.0\.2\.") {
    set $go_maintenance "false";
  }
  if ($remote_addr ~ "^10\.0\.0\.") {
    set $go_maintenance "false";
  }
  if ($http_user_agent ~ "nakanohito-desu") {
    set $go_maintenance "false";
  }
  if ($http_x_open = "sesame!") {
    set $go_maintenance "false";
  }

  error_page 503 /error/503.html;
  location /error/ {}
  if ($go_maintenance = "true") { return 503; } # maintenance
  ### /maintenance

  location /static {
    alias  /usr/irori/contents/example.com/static;
    expires 1h;
    gzip on;
    gzip_types text/css application/javascript application/x-javascript;

    keepalive_timeout 3 3;
  }

  location / {
    proxy_pass  http://127.0.0.1:2006;
    ...
  }

  location ... {
    ...
  }

}
  • ミソは「### maintenance」から「### /maintenance」まで。
  • カスタムのメンテページを出したい && 既存の設定(error_page)で503の制御をしている場合はコメントアウトして503だけはカスタムのメンテページを表示するようにする。
  • カスタムメンテページは /error/ 下に配置する。メンテページで画像とか使う場合もこのディレクトリ配下に置く。
  • 既存設定のlocationに食われないように、location /error/ {}と設定しておく。
  • 503にするかどうかは変数$go_maintenanceで判断する。初期値は"true"。(メンテ前は"false"にしておけばよろし)
  • カスタムメンテページは503になっちゃまずいので、^/error/ は "false"
  • ほか、メンテ中に中の人が動作確認したい条件をひっかけて "false" にする
    • $remote_addr でアクセス元のIPアドレスとか
      • $remote_addrをたくさん羅列したい場合は、HttpGeoModuleを使った方が効率的。
    • $http_user_agent でUser-Agentヘッダとか
    • $http_x_open とかでカスタムのHTTPリクエストヘッダとか
  • で、if ($go_maintenance = "true") { return 503; }
    • server {}の中でreturn 503してるので、後続にlocationブロックがたくさんあってもこれだけでOK

memcached(プロトコル)のデータレプリケーション

国内だけでなく国外(なぜか主に中国語)でもまだrepcachedについて言及してるのをちらほら見かけるのですが、repcachedはmemcached 1.2.8ベースですし(memcached 1.4.5に対応してる人もいるようですが)いまならKyoto Tycoon使えばいいんじゃないかと思うのです。

Kyoto Tycoonなら:

性能面で心配してる人は、だれかのベンチマークは参考までにして、自身の要件、サーバ環境でベンチマークをとるのがいいと思います。ただ、memcachedもKTもかなり高いreq/sを出せますので、よっぽどマシン性能に差がない限りクライアント1台ではサチれないでしょう。要件のreq/sが出ればそれでヨシとするか、どうしてもサチらせたいなら、LLとかじゃなくてlibmemcached(かlibmemcache)を使ってCで書いたクライアントを複数マシンから実行し、計測するのがいいでしょう。


ちなみに、

な場合の起動はこんな感じです。詳しくはktserverのリファレンスを参照のこと。

ktserver \
  -ls \
  -port 1975 \
  -tout 5 \
  -th 8 \
  -sid 101 \
  -ulog /kt/kt101/ulog-101 \
  -rts /kt/kt101/101.rts \
  -mhost kt102 \
  -mport 1975 \
  -cmd /kt/bin \
  -plsv /usr/local/app/kyototycoon/libexec/ktplugservmemc.so \
  -plex 'port=11401#opts=f' \
  :#bnum=1m \
;

Kyoto Tycoonの運用TIPSなどなど

チャオ!みんな、Kyoto Tycoonライフをエンジョイしてるかい!?

今日はKTライフを満喫してるミーからの運用TIPSアンドソーオンをお届けするYO!

kchashmgrとktremotemgrコマンドの補完

人間の脳活動のピークは22歳の今日このごろ、みなさんいかがおすごし? もうね、ミーは全然コマンドオプションとか覚えられないからシェル(bash)で補完しまくってるYO!

kchashmgrとktremotemgrだけだしオプション網羅してないし補完ルールもアレだけどオープン&シェアなマインドとガッツで気になる人はfork & push!

Nagiosで死活監視

ナギオス!みんな使ってるよね?

ミーはcheck_httpでKTのHTTP RPCのechoにアクセスしてデッドオアアライブの監視してる!

define command {
  command_name  check_kyototycoon
  command_line  $USER1$/check_http -I $HOSTADDRESS$ -p $ARG1$ -u /rpc/echo
}

define service {
  use                  critical-service
  hostgroup_name       kt
  service_description  Kyoto Tycoon server health check
  check_command        check_kyototycoon!1975
}

define hostgroup {
  hostgroup_name  kt
  members         kt101, kt102
}

define host {
  use        service-only
  host_name  kt101
  address    10.19.75.1
}
define host {
  use        service-only
  host_name  kt102
  address    10.19.75.2
}

レプリケーションの復旧方法

ちょっと再起動しちゃった

ディスクベースのDB使ってるときは再起動は問題ないんだけど、StashDBとかオンメモリDBを使ってるときに再起動するとデータ消えちゃうよね?でもイヤだよね?どう?

そんなときはバックグラウンドスナップショット(自動スナップショット)をとるようにしていればノープロブレムッ!

ktserverのオプションにスナショの出力先ディレクトリの指定(-bgs)と書き出しの間隔秒(-bgsi)を指定するダケ!

ktserverを(再)起動するときは起動したときと同じく-bgsと-bgsiをつけたままでスタート! そすると初期データはスナショから読みこむし、レプリケーションのタイムスタンプを記録しているRTSファイルもそのままあるだろうから、落ちてる間にレプリケーションのペアになされたsetとかもレプられてデータ同期するよ!

これでカジュアルにリスターツできるね!

フルダンプから

KTはホットバックアップをとれるYO!

レプってて片方のサーバのディスクが木っ端微塵にエクスプロードしても、デイリーでホットバックアップをとっていれば、このフルダンプから新しいレプペアをこさえられるのですぞ!

デイリーでとってなくても、片肺状態の生きているktserverからDOKIDOKIしながらその場でフルダンプとってもいいけどね!

だからktserverには↑のドキュメンツにあるように、-cmdとdbbackupスクリプトを置いておくのをドントフォーゲット!

エニウェイ、ホットバックアップをとるのはこんな感じで。

$ ktremotemgr sync -host kt101 -port 1975 -cmd dbbackup

ユーノー、ホットバックの指令はリモートからも発行できるぜ!

ホットバックアップが成功すると、「db.kch.01306840014856000000」というファイルがボーンする。ファイル名の末尾のメニーメニーなナンバーはベリーインポータントだから、デイリーでフルダンプとって別ホストにコピーして保存するときは、このファイル名のまま保存するようにな!

で、このフルダンプを使ってどうやってブランニューレプペアのデータセットを作り上げるかだが、こんな感じだ!

# cd /kt/kt101
# cp -p db.kch.01306840014856000000 db.kch
# echo 01306840014856000000 > 101.rts
# chown kt:kt 101.rts; chmod 644 101.rts

スナショファイルをktserverが期待するDBファイル名でcpするのはいいとして、ミソはスナショファイル名末尾のメニーなナンバーはスナショをとった時刻なので、それをレプリケーションを再開するタイムスタンプ(rts)としているところダ!rtsがないと、オールデータをレプするので時間とディスクI/Oがメニー発生するからアテンションプリーズな!(このへんの挙動と手順の妥当性は、リトルビッツ自信ないでげす…)

データセットができたらktserverをスターツすればおk。



あとあとバイザウェイ、ホットバックアップをとれるのはディスクベースのDBを使ってるときオンリーな!オンメモリDBのときは(DB*ファイル*が存在しないので)とれないぜ!

バット!ナウなKTなら、前述のバックグラウンドスナップショットにスナショ作成時のタイムスタンプもインクルードされているんで、オンメモリDBでも無駄なく復旧ができるぜ!詳しくは↓を読んでネ

kchファイルを消しちゃった!キャハ★

アルアル!アルよね!ちょっと指がスリップしちゃってKTのデータディレクトリ全部rm -frしちゃったりとか!

レプっていれば前述のとおり、ホットバックアップやバックグラウンドスナップショットから復旧できるのでノープロブレブ!

オールゾー! レプってないとき! フェイスがブルーになるネ!!

そんなときはちょっと強引だけどこんな方法で復元できるよ!(Linux限定)

まず、素数を数えて心を落ち着けよう(エラトステネス、サンクス!)。次に、ktserverのプロセスIDを調べよう。

プロセスIDが分かったら、おもむろにKTの実効ユーザかrootで:

# ls -l /proc/$KT_PID/fd/

ゼン、ktserverのプロセスがオープンしているファイルのファイル記述子(数字)とその実ファイルのパスがリストされるので、kchファイルを探してファイル記述子のナンバーをリメンバー!(たぶん 3)

そしたらば! kchashmgrのcopyコマンドで、さっきのファイル記述子なファイルからデータを読んでダンプする!

# kchashmgr copy -onl /proc/$KT_PID/fd/3 dump.kch

オフコース、copyをとる前にはクライアント(アプリケーションサーバとか)を落したり、iptablesでKTへのリクエストをリジェクトしたりして、更新がかからないようにしたほうがモアベターだぜ!

おわりに

ザッツオール!こんなすてきなKyoto Tycoonをデベロップしてくれた[twitter:@fallabs]サンにベリーサンクス!&アディオス!


こんかいちょっと文体を変えたのにお気づきになられたでしょうか? 差し支えなければ向学のため、おもしろセンテンスがもしあればそこを選択してはてなスターつけてもらえると幸甚です。