SlideShare a Scribd company logo
Masahito Zembutsu @zembutsu 
Technology Evangelist; Creationline , Inc. 
Shinagawa, Tokyo, 11 Dec 2014 
Code the Clouds Mix-up Vol. 2 
Serf / Consul 入門 ~仕事を楽しくしよう~ Why I need serf and Consul?
Serf / Consul 入門 3 / 65 
今日の内容 
• 
運用だが、もう人間は限界かもしれない 
• 
Serf や Consul は何を解決しますか? 
• 
Serf 入門 
• 
Consul 入門 
Topics of today.
クラウド・コンピューティング 
Cloud Computing
計画 
発注 
納品 
設置 
設定 
監視 
運用開始
計画 
発注 
納品 
設置 
設定 
監視 
運用開始 
実際のフローでは、ここがネックになりがち・・・ 
数週~1ヶ月程度 
few weeks or a month
計画 
発注 
納品 
設置 
設定 
監視 
運用開始 
クラウド・コンピューティング基盤 
Infrastructure as a Service 
1クリック 
one click
計画 
発注納品 
監視 
運用開始 
クラウド・コンピューティング基盤 
Infrastructure as a Service 
数分~10分 
few minutes
Serf / Consul 入門 9 / 65 
開発サイドに福音 
• 
すぐにサーバーが欲しい 
➡ 
クラウド・コンフィグレーション基盤の普及 
• 
すぐにサービスを展開したい 
➡ 
構成管理ツールやデプロイツールの普及 
• 
Chef, Ansible, Puppet, Salt Stack, Capistrano … etc
計画 
発注納品 
監視 
運用開始 
クラウド・コンピューティング基盤 Infrastructure as a Service 
数分~10分 
few minutes 
発注納品 
発注納品 
継続的デリバリー 継続的デプロイ 継続的インテグレーション
ふたつの新しい課題 
Two New Issues
1. 管理の煩雑さ 
Cumbersome Management
水 金 地 火 木 土 天 冥 海 
Mercury 
Venus 
Earth 
Mars 
Jupiter 
Saturn 
Uranus 
Pluto 
Neptune 
Hyperion
2.障害対応の迅速化 
Trouble Shooting and Quick Operations
監視 
Monitoring 
状況判断 
Situation Analysis 
行動 
Action
計画 
発注納品 
監視 
運用開始 
発注納品 
発注納品 
監視 
運用 
監視 運用 
クラウドによって環境の準備が迅速になったはず。 
しかし、台数の増加やシステム構成の複雑化によって、 
クラウドの価値を相殺しているのではないのか?
Serf / Consul 入門 17 / 65 
運用サイドに残る課題 
• 
動的に変化する環境 
➡ 
ホスト名・IPアドレスとサービスをどのように管理するか 
➡ 
構成図や手順書や不定期な見直し 
• 
求められる迅速な対応 
➡ 
現実世界と密接にかかわるサービスは、速やかな復旧が必要 
➡ 
管理対象のサーバーやサービス数の増加・複雑化
導き出される結論は
運用だが、 もう人間は限界かもしれない
Serf / Consul 入門 20 / 65 
解決したい事は? 
• 
動的に変わる環境の管理を楽にしたい 
➡ 
サーバの追加・停止のタイミングで 監視や設定を連動したい 
• 
迅速に行動を起こしたい 
➡ 
一次対応レベルの作業も、すぐにこなしたい 
➡ 
複数台の環境にまたがる作業を、スムーズに対応したい
Serf 
http://serfdom.io/
Consul 
http://www.consul.io/
Serf や Consul は 何を解決してくれますか?
答え:既存の業務フローを 変更せずに省力化します。
Serf / Consul 入門 25 / 65 
Serfの役割 
• 
メンバ管理 
➡ 
serf エージェント間でクラスタを構成し、情報を保持 
• 
イベントの共有 
➡ 
クラスタ全体で、イベントを瞬時に共有 
• 
トリガ機能 
➡ 
イベント発生時に、任意のコマンドをクラスタ全体で実行
Serf / Consul 入門 26 / 65 
Consulの役割 
• 
サービス・レベルの管理とイベント同期 
➡ 
Serf と同じ事を、ウェブやデータベース等のサービスが対象 
• 
インターフェースの提供 
➡ 
HTTP ( REST API ) 
➡ 
DNS 
➡ 
Key Value Storage
Serf / Consul 入門 27 / 65 
Serf / Consul 比較 
Serf vs. Consul 
http://www.serfdom.io/intro/vs-consul.html 
Serf 
Consul 
目的 
サービス検出とオーケストレーション 
サービス検出と設定 
ヘルスチェック 
低レベル(ノード死活監視) 
サービス単位で高度な調整 
キーバリューストア 
なし 
あり 
メンバーシップ 
ノード単位 
サービス単位 
Web API 
なし 
あり 
DNS インターフェース 
なし 
あり 
アーキテクチャ 
AP 型 ( 一貫性重視、可用性を犠牲 ) 
CP 型 ( 可用性より一貫性重視 )
Serf / Consul 入門 28 / 65 
誰が作っているの? 
• 
Hashicorp 社 
➡ 
https://www.hashicorp.com/ 
• 
Vagrant 
• 
Packer 
• 
Terraform 
• 
Serf 
• 
Consul 
• 
ATLAS ← New!
Serf 超入門
Serf / Consul 入門 30 / 65 
Serf とは何ですか? 
• 
メンバ管理とイベント同期のためのツール 
➡ 
サーバを必要としないクラスタを、 相互通信するゴシップ・プロトコルによって構成 
• 
すぐに動く・使える 
➡ 
バイナリ1個を置くだけで、依存関係が無い 
➡ 
低い学習コスト(シェルスクリプト程度の知識で使える)
Serf / Consul 入門 31 / 65 
ご注意ください 
• 
Serf の機能は Consul に統合されつつあります 
• 
しかし、試すべき理由が3つあります 
➡ 
機能が少ないため、 いきなり Consul を触るよりも、Serf のほうが扱いやすいです 
➡ 
クライアント・サーバ型ではないため、 簡単にクラスタを構成できます 
➡ 
1つのツールとして完成形になりつつあります
Serf / Consul 入門 32 / 65 
Serf は何ができますか? 
• 
一斉にコマンドを実行します ( exec , query ) 
➡ 
shutdown –h now 
➡ 
service httpd restart 
➡ 
service network restart 
➡ 
iptables -A INPUT -p tcp -s XXX --dport 80 -j DROP 
• 
監視登録やアプリケーションの設定変更をします
Serf / Consul 入門 33 / 65 
動作環境は? 
• 
複数の OS やアーキテクチャに対応しています 
➡ 
Linux ( 32bit, 64bit, ARM ) 
➡ 
FreeBSD ( 32bit, 64bit,ARM ) 
➡ 
MacOS X ( 32bit, 64bit ) 
➡ 
OpenBSD ( 32bit, 64bit ) 
➡ 
Windows ( 32bit, 64bit )
Serf / Consul 入門 34 / 65 
セットアップ方法は?( Linux ) 
• 
バイナリを入手し、サーバ上に配置します 
➡ 
wget -O 0.6.3_linux_amd64.zip ¥ https://dl.bintray.com/mitchellh/serf/0.6.3_linux_amd64.zip 
➡ 
unzip ./0.6.3_linux_amd64.zip 
➡ 
mv ./serf /usr/local/bin/serf 
➡ 
serf version Serf v0.6.3 Agent Protocol: 4 (Understands back to: 2)
Serf / Consul 入門 35 / 65 
Serf をどう動かしますか? 
• 
“serf” コマンドをエージェントとして起動します 
➡ 
serf agent & 
==> Starting Serf agent... 
==> Starting Serf agent RPC... 
==> Serf agent running! 
Node name: 'sion.pocketstudio.net' 
Bind addr: '0.0.0.0:7946' 
RPC addr: '127.0.0.1:7373' 
Encrypted: false 
Snapshot: false 
Profile: lan 
==> Log data will now stream in as it occurs: 
2014/12/06 14:28:33 [INFO] agent: Serf agent starting 
2014/12/06 14:28:33 [INFO] serf: EventMemberJoin: sion.pocketstudio.net 
$ serf members 
sion.pocketstudio.net 10.0.2.15:7946 alive
Serf / Consul 入門 36 / 65 
クラスタはどうしますか? 
A 
B 
serf join 
Agent joining: [B] 
Initiating push/pull sync with: B 
initiating push/pull sync 
Responding push/pull sync 
Responding to push/pull sync with: A 
EventMemberJoin: B 
EventMemberJoin: A 
• 
serf join コマンドを使います 
➡ 
serf join <IP addr>
A 
B 
Agent joining: [A] 
Initiating push/pull sync with: B 
Responding to push/pull sync with: C 
initiating push/pull sync 
Responding push/pull sync 
C 
ノード C が仲間になりたがってこっちを見ている! 
serf join 
EventMemberJoin: B 
EventMemberJoin: A 
EventMemberJoin: C 
EventMemberJoin: C
Serf / Consul 入門 38 / 65 
どんなイベントがありますか? 
• 
メンバ管理系 
➡ 
member-join … 参加 
➡ 
member-fail … 障害 
➡ 
member-leave … 離脱 
➡ 
member-leap … 削除 
➡ 
member-update … 更新 
• 
ユーザによる任意発生 
➡ 
event … 一方的に実行するだけ 
➡ 
query … 結果も取得する
Serf / Consul 入門 39 / 65 
イベントで何かするには? 
• 
“イベント・ハンドラ”を指定します 
➡ 
serf agent –event-handler=“event.sh” 
• 
シェルスクリプト 
• 
Perl, Ruby, Python … 
• 
バイナリ 
• 
その他の構成管理ツールとの連携
Serf / Consul 入門 40 / 65 
MuninやZabbix
Serf / Consul 入門 41 / 65 
LVS 
#!/bin/sh while read line do echo ${line} HOSTNAME=`echo ${line} | cut -d ' ' -f 1` ADDRESS=`echo ${line} | cut -d ' ' -f 2` ROLE=`echo ${line} | cut -d ' ' -f 3` case ${SERF_EVENT} in "member-join") if [ "${ROLE}" = "webapp" ] ; then ipvsadm -a -t 192.168.39.1:80 -r ${ADDRESS}:80 -g fi;; "member-leave" | "member-failed") if [ "${ROLE}" = "webapp" ] ; then ipvsadm -d -t 192.168.39.1:80 -r ${ADDRESS}:80 fi;; ¥?) echo "other";; esac break done exit 0 
# ipvsadm -A -t 192.168.39.1:80 -s rr 
# ipvsadm -a -t 192.168.39.1:80 -r 192.168.39.11:80 -g 
# ipvsadm -a -t 192.168.39.1:80 -r 192.168.39.12:80 -g 
# ipvsadm -Ln 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
-> RemoteAddress:Port Forward Weight ActiveConn InActConn 
TCP 192.168.39.1:80 rr 
-> 192.168.39.11:80 Route 1 0 0 
-> 192.168.39.12:80 Route 1 0 0
Serf / Consul 入門 42 / 65 
イベントを判別するには? 
• 
環境変数を使います。 
#!/bin/sh 
echo 
echo "$0 triggered!" 
echo 
echo "SERF_EVENT is ${SERF_EVENT}" 
echo "SERF_SELF_NAME is ${SERF_SELF_NAME}" 
echo "SERF_SELF_ROLE is ${SERF_SELF_ROLE}" 
echo "SERF_SELF_TAG is ${SERF_SELF_TAG}" 
echo "SERF_TAG_ROLE is ${SERF_TAG_ROLE}" 
echo "SERF_TAG_STATUS is ${SERF_TAG_STATUS}" 
echo "SERF_USER_EVENT is ${SERF_USER_EVENT}" 
echo "SERF_USER_LTIME is ${SERF_USER_LTIME}" 
echo "SERF_QUERY_NAME is ${SERF_QUERY_NAME}" 
echo "SERF_QUERY_LTIME is ${SERF_QUERY_LTIME}" 
echo 
echo "BEGIN event data" 
while read line; do 
echo $line 
done 
echo "END event data" 
echo "$0 finished!" 
echo 
Event Handlers - Serf by HashiCorp 
https://www.serfdom.io/docs/agent/event-handlers.html 
• 
これを使えば・・・ 
➡ 
監視の自動追加・削除 
➡ 
設定変更の自動化 
➡ 
アイディア次第で何でも!
Serf / Consul 入門 43 / 65 
詳しくは… 
• 
https://serfdom.io/ 
• 
Re: ご注文は自動化ですか?[2] http://www.slideshare.net/zembutsu/re-is-the-order-an-automation-2nd 
Software Design 
2014年9月・10月号 
“オーケストレーションツールSerf・Consul入門”
Consul 超入門
Serf / Consul 入門 45 / 65 
Consulが必要な理由 
• 
Serf は万能ではありません 
➡ 
イベント発生のトリガは2種類でした 
• 
Serf クラスタへの参加や離脱 
• 
任意のタイミングでのイベント実行 
➡ 
ウェブサーバの応答やDB サーバ障害をトリガにしたい時は? 
• 
Serf で行えますが、非常に面倒です 
• 
そんな時は Consul です
Serf / Consul 入門 46 / 65 
Consulはどう使いますか? 
• 
サーバ環境とクライアント環境を作ります 
➡ 
Consul サーバ 
• 
HTTP、DNS、WEB UI のインターフェースを持ちます 
• 
KVS を持ち、Consul クライアントの状態を保持します 
• 
状況変化をトリガとして、コマンドを実行できます 
• 
Raft プロトコルで可用性を高めています 
➡ 
Consul クライアント 
• 
consul エージェントでサービスを定義して、監視します
クライアント 
( consul node) 
サーバ 
( consul server)
クライアント 
( consul node) 
サーバ ( consul server) 
A 
B 
C 
新しいサービスが追加される 
まだサーバは何も知らない
クライアント 
( consul node) 
サーバ 
( consul server) 
A 
B 
C 
エージェントは 
サーバに情報を伝えると 
新しいサービスが追加される
クライアント 
( consul node) 
サーバ 
( consul server) 
A 
B 
C 
エージェントは サーバに情報を伝えると 
はじめて同期する 
A 
B 
C
クライアント 
( consul node) 
サーバ 
( consul server) 
A 
B 
もし、サービスが消えると 
A 
B 
C
クライアント 
( consul node) 
サーバ ( consul server) 
A 
B 
クライアントはサーバと情報を比較 サーバに“C”は不要と伝える 
A 
B 
C
クライアント 
( consul node) 
サーバ 
( consul server) 
A 
B 
クライアントはサーバと情報を比較 
サーバに“C”は不要と伝える 
A 
B 
あいよ
クライアント 
( consul node) 
サーバ ( consul server) 
A 
B 
クライアントはサーバと情報を比較 サーバに“C”は不要と伝える 
A 
B 
あいよ 
クライアントとサーバで情報が同期。この性質がアンチエントロピー
クライアント 
( consul node) 
サーバ 
( consul server) 
A 
B 
クライアントはサーバと情報を比較 サーバに“C”は不要と伝える 
A 
B 
あいよ 
クライアントとサーバで情報が同期。この性質がアンチエントロピー 
決定権を持つのは、クライアント側 
サービス状況の変更をトリガとして 
ただちに様々な動作を行える
Serf / Consul 入門 56 / 65 
どうやって使いますか? 
• 
consul にオプションを付けます 
➡ 
サーバ 
• 
$ consul agent -server -bootstrap ¥ -dc=local -node=consul1 -data-dir=/tmp/consul 
➡ 
クライアント 
• 
consul agent -dc=local -node=consul2 ¥ -data-dir=/tmp/consul2 -join=192.168.39.5
Serf / Consul 入門 57 / 65 
サービスはどう定義しますか? 
• 
JSON形式のファイルを用意します。 
{ 
"service": { 
"name": "mysql", 
"port": 3306, 
"check": { 
"script": "/usr/bin/mysqladmin -h 127.0.0.1 ping > /dev/null 2>&1", 
"interval": "10s" 
} 
} 
}
Serf / Consul 入門 58 / 65 
状態を知るには? 
• 
Web UI 
• 
HTTP API 
➡ 
JSON 
➡ 
REST API 
• 
DNS
Serf / Consul 入門 59 / 65 
DNSをどう使いますか? 
• 
正常なサービスを応答します 
➡ 
dig <サービス名>.<ノード名>.<データセンタ名>.consul 
• 
どんなシーンで使えますか? 
➡ 
DNS ラウンドロビン 
➡ 
名前解決によるマスター・スレーブの切り分け 
➡ 
などなど
Serf / Consul 入門 60 / 65 
イベントをトリガとするには? 
• 
“consul watch”を使います 
➡ 
status が変化したタイミングで任意のコマンドを実行します 
➡ 
consul watch –http-addr=127.0.0.1:8500 ¥ -type=service –service=mysql /opt/action.sh 
Watches - Consul 
http://www.consul.io/docs/agent/watches.html 
$ curl -s http://127.0.0.1:8500/v1/health/checks/mysql | jq '.[] | .Status' 
"passing"
Serf / Consul 入門 61 / 65 
設定ファイルの動的反映とは? 
• 
consul-template を使います 
➡ 
git clone https://github.com/hashicorp/consul-template.git 
➡ 
cd consul-template 
➡ 
make 
➡ 
sudo cp ./bin/consul-template /usr/local/bin/consul-template 
• 
用途 
➡ 
設定ファイルをテンプレートを元に自動生成・コマンド実行 
➡ 
例:リバースプロキシ用の設定ファイル作成後、デーモン再起動
Serf / Consul 入門 62 / 65 
詳しくは… 
• 
https://consul.io/ 
• 
Re: ご注文は自動化ですか?[2] http://www.slideshare.net/zembutsu/re-is-the-order-an-automation-2nd 
Software Design 
2014年9月・10月号 
“オーケストレーションツールSerf・Consul入門”
まとめ
Serf / Consul 入門 64 / 65 
仕事が楽になる、楽しくなる 
• 
なぜ Serf や Consul なのか? 
➡ 
複数台のサーバ管理が前提になる時代の課題を解決 
• 
開発は、構成管理ツール ( Chef, Puppet, Ansible 等 ) 
• 
運用でも、効率的に行う必要性 
➡ 
人間がボトルネックになっている現状認識 
• 
時間が掛かる 
• 
間違える 
➡ 
監視一次対応(判断不要な手順書)レベルの自動化につながる 
• 
実際には作り込みが必要だし、パーツも足りない
“すべての障害を 生まれる前に消し去りたい” この願いを叶えるには? 
To Be Continued …

