長らく止まってましたが、 ここにまた技術メモでも書いていきたいところ。 まとめないとどんどん抜け落ちていってしまう。
しかし、RD をずっと書いていなかったら、書き方忘れている! RD は emacs の rd-mode じゃないと書きにくいね。
と言うわけで設定メモを書いていこう。
某所で MySQL のレプリケーションを ssh のトンネル経由でやっていたのだけど、 これをようやく自動化してみたのでその記録。
まず、ssh 接続の監視と張り直しをしてくれる autossh を使う。これは、基本的に子プロセスとして ssh を上げ続けてくれる。 内部的には -L と -R を組み合わせたループを作って、定期的(標準10分) おきにネットワークの疎通をチェックし、子プロセスの ssh が死んだり ネットワークが切れたりした場合は ssh を再起動する。
これだけで十分に見えるかもしれないけど、autossh は以下の条件で親の autossh 自体が終了してしまう。
基本的には、こういう事が起きても意図的に止め無い限り再試行して欲しいので、 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
-c blowfish オプションを追加。この方が早いので。
……というのは ssh1 時代の古い話だった。 ssh2 なら勝手に選んでくれる(おまけに blowfish じゃない方がいい)ので -c は削除。
2010-09-22 追記: スクリプトともう少し詳しい記事書いたよ
btrfs は面白そうだけど、いきなり重要な所に使うのは怖い、 と言う事で家のバックアップハーティションを btrfs にしてみた。 透過圧縮もサポートしてるし、cow だからバックアップには向いてそう。
btrfs のサブボリュームというのは、単にメインボリュームの中のサブディレクトリとして見える。 そして、スナップショットはボリューム単位で作成可能で、 これもまた単にディレクトリに見える(と言うか、呼び方は違うが実質はサブボリューム)。
と言う事で、
単純にこれだけで pdumpfs や faubackup とか rsync --link-dest と同じ事が高速かつ手軽に出来るはず。
例えばこんなの。 重要なのは最後の3行なので、そこだけ見ればOK。
#!/bin/bash set -e backup_base=/backup target="${1%/}" shift if (echo "${target}" | egrep -q "^[0-9a-zA-Z.-]+:"); then host=${target%:*} dest="${target#*:}" else host=$(hostname) dest="${target}" fi dest="${dest////_}" dest="${backup_base}/${host}/${dest#_}" if [ -z "${target}" ]; then echo "Usage: $0 <target_dir> [rsync-options]" >&2 exit 255 fi if [ ! -d "${dest}" ]; then mkdir -p "${dest}" fi if [ ! -d "${dest}/cur" ]; then btrfsctl -S cur "${dest}" fi || true rsync -acSHXA --numeric-ids --del "$@" "${target}/" "${dest}/cur/" btrfsctl -c "${dest}/cur" >/dev/null || true btrfsctl -s "${dest}/$(date +%Y-%m-%dT%H:%M:%S)" "${dest}/cur" > /dev/null || true
今のところ、スナップショットをとる前に btrfsctl -c で sync する必要があるようだ。
まあとにかく、"/path/to/btr-backup /etc" のような感じで起動すると、 /backup/ホスト名/対象/cur にコピーしてから、タイムスタンプのスナップショットを作る。 こんな感じで。
sugi@tempest:/backup/tempest/etc% ls -il | tail -3 256 drwxr-xr-x 1 root root 10532 2010-04-09 06:16 2010-04-10T04:19:22/ 256 drwxr-xr-x 1 root root 10532 2010-04-10 14:33 2010-04-11T04:19:55/ 256 drwxr-xr-x 1 root root 10532 2010-04-10 14:33 cur/
i-node 番号が全部 256 になっているので、普通のディレクトリじゃないことが分かりますね。
落とし穴/問題は、
と言ったところか。今のところ巧く動いている。暫く使ってみよう。
rm -rf では消えないので注意。cow だから当たり前だけど、rm で中身を消すと、 ファイルは見えなくなって余計使用量が増える。
しかし困った事に、リリースされている btrfs-tools v0.19 では スナップショットやサブボリュームの削除が出来ない。
現状で削除する場合は、新しいカーネル(確認してない。 2.6.31 以上か?)で、 btrfs-progs-unstable を git レポジトリから取って来てビルドする必要がある。
その上で btrfsctl の作り直し版の様な、統合コマンドの "btrfs" を使って削除する。 例えば
btrfs subvolume delete /backup/tempest/etc/2010-04-07T04:19:21
とすれば消える。スナップショットとサブボリュームの区別は無いので、 スナップショットを消す場合も subvolume delete で OK. rsync 等で作った場合と違って、消す作業は一瞬なのがいいね。
また間隔が空いてしまった……。
CentOS も少しは勉強しないとなぁ、ということでキャンペーンをやっていた お名前.com の VPS を借りてみた。自動アップデートを Off にすれば、 yum がそのまま使えるそうなので。 「管理ツールとの不整合不整合が起こる可能性がある」と書いてあるけど、 まあそんなことは構わないしいいや。
随分ほったらかしだったのだけど、まずマシン情報などメモってみる。
CPU 12 個にびっくり。単に親環境ののをそのままマップしてるのかな? 特定のインスタンスがあるCPUに偏る事を防止できるけど、全体が遅くなるような。
OpenVZ が CPU 情報を書き換えるかどうかは知らないけど、6コア x2 に見える。
processor : 11 vendor_id : AuthenticAMD cpu family : 16 model : 8 model name : Six-Core AMD Opteron(tm) Processor 2431 stepping : 0 cpu MHz : 2400.094 cache size : 512 KB physical id : 1 siblings : 6 core id : 5 cpu cores : 6 apicid : 13 fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc nonstop_tsc pni cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy altmovcr8 abm sse4a misalignsse 3dnowprefetch osvw bogomips : 4800.20 TLB size : 1024 4K pages clflush size : 64 cache_alignment : 64 address sizes : 48 bits physical, 48 bits virtual power management: ts ttp tm stc 100mhzsteps hwpstate [8]
PleskWiki や Fulldigitのページ を見ると Virtuozzo のゲストのリソース配分量は /proc/user_beancounters を見れば良いと言うことのようなのだけど……。?? なんだろうこの barrier と limit の値は。何でこんな事に?
Version: 2.5 uid resource held maxheld barrier limit failcnt 10002413: kmemsize 6579180 7442388 9223372036854775807 9223372036854775807 0 lockedpages 0 0 9223372036854775807 9223372036854775807 0 privvmpages 6630 34421 9223372036854775807 9223372036854775807 0 shmpages 797 797 9223372036854775807 9223372036854775807 0 dummy 0 0 9223372036854775807 9223372036854775807 0 numproc 16 17 9223372036854775807 9223372036854775807 0 physpages 2607 17846 9223372036854775807 9223372036854775807 0 vmguarpages 0 0 9223372036854775807 9223372036854775807 0 oomguarpages 2608 17847 9223372036854775807 9223372036854775807 0 numtcpsock 6 6 9223372036854775807 9223372036854775807 0 numflock 1 2 9223372036854775807 9223372036854775807 0 numpty 1 1 9223372036854775807 9223372036854775807 0 numsiginfo 0 1 9223372036854775807 9223372036854775807 0 tcpsndbuf 111728 111728 9223372036854775807 9223372036854775807 0 tcprcvbuf 98304 98304 9223372036854775807 9223372036854775807 0 othersockbuf 6984 8288 9223372036854775807 9223372036854775807 0 dgramrcvbuf 0 8472 9223372036854775807 9223372036854775807 0 numothersock 8 10 9223372036854775807 9223372036854775807 0 dcachesize 612228 621618 9223372036854775807 9223372036854775807 0 numfile 890 890 9223372036854775807 9223372036854775807 0 dummy 0 0 0 0 0 dummy 0 0 0 0 0 dummy 0 0 0 0 0 numiptent 29 29 9223372036854775807 9223372036854775807 0