はじめに
参考
Serf の内部構造
基本的なこと
serf は以下のような技術を利用して動作している。
- gossip protocol
- gossip protocol は SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol をベースにしている
但し、これらに幾つかの機能追加を行うことで伝播速度および収束速度を増加させている。
serf の特徴
serf では SWIM を以下のように拡張、修正しているとのこと。
速い収束とネットワーク障害からの迅速な回復を目的として...
serfでは 定期的にTCPでstate fullを同期する- それによって迅速な収束とネットワーク障害等から正常に回復することができる
ネットワーク帯域利用の効率化を目的として...
serfでは「障害検知プロトコル(failure detection protocol)」と「通知gossipレイヤ」を分割している- 分割した結果、速い gossip rate と緩やかな障害検出率で全体的に速い収束速度とデータ伝播速度を得ることが出来る
ノードの回復時の迅速なクラスタへの復旧を目的として...
これらについてはこちらで丁寧に訳されて解説頂いていて大変解りやすかった。
実際にどのように動作しているのか?
百聞は一見に如かず、上の資料がとにかく詳しい。日本で唯一無二の serf バイブル。
docker コンテナ同士でクラスタを組んでみる
前回の記事では docker コンテナをホストする UbuntuServer 13.04 にも serf エージェントをインストールして試したが今回は docker コンテナ同士のみでクラスタを組んでみる。イメージは以下のような感じ。

手順的には特に難しいことはない。
一台目の 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クラスタを構築することが出来た - もう少し、突っ込んで
serfとdockerで何が出来るか考えてみる