rsyncとexpect

ちょっと複数のサーバにまたがったサービスを作っていて、最初はサーバ間をnfsでファイル共有していたのだけど、どうにもパフォーマンスが出ないので、その共有していたデータファイルをそれぞれで持つようにしたところ、パフォーマンスについては大変改善できたんですね。でも結局データなもんで、更新されたらすべてのサーバで同じにしないと意味がないんですね(汗) そこで、大海原を検索したところrsyncというキーワードが。

rsync -auv --delete [コピー元] [コピー先]

コピー元とかコピー先にはリモートも指定できるみたいだからネットワーク間のコピーもできる。俺の要件にピッタリ。rsyncはsshを使ってリモートにつなぐようだ。で、そうなってくるとログインがめんどくさくなってくる。自動化しようと思ってもそうもいかなくなってくる。そこで更に検索、で見つかったのがexpect。そしてこんなスクリプトを書いた。

#!/usr/bin/expect
set HOST [lindex $argv 0]
set timeout -1
spawn rsync -auv --delete [コピー元] [ユーザ名]@$HOST:[コピー先のパス]
expect "password: " {
    send "[パスワード]n"
} "(yes/no)?" {
    send "yesn"
    sleep 1
    send "[パスワード]n"
}
expect eof
catch wait result
set STATUS [ lindex $result 3 ]
exit $STATUS

これを使って、1台のサーバから他の4台のサーバに同じデータをミラーリングすることができた。削除系もやってくれるので便利な様子。最初はファイルが多いから時間がかかったが、あとは差分コピーになるのでサクサクになる。これで、マスタサーバのデータが更新されたついでにこのスクリプトを呼べばすべてのサーバが同じ状態になる。

これまで全部をJavaで書いたりC++で書いたりしてきたけど、どうせこのサービスしか動かさない専用サーバであるわけだし、こういうシステムというかOSと強調して、スクリプト化できるところはなるべくスクリプト化しといた方がメンテナンス性はいいよなぁ。

コメント

タイトルとURLをコピーしました