ようへいの日々精進XP

よかろうもん

docker + serf でどんなことが出来るか考えてみた(感じてみた)

はじめに

  • serf の内部構造(どのようにして動いているのか)についてのメモ
  • こちらを自分なりに意訳したメモ
  • ついでに docker コンテナ間で serf クラスタを構築してみる

参考


Serf の内部構造

基本的なこと

serf は以下のような技術を利用して動作している。

但し、これらに幾つかの機能追加を行うことで伝播速度および収束速度を増加させている。

serf の特徴

serf では SWIM を以下のように拡張、修正しているとのこと。

速い収束とネットワーク障害からの迅速な回復を目的として...

  • serf では 定期的に TCPstate full を同期する
  • それによって迅速な収束とネットワーク障害等から正常に回復することができる

ネットワーク帯域利用の効率化を目的として...

  • serf では「障害検知プロトコル(failure detection protocol)」と「通知 gossip レイヤ」を分割している
  • 分割した結果、速い gossip rate と緩やかな障害検出率で全体的に速い収束速度とデータ伝播速度を得ることが出来る

ノードの回復時の迅速なクラスタへの復旧を目的として...

  • SWIMdead ノードをクラスタからすぐに削除するが、serf は設定された時間は dead ノードの情報を維持する
  • その結果、ノードが復旧した際のクラスタへの復旧が迅速になる

これらについてはこちらで丁寧に訳されて解説頂いていて大変解りやすかった。

実際にどのように動作しているのか?

百聞は一見に如かず、上の資料がとにかく詳しい。日本で唯一無二の serf バイブル。


docker コンテナ同士でクラスタを組んでみる

前回の記事では docker コンテナをホストする UbuntuServer 13.04 にも serf エージェントをインストールして試したが今回は docker コンテナ同士のみでクラスタを組んでみる。イメージは以下のような感じ。

f:id:inokara:20131226070724p:plain

手順的には特に難しいことはない。

一台目の docker コンテナを起動、ログイン。

container=`sudo docker run -t -d -p 22 -p 7946 inokappa/wheezy-serf /usr/sbin/sshd -D`
ssh serf@`sudo docker inspect $container | jq -a '.[].NetworkSettings.IPAddress' | cut -d\" -f2`

一台目の docker コンテナ内で serf agent を起動する。

serf agent &

次に同じように二台目の docker コンテナも一台目と同じようにコンテナを起動してログインする。

container=`sudo docker run -t -d -p 22 -p 7946 inokappa/wheezy-serf /usr/sbin/sshd -D`
ssh serf@`sudo docker inspect $container | jq -a '.[].NetworkSettings.IPAddress' | cut -d\" -f2`

二台目では以下のように serf agent を起動する。

serf agent -join ${一台目の IP} &

以上で docker コンテナ間でのクラスタが構成された。

8dbe994eec9c    172.17.0.60:7946    alive
d1b2d4a82463    172.17.0.59:7946    alive

おお、簡単。


最後に

  • 英語のドキュメントに振り回されながらも serf について少しだけ理解することが出来た
  • 意外に簡単に docker コンテナ間で serf クラスタを構築することが出来た
  • もう少し、突っ込んで serfdocker で何が出来るか考えてみる