2010-04-10
_ [misc] 復活するかも?
長らく止まってましたが、 ここにまた技術メモでも書いていきたいところ。 まとめないとどんどん抜け落ちていってしまう。
しかし、RD をずっと書いていなかったら、書き方忘れている! RD は emacs の rd-mode じゃないと書きにくいね。
_ [linux] autossh + daemontools で ssh トンネルを維持する
と言うわけで設定メモを書いていこう。
某所で MySQL のレプリケーションを ssh のトンネル経由でやっていたのだけど、 これをようやく自動化してみたのでその記録。
まず、ssh 接続の監視と張り直しをしてくれる autossh を使う。これは、基本的に子プロセスとして ssh を上げ続けてくれる。 内部的には -L と -R を組み合わせたループを作って、定期的(標準10分) おきにネットワークの疎通をチェックし、子プロセスの ssh が死んだり ネットワークが切れたりした場合は ssh を再起動する。
これだけで十分に見えるかもしれないけど、autossh は以下の条件で親の autossh 自体が終了してしまう。
- 最初に起動した ssh があまりに早く(AUTOSSH_GATETIME, 標準30秒)以内に終了した場合
- 子プロセスの ssh が直接 SIGTERM, SIGKILL, SIGINT を受け取った場合
- 以下2つは標準では無制限なので気にしなくて良いけど、まあ一応
- 起動時間が AUTOSSH_MAXLIFETIME に達した時
- ssh の再起動回数が AUTOSSH_MAXSTART に達した時
基本的には、こういう事が起きても意図的に止め無い限り再試行して欲しいので、 autossh をさらに daemontools から起動させる。以下のような run スクリプトを書いておく。
#!/bin/sh set -e AUTOSSH_POLL=60 export AUTOSSH_POLL exec 2>&1 exec > /dev/null exec setuidgid repl \ autossh target.host.name.jp \ -l sugi -i /etc/autossh-tunnel/path_to_ssh_key_without_pass \ -N -T -x -a -L 13306:localhost:3306 \ -o BatchMode=yes -o TCPKeepAlive=yes sleep 30
- sleep は autossh が即座に終了した場合に、再試行までちょっと待つために入れてある。"svc -d" で止めた時はすぐに終わるから大丈夫。
- 一応ポーリング間隔を短くしておく。
- ssh が新しくて、-y オプションが使えるなら付けておいた方が良さそう。lenny ではまだ無いけど。
- setuidid は自分の環境に合わせて変える必要あり。
- envdir を使っていないのは単に趣味です。
2010-04-18 追記
-c blowfish オプションを追加。この方が早いので。
2010-06-03 追記
……というのは ssh1 時代の古い話だった。 ssh2 なら勝手に選んでくれる(おまけに blowfish じゃない方がいい)ので -c は削除。