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 のみの許可については省きます。

#!/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 です。

#!/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

特製塩らーめん (1)
都内で評価の相当高いつけ麺 道 が隣駅にあって以前から気になっていたため、一度日曜日に訪れてみたものの、あまりの長蛇の列に退散しました。今回は平日で 11:30 開店の 30 分程前に着けば、大して並
与那国産カジキ 300g (1 日目)
ここ最近、休日のビールのお供にお刺身をチョイスすることが多々あります。夏季限定醸造生ビール 夏いちばんアサヒオリオン 沖縄だよりザ・プレミアム・モルツ <香るプレミアム> (Part 2)
野菜豆カレー (辛さ 20 倍)
カリーライス専門店 エチオピア 本店 (No. 7 – 辛さ 65 – 70 倍) の続きです。辛さ 70 倍を極めた後は、04/01 欧風カレー ボンディ (野菜カレー)04
らーめん 中 (ほうれん草増 + トッピング きゃべつ)
綾瀬に住んで 7 年以上になりますが、自転車で 5 分程度の距離にある 横浜らーめん武蔵家 はとなりが 松屋 ということもあって存在自体は知っていましたし、3 回程度は入ったことがありました。最後に食
魚河岸フライ定食 (2014/01/14)
記事では 築地食堂 源ちゃん (海老かき揚げとお刺身定食) から 1 ヵ月空いていますが、3 日後にまた訪れています。この日は 2013 年最後の出勤日で、取引先の方がご挨拶に来た後、ランチに同行いた
琥珀ヱビス + 超クリーミー泡サーバー
普段は ザ・プレミアム・モルツ を好んで飲みつつ、たまに YEBISU ヱビスビール を飲むことがありますが、秋はさらに楽しみが増えて 琥珀ヱビス が発売されます。最初の新発売が 4, 5 年前と思っ
石垣御神埼灯台 (7)
石垣島 (No. 10 – 川平湾 Part 4) の続きです。川平湾を満喫して 16 時を過ぎていました。本日最後の目的地 "石垣御神埼灯台" にもまだ間に合いそうで
星空のポーター (2)
ガーリックチャーハン + コンビーフハッシュ (Part 2) で 1 ヶ月半ぶりに 銀座わしたショップ を訪れた際、見たことがないビールを見つけました。HELIOS と書かれているので、青い空と海の
プレミアム急冷器 (2)
新開発 ! 超クリーミー泡サーバー (Part 4) で応募して 2 週間程で、まずプレミアム急冷器のみ先行して配送を完了したとの通知が入りました。白い化粧箱 ? と同サイズの小さい荷物でやって来まし
Transcend JetFlash 530 64GB USB メモリ
VAIO Fit 13A (カスタマイズ – タッチパッド) の続きです。環境調整中に色々つまずいていますが、VAIO に問題がある訳ではなく Windows 8.1 Pro 固有の問題だ
Valid HTML5 Valid CSS3 Another HTML Lint