はじめに
参考
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
で何が出来るか考えてみる