LoginSignup
14

More than 5 years have passed since last update.

BitTorrentを利用した高速デプロイツール Murder を使ってみる

Last updated at Posted at 2013-10-06

概要

Murderとは
TwitterがBitTorrentを利用して高速にデプロイするのに使っているツール。

http://www.publickey1.jp/blog/10/twitterbittorrent.html
の説明が一番わかりやすい。というか日本語ではこれしか無い。

特徴

  • Capistranoの拡張のように動く(?)
    • Capistrano(ruby)とPythonスクリプトで構成されており、Capistranoのdeploy_via:として動く
    • Capistranoを使ったことがあればその延長で使えるかも
  • BitTorrent等のライブラリの配布は自動
    • BitTorrentは同梱されており、必要なスクリプトやライブラリは、すべてのサーバへCapistranoで自動配布される
  • コマンド一発でデプロイ
    • Capistranoを使って、tracker,seeder等必要なプロセスの初期化から実際のデプロイと後片付けを行える

使って見た感想としては、とにかくすばらしく速い!
複数サーバーへデプロイするのに時間がかかっている全ての人のおすすめしたい。
が、まだまだ荒削りなツールなのでみんなで手を加えて育てていきたいところ。

構成

サーバーの種類は4種類になる。

  • Capistrano ノード

    • Capistranoを実行する実行元のノード
  • tracker ノード

    • torrentのトラッカーノードで全てのノードがこのサーバーに情報を集約するようだ
  • seeder ノード

    • 配布元のファイルを持っているサーバー
  • peers

    • 配布されるサーバー

補足

ドキュメントには、tracker seeder peersの3種類しか載っていないが、Capistranoとtrackerとseederを同じサーバーにすると、正常に動かない。同じサーバーを想定していないようだ。

インストール

環境の準備はansibleを使った。
別に何でも良いけど、手動だと全部のノードの設定変更が辛いかもしれない。

Capistrano ノード

capistranoとmurderをgemで入れる

roles/murder/capistrano/main.yml
- name: install capistrano
  gem: name=capistrano user_install=no state=latest

- name: install murder
  gem: name=murder user_install=no state=latest

tracker, seeder ノード

screenでtrackerスクリプトを常駐するようなので、screenを入れる。

roles/murder/{tracker,seeder}/main.yml
- name: install screen
  yum: name=screen state=latest

peers ノード

pythonが入っていれば他は特になにも要らないが、sshでsftpを有効化されている必要がある。

roles/murder/peers/main.yml
- name: enable sftp
  lineinfile: dest=/etc/ssh/sshd_config regexp="^Subsystem\s+sftp\s+/usr/libexec/openssh/sftp-server" insertafter="^#Subsystem" line="Subsystem sftp /usr/libexec/openssh/sftp-server"

実行方法

Capfileを準備

Capfileに必要なサーバー情報等を記載する

Capfile
require 'rubygems'
require 'murder'

set :user, "root"    # sshでログインするユーザー

ssh_options[:auth_methods] = ["publickey"] # 公開鍵認証を行う
ssh_options[:keys] = ["private.pem"]            # 認証に使う公開鍵を指定


set :remote_murder_path, '/usr/local/murder'   # 各ノードのmurderのサポートファイルを設置するpathを指定

role :peer, 'host1', 'host2', 'host3', 'host4', 'host5', host6', host7'    # trackerとseederになるhostが先頭にくるように書いた方がよさそう。
role :seeder, 'host1'
role :tracker, 'host1'

1. trackerを起動する

cap murder:start_tracker

2. デプロイするディレクトリ等をseederに配置

scp -r ./files host1:~/files

3. torrentファイルの作成

cap murder:create_torrent tag="Deploy1" files_path="~/files"

4. seederの起動

cap murder:start_seeding tag="Deploy1"

5. デプロイする

cap murder:peer tag="Deploy1" destination_path="/tmp"

これでpeersにデプロイが実行される。
destination_path=で指定したディレクトに展開される。

6. seeder と trackerを停止

cap murder:stop_seeding tag="Deploy1"
cap murder:stop_tracker

実験結果

デプロイ対象のファイル:
88,125ファイル 計3.4GB
を試しにデプロイしてみる。

1台にデプロイ (scpを使用)

real    10m13.282s
user    2m52.746s
sys     0m50.861s

1台のサーバーへ、単純なscpでデプロイすると10分程度

Murderを使った場合

Murderを使う場合、以下の手順に分かれるのでそれぞれの時間をtimeコマンドで計測
1. デプロイの前にtorrentファイル(tar.gz)を作る
2. torrentファイルの配布とtar.gz展開

また、配布するサーバー台数でどの程度時間が違うのかを見るために、5台の場合と25台の場合で試してみた。

torrentファイル作成

time cap murder:create_torrent tag="Deploy1" files_path="~/builds"
real    5m57.046s
user    0m0.311s
sys     0m0.032s

torrentファイルの作成時間はファイル数やファイルサイズに依存するが、今回のテストで用意したファイルでは6分程度

5台のサーバーにデプロイ

time cap murder:peer tag="Deploy1" destination_path="/tmp"
real    8m33.886s
user    0m0.633s
sys     0m0.056s

上記コマンドで、peerのノードへtorrentファイルの配布とtar.gzの展開が行われる
5台だと8分程度

25台のサーバーにデプロイ

time cap murder:peer tag="Deploy1" destination_path="/tmp"
real    10m43.146s
user    0m1.651s
sys     0m0.125s

25台にふやしても10分程度

という結果に。

1台にscpする時間で、25台にデプロイできた (torrentファイルの作成時間を除く)

ハマリポイント

  • trackerとseederにはscreenが必要
  • capistranoとseederサーバーは一緒にすると動かない
  • 全てのサーバーはhostコマンドでIPアドレスが引けないと行けない(ソース修正で回避可能 TBD後で書く)
  • capistranoのDSLがよく分からないw

その他

だれかCapistranoじゃなくてAnsibleの拡張にしてください・・・・

Ansible playbook化しました。-> http://yamasaki0.hatenablog.com/entry/2013/10/16/003149 , http://qiita.com/yamasaki-masahide/items/69d2873e0fbc2c05cf56

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14