More Related Content

Serf / Consul 入門 ~仕事を楽しくしよう~

  • 1. Masahito Zembutsu @zembutsu Technology Evangelist; Creationline , Inc. Shinagawa, Tokyo, 11 Dec 2014 Code the Clouds Mix-up Vol. 2 Serf / Consul 入門 ~仕事を楽しくしよう~ Why I need serf and Consul?
  • 2. Serf / Consul 入門 3 / 65 今日の内容 • 運用だが、もう人間は限界かもしれない • Serf や Consul は何を解決しますか? • Serf 入門 • Consul 入門 Topics of today.
  • 4. 計画 発注 納品 設置 設定 監視 運用開始
  • 5. 計画 発注 納品 設置 設定 監視 運用開始 実際のフローでは、ここがネックになりがち・・・ 数週~1ヶ月程度 few weeks or a month
  • 6. 計画 発注 納品 設置 設定 監視 運用開始 クラウド・コンピューティング基盤 Infrastructure as a Service 1クリック one click
  • 7. 計画 発注納品 監視 運用開始 クラウド・コンピューティング基盤 Infrastructure as a Service 数分~10分 few minutes
  • 8. Serf / Consul 入門 9 / 65 開発サイドに福音 • すぐにサーバーが欲しい ➡ クラウド・コンフィグレーション基盤の普及 • すぐにサービスを展開したい ➡ 構成管理ツールやデプロイツールの普及 • Chef, Ansible, Puppet, Salt Stack, Capistrano … etc
  • 9. 計画 発注納品 監視 運用開始 クラウド・コンピューティング基盤 Infrastructure as a Service 数分~10分 few minutes 発注納品 発注納品 継続的デリバリー 継続的デプロイ 継続的インテグレーション
  • 12. 水 金 地 火 木 土 天 冥 海 Mercury Venus Earth Mars Jupiter Saturn Uranus Pluto Neptune Hyperion
  • 14. 監視 Monitoring 状況判断 Situation Analysis 行動 Action
  • 15. 計画 発注納品 監視 運用開始 発注納品 発注納品 監視 運用 監視 運用 クラウドによって環境の準備が迅速になったはず。 しかし、台数の増加やシステム構成の複雑化によって、 クラウドの価値を相殺しているのではないのか?
  • 16. Serf / Consul 入門 17 / 65 運用サイドに残る課題 • 動的に変化する環境 ➡ ホスト名・IPアドレスとサービスをどのように管理するか ➡ 構成図や手順書や不定期な見直し • 求められる迅速な対応 ➡ 現実世界と密接にかかわるサービスは、速やかな復旧が必要 ➡ 管理対象のサーバーやサービス数の増加・複雑化
  • 19. Serf / Consul 入門 20 / 65 解決したい事は? • 動的に変わる環境の管理を楽にしたい ➡ サーバの追加・停止のタイミングで 監視や設定を連動したい • 迅速に行動を起こしたい ➡ 一次対応レベルの作業も、すぐにこなしたい ➡ 複数台の環境にまたがる作業を、スムーズに対応したい
  • 22. Serf や Consul は 何を解決してくれますか?
  • 24. Serf / Consul 入門 25 / 65 Serfの役割 • メンバ管理 ➡ serf エージェント間でクラスタを構成し、情報を保持 • イベントの共有 ➡ クラスタ全体で、イベントを瞬時に共有 • トリガ機能 ➡ イベント発生時に、任意のコマンドをクラスタ全体で実行
  • 25. Serf / Consul 入門 26 / 65 Consulの役割 • サービス・レベルの管理とイベント同期 ➡ Serf と同じ事を、ウェブやデータベース等のサービスが対象 • インターフェースの提供 ➡ HTTP ( REST API ) ➡ DNS ➡ Key Value Storage
  • 26. Serf / Consul 入門 27 / 65 Serf / Consul 比較 Serf vs. Consul http://www.serfdom.io/intro/vs-consul.html Serf Consul 目的 サービス検出とオーケストレーション サービス検出と設定 ヘルスチェック 低レベル(ノード死活監視) サービス単位で高度な調整 キーバリューストア なし あり メンバーシップ ノード単位 サービス単位 Web API なし あり DNS インターフェース なし あり アーキテクチャ AP 型 ( 一貫性重視、可用性を犠牲 ) CP 型 ( 可用性より一貫性重視 )
  • 27. Serf / Consul 入門 28 / 65 誰が作っているの? • Hashicorp 社 ➡ https://www.hashicorp.com/ • Vagrant • Packer • Terraform • Serf • Consul • ATLAS ← New!
  • 29. Serf / Consul 入門 30 / 65 Serf とは何ですか? • メンバ管理とイベント同期のためのツール ➡ サーバを必要としないクラスタを、 相互通信するゴシップ・プロトコルによって構成 • すぐに動く・使える ➡ バイナリ1個を置くだけで、依存関係が無い ➡ 低い学習コスト(シェルスクリプト程度の知識で使える)
  • 30. Serf / Consul 入門 31 / 65 ご注意ください • Serf の機能は Consul に統合されつつあります • しかし、試すべき理由が3つあります ➡ 機能が少ないため、 いきなり Consul を触るよりも、Serf のほうが扱いやすいです ➡ クライアント・サーバ型ではないため、 簡単にクラスタを構成できます ➡ 1つのツールとして完成形になりつつあります
  • 31. Serf / Consul 入門 32 / 65 Serf は何ができますか? • 一斉にコマンドを実行します ( exec , query ) ➡ shutdown –h now ➡ service httpd restart ➡ service network restart ➡ iptables -A INPUT -p tcp -s XXX --dport 80 -j DROP • 監視登録やアプリケーションの設定変更をします
  • 32. Serf / Consul 入門 33 / 65 動作環境は? • 複数の OS やアーキテクチャに対応しています ➡ Linux ( 32bit, 64bit, ARM ) ➡ FreeBSD ( 32bit, 64bit,ARM ) ➡ MacOS X ( 32bit, 64bit ) ➡ OpenBSD ( 32bit, 64bit ) ➡ Windows ( 32bit, 64bit )
  • 33. Serf / Consul 入門 34 / 65 セットアップ方法は?( Linux ) • バイナリを入手し、サーバ上に配置します ➡ wget -O 0.6.3_linux_amd64.zip ¥ https://dl.bintray.com/mitchellh/serf/0.6.3_linux_amd64.zip ➡ unzip ./0.6.3_linux_amd64.zip ➡ mv ./serf /usr/local/bin/serf ➡ serf version Serf v0.6.3 Agent Protocol: 4 (Understands back to: 2)
  • 34. Serf / Consul 入門 35 / 65 Serf をどう動かしますか? • “serf” コマンドをエージェントとして起動します ➡ serf agent & ==> Starting Serf agent... ==> Starting Serf agent RPC... ==> Serf agent running! Node name: 'sion.pocketstudio.net' Bind addr: '0.0.0.0:7946' RPC addr: '127.0.0.1:7373' Encrypted: false Snapshot: false Profile: lan ==> Log data will now stream in as it occurs: 2014/12/06 14:28:33 [INFO] agent: Serf agent starting 2014/12/06 14:28:33 [INFO] serf: EventMemberJoin: sion.pocketstudio.net $ serf members sion.pocketstudio.net 10.0.2.15:7946 alive
  • 35. Serf / Consul 入門 36 / 65 クラスタはどうしますか? A B serf join Agent joining: [B] Initiating push/pull sync with: B initiating push/pull sync Responding push/pull sync Responding to push/pull sync with: A EventMemberJoin: B EventMemberJoin: A • serf join コマンドを使います ➡ serf join <IP addr>
  • 36. A B Agent joining: [A] Initiating push/pull sync with: B Responding to push/pull sync with: C initiating push/pull sync Responding push/pull sync C ノード C が仲間になりたがってこっちを見ている! serf join EventMemberJoin: B EventMemberJoin: A EventMemberJoin: C EventMemberJoin: C
  • 37. Serf / Consul 入門 38 / 65 どんなイベントがありますか? • メンバ管理系 ➡ member-join … 参加 ➡ member-fail … 障害 ➡ member-leave … 離脱 ➡ member-leap … 削除 ➡ member-update … 更新 • ユーザによる任意発生 ➡ event … 一方的に実行するだけ ➡ query … 結果も取得する
  • 38. Serf / Consul 入門 39 / 65 イベントで何かするには? • “イベント・ハンドラ”を指定します ➡ serf agent –event-handler=“event.sh” • シェルスクリプト • Perl, Ruby, Python … • バイナリ • その他の構成管理ツールとの連携
  • 39. Serf / Consul 入門 40 / 65 MuninやZabbix
  • 40. Serf / Consul 入門 41 / 65 LVS #!/bin/sh while read line do echo ${line} HOSTNAME=`echo ${line} | cut -d ' ' -f 1` ADDRESS=`echo ${line} | cut -d ' ' -f 2` ROLE=`echo ${line} | cut -d ' ' -f 3` case ${SERF_EVENT} in "member-join") if [ "${ROLE}" = "webapp" ] ; then ipvsadm -a -t 192.168.39.1:80 -r ${ADDRESS}:80 -g fi;; "member-leave" | "member-failed") if [ "${ROLE}" = "webapp" ] ; then ipvsadm -d -t 192.168.39.1:80 -r ${ADDRESS}:80 fi;; ¥?) echo "other";; esac break done exit 0 # ipvsadm -A -t 192.168.39.1:80 -s rr # ipvsadm -a -t 192.168.39.1:80 -r 192.168.39.11:80 -g # ipvsadm -a -t 192.168.39.1:80 -r 192.168.39.12:80 -g # ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.39.1:80 rr -> 192.168.39.11:80 Route 1 0 0 -> 192.168.39.12:80 Route 1 0 0
  • 41. Serf / Consul 入門 42 / 65 イベントを判別するには? • 環境変数を使います。 #!/bin/sh echo echo "$0 triggered!" echo echo "SERF_EVENT is ${SERF_EVENT}" echo "SERF_SELF_NAME is ${SERF_SELF_NAME}" echo "SERF_SELF_ROLE is ${SERF_SELF_ROLE}" echo "SERF_SELF_TAG is ${SERF_SELF_TAG}" echo "SERF_TAG_ROLE is ${SERF_TAG_ROLE}" echo "SERF_TAG_STATUS is ${SERF_TAG_STATUS}" echo "SERF_USER_EVENT is ${SERF_USER_EVENT}" echo "SERF_USER_LTIME is ${SERF_USER_LTIME}" echo "SERF_QUERY_NAME is ${SERF_QUERY_NAME}" echo "SERF_QUERY_LTIME is ${SERF_QUERY_LTIME}" echo echo "BEGIN event data" while read line; do echo $line done echo "END event data" echo "$0 finished!" echo Event Handlers - Serf by HashiCorp https://www.serfdom.io/docs/agent/event-handlers.html • これを使えば・・・ ➡ 監視の自動追加・削除 ➡ 設定変更の自動化 ➡ アイディア次第で何でも!
  • 42. Serf / Consul 入門 43 / 65 詳しくは… • https://serfdom.io/ • Re: ご注文は自動化ですか?[2] http://www.slideshare.net/zembutsu/re-is-the-order-an-automation-2nd Software Design 2014年9月・10月号 “オーケストレーションツールSerf・Consul入門”
  • 44. Serf / Consul 入門 45 / 65 Consulが必要な理由 • Serf は万能ではありません ➡ イベント発生のトリガは2種類でした • Serf クラスタへの参加や離脱 • 任意のタイミングでのイベント実行 ➡ ウェブサーバの応答やDB サーバ障害をトリガにしたい時は? • Serf で行えますが、非常に面倒です • そんな時は Consul です
  • 45. Serf / Consul 入門 46 / 65 Consulはどう使いますか? • サーバ環境とクライアント環境を作ります ➡ Consul サーバ • HTTP、DNS、WEB UI のインターフェースを持ちます • KVS を持ち、Consul クライアントの状態を保持します • 状況変化をトリガとして、コマンドを実行できます • Raft プロトコルで可用性を高めています ➡ Consul クライアント • consul エージェントでサービスを定義して、監視します
  • 46. クライアント ( consul node) サーバ ( consul server)
  • 47. クライアント ( consul node) サーバ ( consul server) A B C 新しいサービスが追加される まだサーバは何も知らない
  • 48. クライアント ( consul node) サーバ ( consul server) A B C エージェントは サーバに情報を伝えると 新しいサービスが追加される
  • 49. クライアント ( consul node) サーバ ( consul server) A B C エージェントは サーバに情報を伝えると はじめて同期する A B C
  • 50. クライアント ( consul node) サーバ ( consul server) A B もし、サービスが消えると A B C
  • 51. クライアント ( consul node) サーバ ( consul server) A B クライアントはサーバと情報を比較 サーバに“C”は不要と伝える A B C
  • 52. クライアント ( consul node) サーバ ( consul server) A B クライアントはサーバと情報を比較 サーバに“C”は不要と伝える A B あいよ
  • 53. クライアント ( consul node) サーバ ( consul server) A B クライアントはサーバと情報を比較 サーバに“C”は不要と伝える A B あいよ クライアントとサーバで情報が同期。この性質がアンチエントロピー
  • 54. クライアント ( consul node) サーバ ( consul server) A B クライアントはサーバと情報を比較 サーバに“C”は不要と伝える A B あいよ クライアントとサーバで情報が同期。この性質がアンチエントロピー 決定権を持つのは、クライアント側 サービス状況の変更をトリガとして ただちに様々な動作を行える
  • 55. Serf / Consul 入門 56 / 65 どうやって使いますか? • consul にオプションを付けます ➡ サーバ • $ consul agent -server -bootstrap ¥ -dc=local -node=consul1 -data-dir=/tmp/consul ➡ クライアント • consul agent -dc=local -node=consul2 ¥ -data-dir=/tmp/consul2 -join=192.168.39.5
  • 56. Serf / Consul 入門 57 / 65 サービスはどう定義しますか? • JSON形式のファイルを用意します。 { "service": { "name": "mysql", "port": 3306, "check": { "script": "/usr/bin/mysqladmin -h 127.0.0.1 ping > /dev/null 2>&1", "interval": "10s" } } }
  • 57. Serf / Consul 入門 58 / 65 状態を知るには? • Web UI • HTTP API ➡ JSON ➡ REST API • DNS
  • 58. Serf / Consul 入門 59 / 65 DNSをどう使いますか? • 正常なサービスを応答します ➡ dig <サービス名>.<ノード名>.<データセンタ名>.consul • どんなシーンで使えますか? ➡ DNS ラウンドロビン ➡ 名前解決によるマスター・スレーブの切り分け ➡ などなど
  • 59. Serf / Consul 入門 60 / 65 イベントをトリガとするには? • “consul watch”を使います ➡ status が変化したタイミングで任意のコマンドを実行します ➡ consul watch –http-addr=127.0.0.1:8500 ¥ -type=service –service=mysql /opt/action.sh Watches - Consul http://www.consul.io/docs/agent/watches.html $ curl -s http://127.0.0.1:8500/v1/health/checks/mysql | jq '.[] | .Status' "passing"
  • 60. Serf / Consul 入門 61 / 65 設定ファイルの動的反映とは? • consul-template を使います ➡ git clone https://github.com/hashicorp/consul-template.git ➡ cd consul-template ➡ make ➡ sudo cp ./bin/consul-template /usr/local/bin/consul-template • 用途 ➡ 設定ファイルをテンプレートを元に自動生成・コマンド実行 ➡ 例:リバースプロキシ用の設定ファイル作成後、デーモン再起動
  • 61. Serf / Consul 入門 62 / 65 詳しくは… • https://consul.io/ • Re: ご注文は自動化ですか?[2] http://www.slideshare.net/zembutsu/re-is-the-order-an-automation-2nd Software Design 2014年9月・10月号 “オーケストレーションツールSerf・Consul入門”
  • 63. Serf / Consul 入門 64 / 65 仕事が楽になる、楽しくなる • なぜ Serf や Consul なのか? ➡ 複数台のサーバ管理が前提になる時代の課題を解決 • 開発は、構成管理ツール ( Chef, Puppet, Ansible 等 ) • 運用でも、効率的に行う必要性 ➡ 人間がボトルネックになっている現状認識 • 時間が掛かる • 間違える ➡ 監視一次対応(判断不要な手順書)レベルの自動化につながる • 実際には作り込みが必要だし、パーツも足りない