Home » Program » rsync で並列同期 (Tag: )

rsync で並列同期

2012/11/27 20:05

Drive Network で収容サーバ (お客様の機器) の機器を変更する様な場合、大量のデータ移行が必要ですが、rsync による差分同期でデータ移行に必要な時間を圧縮することが出来ます。

しかしながら、それでも 2 時間を超える様なケースもざらです。メンテナンスによる停止時間を 2 時間等とは恥ずかしくて通知出来ません。

何とか 30 分程度で収まる方法がないかと考えた時、並列同期する方法を思い付きました。

  • rsync による差分同期は、機器や帯域への負荷はほとんど見られない。
  • rsync を多重起動することで、同期対象のディレクトリを分散。1 つの rsync のプロセスが受け持つ対象数 ($limit) を減らす。
  • 1 プロセス当たり、10 – 30 分程度で収まる並列同期数を割り出す。

方針が決まれば、後はスクリプトを書いて検証するのみです。公開鍵の設定と root 権限による rsync のみの許可については省きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/perl -w
#
# rsync.pl
#
 
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// use Module
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
use strict;
 
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// Controller
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
    #// ----------------------------------------------------------
    #// Option Parse
    #// ----------------------------------------------------------
 
    my $dir = '/home/tools/hs';
 
    unless ($ARGV[0]) {
        print "usage: $dir/rsync.pl [hsXX]\n";
        exit;
    }
 
    my $host = $ARGV[0];
 
    my $rsync = $dir . '/rsync.sh';
    my $limit = 20;
    `rm $dir/rsync.list.*`;
 
    my $base = $dir . '/rsync.list.';
    my @list = `ls /home/ | grep cs1`;
    my $list = {};
    my $num0 = 0;
    my $num  = 1;
 
    #// ----------------------------------------------------------
    #// Start
    #// ----------------------------------------------------------
 
    foreach (@list) {
        chomp;
        $num0 += 1;
 
        $list->{$num} .= "+ $_/***\n";
 
        if ($num0 == $limit) {
            $num0 = 0;
            $num += 1;
        }
    }
 
    foreach (%$list) {
        next unless ($list->{$_});
 
        my $file = $base . $_;
 
        open WRITE, "+>$file";
        print WRITE $list->{$_};
        close WRITE;
    }
 
    foreach (1 .. $num) {
        `$rsync $host $_ > /dev/null &`;
    }

上記 rsync.pl は主に以下の手順で処理します。

  • 引数に `hostname -s` をセットし、
  • /home/cs* の対象数を $limit で分割し、
  • rsync.list.? に rsync の –include-from で解釈出来るフォーマットで出力し、
  • rsync.sh をバックグラウンドで起動。

次は rsync.sh です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/sh
#
# rsync.sh
#
 
ftime=/home/tools/hs/rsync.time.$2
flog=/home/tools/hs/rsync.log.$2
finc=/home/tools/hs/rsync.list.$2
hs_cs=`hostname`
hs_bg=$1'.example.jp'
 
    [ -z $1 ] && exit 0
 
    touch $ftime
    touch $flog
    chmod 640 $ftime $flog
 
    echo -n "0: " > $ftime
    echo `date "+%Y/%m/%d %H:%M:%S"` >> $ftime
 
    /usr/local/bin/rsync -avz --delete --ignore-errors -e "ssh -i /root/.ssh/rsync" --include-from="$finc" --exclude "*" /home/ root@$hs_bg:/fs/$hs_cs/ > $flog
 
    echo -n "1: " >> $ftime
    echo `date "+%Y/%m/%d %H:%M:%S"` >> $ftime
 
    time=`cat $ftime`
    log=`tail -n 2 $flog`
 
    echo -e "$time\n\n$log" | mail -s "rsync done $1 $finc ($hs_cs)" report@example.jp

rsync のログの最終 2 行は、正常に終了した場合は

sent 893142527 bytes received 1523569 bytes 216233.50 bytes/sec
total size is 188692618183 speedup is 210.91

上記の様になります。この状態が確認出来れば正常終了と判断して良いので、メールで通知する前提で作成しました。

対象ディレクトリが 200 弱で 600GB 程度の同期に、1 プロセスであれば 2 時間必要でしたが、$limit = 20 まで落として 10 プロセスで並列させたところ、30 分以内で収まる様になりました。

ディレクトリ配下によってはサイズやファイル数に差異があるので、必ずしも機械的な分散が功を奏するとは限りませんが、わずかな気転と時間で上々な結果です。

常用する場合はさらにレポートを整形したり、特定ディレクトリのみ同期させるオプションを追加・対象外とする等拡張は必要でしょうが、今回は良しとしています。

Random Select

川平湾 (16)
石垣島 (No. 7 ? 川平湾 Part 1) の続きです。スタート地点からは右側 (方位は南) の遊歩道を進んで様子をうかがった後は、再びスタート地点に戻り浜に降りました。少し風が強いくらいですが
iPod nano (PRODUCT) RED
分かる人にしか分からないタイトルですが、最近 iPod nano (第 7 世代) を購入しました。今まで音楽を聴く手段が PC で iTunes しかありませんでしたが、出張時の新幹線や飛行機内で、
こなゆきコラーゲン BODY SAVON (4)
タマチャンショップ には こなゆきコラーゲン や YASAI シャンプー & ヘアパック でお世話になっていますが、こなゆきコラーゲン BODY SAVON も 2 個目のリピートとなりました
ANA ポケモンジェット (2013/05/19)
2013/09/30 にすでにラストフライトを終えた ANA の ポケモンジェット に、過去 2 回乗り合わせたことがあります。2012/05/27 の沖縄出張への往路です。ピカチュウジャンボ (JA
東綾瀬公園 (2)
今年は観測史上 2 番目に桜の開花が早いとのことでした。個人的には、ここ 1 年程は実際の気候とカレンダーが 1 ヶ月近くずれ続けている気がしています。それはともかく、自宅の近所には通路と公園を兼ねた
豚骨野菜ラーメン 醤油 (1)
哲麺 (豚骨塩 チャーシューメン 味こいめ 脂あっさり) で、豚骨ラーメンの醤油・味噌・塩を一通り試しました。左上から 2 番目の列に 3 種類程ぽつんとあるメニュー、特に豚骨野菜ラーメンが気になっ
radserv ope 09
radserv ope (SATA 1 -> 2TB) では 3.5inch ハードディスクで納品された機器の、ハードディスクのみの交換を行いました。今回は 2.5inch ハードディスクで納品
R&D ファクトリー (4)
富山出張 (No. 1 – 株式会社エーティーワークス) の続きです。富山本社・データセンターの内部にも興味がありましたが、実際の組立現場にはもっと興味がありました。建物の 2F の入口か
ミニストップ 沖縄フェア (7)
ミニストップ (沖縄フェア Part 1) の続きです。出社前にオフィスに近い神田美土代町店を訪れた後、お昼休みを利用して神田錦町 1 丁目店を訪れました。神田錦町 1 丁目店の方が、店内飲食スペース
カレーライス (ハウス ザ・カリー) + あきたこまち (白米)
自宅 de カレーライス (ハウス ザ・カリー <辛口> Part 1) の続きです。出来上がりの猛烈に食欲をそそる香りの誘惑に負けず、1 日寝かしました。今回は白米のあきたこまちが残って
Valid HTML5 Valid CSS3 Another HTML Lint