@ijin

[Michael H. Oshita]

リージョン間高速データ転送

先日のJAWS DAYSのセッション「Behind the scenes of Presidential Campaign」でリージョン間のデータ転送を高速化するツールとしてtsunami udpcloudoptを使った話が出てたので試してみました。

通常、遠距離のサーバはRTTが大きくなるのでスループットが下がり、巨大なデータ転送には苦労しますが、なんと27TBを9時間で転送したとのこと!実際はマシンを並列にして同時転送したらしいので1台での実験です。

前提

  • 東京(server1) -> アメリカ西海岸(server2)
  • RTT: 120msぐらい
  • EC2 instance type: m1.large
  • OS: Ubuntu 12.04

ベーステスト

10Gファイルの作成

server1$ mkdir _tmp; cd _tmp
server1$ dd if=/dev/zero of=10G count=1 bs=1 seek=10G

転送

server1$ scp -rp 10G server2:
10G     100%   10GB  11.1MB/s   15:22

だいたい、90Mbpsぐらい。

Tsunami UDP

インストールは両サーバで

sudo apt-get install make gcc autoconf
wget http://downloads.sourceforge.net/project/tsunami-udp/tsunami-udp/tsunami-v1.1-cvsbuild42/tsunami-v1.1-cvsbuild42.tar.gz
tar xvfz tsunami-v1.1-cvsbuild42.tar.gz
cd tsunami-udp-v11-b42
make
sudo make install

tsunami udpはfetch型の作りなので、送信側のサーバ(server1)で対象ファイルのあるディレクトリに移動してサービス起動

server1$ cd _tmp
server1$ tsunamid *

で、クライアント(server2)からファイルをfetch

server2$ tsunami connect ec2-xx-x-xx-x-x get 10G quit

本当はftp-likeは対話型クライアントだけど、ワンライナーでも可能。
転送が完了するとクライアント側で情報が出力されます。

Transfer complete. Flushing to disk and signaling server to stop...
!!!!
PC performance figure : 224947 packets dropped (if high this indicates receiving PC overload)
Transfer duration     : 419.32 seconds
Total packet data     : 183339.18 Mbit
Goodput data          : 181958.17 Mbit
File data             : 81920.00 Mbit
Throughput            : 437.23 Mbps
Goodput w/ restarts   : 433.93 Mbps
Final file rate       : 195.36 Mbps
Transfer mode         : lossless

おお、確かに速い!スループットもセッションでも言ってた476Mbpsに近いし。

サーバ側では

Server 1 transferred 10737418241 bytes in 419.33 seconds (195.4 Mbps)

ファイル自身の実際の転送レートはFinal file rateである195.4Mbps。 多分、パラメータチューニングやより速いディスクを使うとスループットはさらに向上すると予想。

cloudopt

次は圧縮、TCP最適化、data deduplication等、様々な技術を用いてWANを高速化するcloudoptの実験。こちらは有料で、ソフトウェアをインストールしてライセンスを購入(15日間のお試しあり)して使う方法とAmazon Marketplaceでセットアップ済みの課金型AMIを起動する方法がとれます。今回はてっとり早く後者で。

AMIはMarketplaceでCloudoptを検索し、各リージョンで1台づつ起動。

Ubuntuベースなのが良いですね。

まずscpから呼べるcloudcopyを使っての転送

server1$ scp -rp -S cloudcopy 10G server2:
10G                 100%   10GB  41.5MB/s   04:07     
CloudCopy transferred 17.22 MB, saving 99.8% of bandwidth by sending 9.983 fewer GB 

お、速い。しかしよく見てみると17.22MBしか転送されてません。どうやらファイル自体が全てゼロ埋めなので圧縮とdeduplicationが最大限効いているみたい。

では、今度は実際のDBのバックアップで転送実験(容量14GB)

server1$ scp -rp -S cloudcopy dbbackup.tar server2:
dbbackup.tar                100%   14GB  11.2MB/s   20:42   
CloudCopy transferred 6.041 GB, saving 55.5% of bandwidth by sending 7.528 fewer GB

スループットはほぼ一緒だけど、転送容量が削減できてます。

一度転送したファイルはbyte cacheされるので、次に転送する時は差分だけ送るので高速化されます。

server2$ rm dbbackup.tar 

server1$ tar rvf dbbackup.tar file
server1$ scp -rp -S cloudcopy dbbackup.tar server2:
dbbackup.tar                100%   14GB  20.0MB/s   11:35  
CloudCopy transferred 59.57 MB, saving 99.6% of bandwidth by sending 13.511 fewer GB

リージョン間レプリケーション

次はMySQLのレプリケーション実験。

各インスタンスでのピア設定

server1$ sudo cloudconfig peer_add server2 server2_local_ip(10.x.x.x)
server2$ sudo cloudconfig peer_add server1 server1_local_ip(10.x.x.x)

これでcloudoptを使ったサーバ間のトンネルが確立されます。MySQLのレプリケーションはprivate ipでの設定が必要。 一通りレプリケーションが出来き、スレーブIOを停止した状態でマスターにしばらく書き込んだのちに再開すると、binlogが転送されるのでcloudstatsコマンドで統計が見れます。

Component - cloudoptimizer
------------------------------------------------------------
           Number of connections:                    1
              Original data size:            111.96 MB
           Transferred data size:             52.44 MB

            Bandwidth Saving:             59.51 MB (53.2%)

53.2%の転送容量削減!

結論

以上を組み合わせれば、新たなCDP候補である「リージョン間レプリケーションパターン (Cross-Region Replication Pattern)」が実現できます。

  • 巨大データをリージョン間で転送するにはtsunami udpが有効そう
  • リージョン間での差分バックアップやレプリケーション向けにはcloudoptで高速化
  • 普通のHTTP通信とかも使えるかも
  • s3へのアップロード高速化も対応しているのでいずれ試してみたい

Comments