January 2013 posts

Jan 24, 2013

zsh のコマンドラインで tmux の現在のペイン内の文字列から dabbrev できるようにする設定。screen の hardcopy でやってたやつの tmux 版。

function _dabbrev_from_pane() {
    local sources
    sources=($(tmux capture-pane \; show-buffer \; delete-buffer | sed '/^$/d' | sed '$ d'))
    compadd - "${sources[@]%[*/=@|]}"
}
zle -C dabbrev-from-pane menu-complete _dabbrev_from_pane
bindkey '^o' dabbrev-from-pane

去年末の仕事納めで screen も使い納めて、tmux に移行してたけどこれだけできてないまま放置してたのでやっつけた。

あと、

  • Cent OS 5 のリモートホストに ssh すると terminfo 的なアレがアレしてるせいか vi が使えない
    • 代替案:tramp ちゃんと使う
  • bash だと表示がなんか崩れてたりする(PS1 の設定のせい?)
    • 代替案:全サバに zsh いれる(・∀・)

とかの未解決問題はまだ若干あるけど、概ね個人環境に追いついた。

Jan 17, 2013

Perlbal で Server::Starter(start_server command) によるホットデプロイをサポートするためのプラグイン、Perlbal::Plugin::ServerStarter というのを作った(作っている)。

https://github.com/ziguzagu/Perlbal-Plugin-ServerStarter

Perlbal の素敵な点の一つに、動的に設定変更できる(管理ポートに telnet, nc などでつないでコマンド送り込む)というのがあるけど、たぶんほとんどのプラグインでは設定の削除ができない。たとえば Vhosts プラグイン。

VHOST app.example.com   = app
VHOST admin.example.com = admin     ## これがいらなくなっても動的に削除するコマンドはない
VHOST www.example.com   = web

また、複雑な設定や開発環境などではテスト済みの大きめの設定変更なんかをちまちま動的に変更するのは、作業自体のテストもしづらいし、そもそもが面倒くさい。なので、ときには再起動で設定読み直しがどうしても必要になったりならなかったりする。ただ(一応)ロードバランサーという位置づけのソフトウェアでもあり、サーバーのエッジあたりで運用されることもなくはないので、できれば無停止でいきたい。

ということで Server::Starter 対応。以下使い方。

プラグインを読み込むと LISTEN というコマンドが使えるようになるので、SET listen = [ip:]port の代わりに使う。

LOAD ServerStarter

CREATE SERVICE web
  SET role    = web_server
  SET docroot = /path/to/htdocs
  LISTEN = 5000
ENABLE web

と設定ファイルに書き、start_server 経由で perlbal 起動。

$ start_server --port 5000 -- perlbal -c /etc/perlbal/perlbal.conf

ただ、ポート番号をコマンドラインと設定ファイルで重複して管理することになるのがアレなので、設定ファイルからポート番号抜き出して start_server に食わせてくれる start_perlbal というコマンドも用意した。

$ start_perlbal -c /path/to/perlbal.conf

これでよしなにしてくれる。知らないオプションは start_server にパススルーするので、

$ start_perlbal -c /path/to/perlbal.conf --pid-file perlbal.pid

というのも機能するように。

1つ注意点があるとすればログについてはちょっと見直しが必要。Perlbal(1.80現在) のログ出力は、

  • foreground で実行したら STDOUT
  • --daemon オプションで daemonize したら syslog

という実装になっていて、foreground で実行しつつもログは syslog に、というのができない。Server::Starter は仕様上 foreground で実行する必要がある(daemonize すると pid が変わってしまうので(fork して exit するから)、start_server で起動失敗扱いになる。はず。試した限り。)ので、perlbal --daemon でいままで運用していた場合は、daemontools (multilog) 使ったりするか、

$ sudo start_perlbal 2>&1 | /usr/bin/logger -p local7.warn -t perlbal &

とかして syslog やらファイルにログ出すようにする必要がある。

あと、start_server を経由せずに perlbal で起動しようとすると Server::Starter#server_ports よんだところで死んでそのまま起動できなんだけど、警告だけだして SET listen = [ip:]port の指定に読み替えてとにかく起動できたほうがいいかどうかは迷いどころ。そのフォールバックのせいで気づかずに start_server なしで起動してた、なんてことになるのはそれはそれで事故のもとかなぁとも思うけどはたして...。

実装自体は Perlbal 本体に取り込んだほうが美しいので安定したら考えたいところ。

とはいえ、これで Perlbal 無停止運用が可能になったよ。たぶん。 happy01

Jan 10, 2013

Ganglia Web 3.4 ぐらいからつかえる Views の機能が、ホストの垣根を超えて任意のグラフの一覧を自由に作れて、かつ aggregate graph も作れるっぽくて大変よさげなので使ってみた。

view の作り方は、設定ファイルディレクトリ(デフォルトは /var/lib/ganglia/conf)に view_ で始まる .json ファイルに JSON 書くだけ。手始めに varnish の接続数にまつわる metric をまるっと集めてみた。

{
  "view_name": "varnish",
  "view_type": "standard",
  "items": [
    {
      "aggregate_graph": "true",
      "host_regex": [ { "regex":"bal" } ],
      "metric_regex": [ { "regex":"varnish_client_conn" } ],
      "graph_type": "stack",
      "title": "client connections"
    },
    {
      "aggregate_graph": "true",
      "host_regex": [ { "regex":"bal" } ],
      "metric_regex": [ { "regex":"varnish_client_req" } ],
      "graph_type": "stack",
      "title": "client request"
    },
    {
      "aggregate_graph": "true",
      "host_regex": [ { "regex":"bal" } ],
      "metric_regex": [ { "regex":"varnish_backend_req" } ],
      "graph_type": "stack",
      "title": "varnish request to backend"
    },
    {
      "aggregate_graph": "true",
      "host_regex": [ { "regex":"bal" } ],
      "metric_regex": [ { "regex":"varnish_cache_hit_ratio" } ],
      "title": "varnish cache hit ration"
    }
  ]
}

これを /var/lib/ganglia/conf/view_varnish.json として保存して、『Views』タブをクリックすると左側の view 一覧に表示されるのでクリッコ。

Gangliavarnishview

(・∀・)イイネ!!

JSON の内容は以下の模様。

  • view_name - view の名前
  • view_type - standard or regexp。regexp だと正規表現でホスト名を指定できるらしいがどう使うのかが不明(ホストは items の中で指定するし...)
  • items - metric/graph の詳細

これで、view を定義。item の内容は、

  • hostname / host_regexp - ホスト名
  • metric / metric_regexp - "load_one" とかの metric の名前。
  • graph / graph_regexp - "load_report" とかの "_report" で終わる graph の名前。
  • aggregate_graph - "true" で aggregate graph に。
  • graph_type - aggregate graph の描画方法。line(折れ線)がデフォルトで、stack(積算)もある。
  • title - graph のタイトル

あたり。aggregate_graph 作る場合に、組み合わせ的に無理なものもありそうだけど...。

View 作ることで cluster や host の画面でちまちまグラフをちまちま探したり、host ごとにブラウザのタブ開いて行ったり来たりとかしなくて済むので大変具合がよい。いっぱい作ろう。

ちなみに(検索ヂカラが低いので)どこ探してもみつからなかったこのへんの内容は、去年末にでた Ganglia 本にさっくりのってた。機能解説、設定方法が網羅さらてるので Ganglia ドキュメントとして大変よいです。Ganglia 使いの皆様におかれましては必読でないかと(まだ読み途中だけど...)。