Serf
toExcelSerf を実運用に活かす話 + Consul もあるよ
@zembutsu
Apr 19, 2014, Tokyo Ginza #qpstudy LightningTalks
This is your last chance. After this, there is no turning back.
!
WARNING
このスライドには過激な表現やネットスラング、
アニメなどアキバ的文化の演出が含まれています。
qpstudy もうすぐ4周年おめでとうございます!
新人さんようこそ、この業界へ!
今の自分があるのも qpstudy のおかげ
です。この場を借りて、リーダーほか
スタッフの皆さんに御礼申しあげます。
http://www.nicovideo.jp/watch/sm6301392
業界といえば、あっ・・・(察し
これはMRTGですか?いいえ、Muninです。#qpstudy 06 LT
http://www.slideshare.net/zembutsu/mrtgmuninqpstudy-06-lt-7571433
3年前にLTの機会いただきました!
これはMRTGですか?いいえ、Muninです。#qpstudy 06 LT
http://www.slideshare.net/zembutsu/mrtgmuninqpstudy-06-lt-7571433
3年前のスライド・・・。
Serf
http://serfdom.io/
今日は Serf です!
Serf を基に Excel を生成する話
Serf とは
 軽量なオーケストレーションツール
 メンバ一覧とイベントの発生を管理
 障害検知、フェイルオーバー
 秒単位で全ノード上でイベント同期
serfdom = 農奴的な意味です。
※参考 http://www.serfdom.io/intro/
メンバーシップ
• エージェント間で相互通信
• 高速・軽量
• 非中央集権型
• 情報が直ぐに伝わる
障害検知
• 標準で実装済み
• 障害情報は直ぐに全体に伝わる
カスタムイベント
• メンバーシップ管理
• イベントやクエリを一斉実行
(デプロイやプロセス再起動)
• フレキシブルかつ軽量
ハンドサイン画像ジェネレーター
http://bzmm.jp/hs_gene/
ハンドサイン画像ジェネレーター
http://bzmm.jp/hs_gene/
ハンドサイン画像ジェネレーター
http://bzmm.jp/hs_gene/
ハンドサイン画像ジェネレーター
http://bzmm.jp/hs_gene/
ハンドサイン画像ジェネレーター
http://bzmm.jp/hs_gene/
やっぱり Serf !
100 ノード同時実行でも大丈夫!
※理論値 1秒で 95% 、2秒でほぼ100%伝播
物置かな?
オーケストレーション
 システム全体を統括する「何か」
 自分の中では、
「日々の運用業務の面倒な事を」
よしなに処理するための仕組み
ホスト一覧を Excel で提出の必要があっても…
http://oku.edu.mie-u.ac.jp/~okumura/SSS2013.pdf
基本動作 serf2excel.pl
 serf members の結果でホスト一覧取得
 Spreadsheet::WriteExce で Excel 出力
 定期的にメールを送ることも
$ uuencode ./hostlist.xls hostlist.xls | mail -s hostlist user@example.com
基本動作 serf2excel.pl
 serf members の結果でホスト一覧取得
 Spreadsheet::WriteExce で Excel 出力
 定期的にメールを送ることも
$ uuencode ./hostlist.xls hostlist.xls | mail -s hostlist user@example.com
$ serf members -format json | jq -c -r '.members[] | {addr, name}'
{"name":"manager.pocketstudio.net","addr":"192.168.39.3:7946"}
{"name":"node1.pocketstudio.net","addr":"192.168.39.11:7946"}
{"name":"node2.pocketstudio.net","addr":"192.168.39.12:7946"}
{"name":"node3.pocketstudio.net","addr":"192.168.39.13:7946"}
https://gist.github.com/zembutsu/10caa6b868fc994ec683
Serf のデータを基にホスト一覧を動的生成!
使いどころ
 Ansible 向けのインベントリを動的作成
 ServerSpecと連携して role 毎に適用
 …ホスト情報等が動的に変化する場面
更にkwsk
 … と思っていたのですが
昨日、地震で叩き起こされウトウト…
!?
笹喰
っ
て
る
場
合
じ
ゃ
ね
ぇ
!
Consul
http://www.consul.io/
サービス検出 障害検知
マルチデータセンタ キーバリューストレージ
サービス検出
Service Discovery
 ‘api’ や ‘mysql’ という service 名を定義
 検出は、consul ノードで自動的に開始
 HTTP API または DNS で結果を返す
サービス検出
Service Discovery
 ‘api’ や ‘mysql’ という service 名を定義
 検出は、consul ノードで自動的に開始
 HTTP API または DNS で結果を返す
$ curl -s http://192.168.39.5:8500/v1/catalog/nodes | jq '.'
[
{
"Address": "192.168.39.5",
"Node": "consul1.pocketstudio.net“
},
{
"Address": "192.168.39.6",
"Node": "consul2.pocketstudio.net“
}
]
サービス検出
Service Discovery
 ‘api’ や ‘mysql’ という service 名を定義
 検出は、consul ノードで自動的に開始
 HTTP API または DNS で結果を返す
$ dig @192.168.39.5 -p 8600 consul1.node.consul any
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>>
@192.168.39.5 -p 8600 consul1.node.consul any
(snip)
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;consul1.node.consul. IN ANY
;; ANSWER SECTION:
consul1.node.consul. 0 IN A 192.168.39.5
障害検知
Failure Detection
 サービスやノードのヘルスチェック
 ‘ping’ や ‘curl’ 等、コマンドレベルで指定
 任意の監視間隔 (秒単位 )
 HTTP API または DNS で結果を返す
障害検知
Failure Detection
 サービスやノードのヘルスチェック
 ‘ping’ や ‘curl’ 等、コマンドレベルで指定
 任意の監視間隔 (秒単位 )
 HTTP API または DNS で結果を返す
$ curl http://192.168.39.5:8500/v1/health/state/critical | jq '.'
[
{
"ServiceName": "web",
"ServiceID": "web",
"Notes": "",
"Status": "critical",
"Name": "Service 'web' check",
"CheckID": "service:web",
"Node": "consul1"
}
]
障害検知
Failure Detection
 サービスやノードのヘルスチェック
 ‘ping’ や ‘curl’ 等、コマンドレベルで指定
 任意の監視間隔 (秒単位 )
 HTTP API または DNS で結果を返す
スクリプト実行可=監視用プログラムのデプロイにも…?
# mkdir /etc/consul.d/
# echo ‘{“service”: {“name”: “web”, “tags”: ["rails"], “port”:
80, “check”: {“script”: “curl localhost:80 >/dev/null 2>&1″,
“interval”: “10s”}}}’ >/etc/consul.d/web.json
キーバリューストレージ
Key/Value Storage
 HTTP API を通して RESTful に操作
 Consul server 間でデータを複製・保全
 Consel システム機能が内部で利用
 ユーザによる任意データの利用も可能
キーバリューストレージ
Key/Value Storage
 HTTP API を通して RESTful に操作
 Consul server 間でデータを複製・保全
 Consel システム機能が内部で利用
 ユーザによる任意データの利用も可能
$ curl -XPUT -d 'hello, world!‘ ¥
http://192.168.39.5:8500/v1/kv/hello/key
true
# curl -s http://192.168.39.5:8500/v1/kv/hello/?recurse | jq '.'
[
{
"Value": "b3BlbiB0aGUgbmV4dA==",
"Flags": 0,
"Key": "hello/key2",
"ModifyIndex": 16,
"CreateIndex": 16
},
]
キーバリューストレージ
Key/Value Storage
 HTTP API を通して RESTful に操作
 Consul server 間でデータを複製・保全
 Consel システム機能が内部で利用
 ユーザによる任意データの利用も可能
$ curl -s http://192.168.39.5:8500/v1/kv/hello/key | ¥
jq '.[].Value | .' -r | base64 -d
hello, world!
マルチデータセンタ
Multi Datacenter
 複数のデータセンタにまたがって通信
 LAN 側と WAN 側で別々のゴシッププール
 ローカルクラスタにない問い合わせは転送
Consul Architecture - Consul
http://www.consul.io/docs/internals/architecture.html
Consul Architecture - Consul
http://www.consul.io/docs/internals/architecture.html
Consul Architecture - Consul
http://www.consul.io/docs/internals/architecture.html
強い基礎技術
 メッセージング ( Messageing ) … SWIM , Serf
 リーダー選出 ( Leader Election ) … Raft
 セキュリティ ( Security ) … TLS
 データストレージ ( Data Storage ) … UMDB
Serf との違い
Serf vs. Consul
http://www.serfdom.io/intro/vs-consul.html
Serf Consul
目的 サービス検出とオーケストレーション サービス検出と設定
ヘルスチェック 低レベル(ノード死活監視) サービス単位で高度な調整
キーバリューストア なし あり
メンバーシップ ノード単位 サービス単位
Web API なし あり
DNS インターフェース なし あり
アーキテクチャ AP 型 ( 一貫性重視、可用性を犠牲 ) CP 型 ( 可用性より一貫性重視 )
試してみた
 RHEL6/CentOS6 は、そのままでNG ( glibc の version )
 Serf に慣れていれば、ほぼ同じような捜査感
 Serf のような Consul の振る舞いだけど、別モノ
Consulを使ってみた | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2014/04/18/what_is_consul/
利用方法
Consulを使ってみた | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2014/04/18/what_is_consul/
$ wget -O 0.1.0_linux_amd64.zip ¥
https://dl.bintray.com/mitchellh/consu/0.1.0_linux_amd64.zip
$ unzip ./0.1.0_linux_amd64.zip
# mv ./consul /usr/bin/
$ consul
利用方法
Consulを使ってみた | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2014/04/18/what_is_consul/
$ wget -O 0.1.0_linux_amd64.zip ¥
https://dl.bintray.com/mitchellh/consu/0.1.0_linux_amd64.zip
$ unzip ./0.1.0_linux_amd64.zip
# mv ./consul /usr/bin/
$ consul
$ consul agent -server -bootstrap -client=192.168.39.5 -dc=local ¥
-node=consul1 -data-dir=/tmp/consul -bind=192.168.39.5
$ consul agent -dc=local -node=consul2 -data-dir=/tmp/consul2 ¥
-bind=192.168.39.6 -join=192.168.39.5
ドキュメント
 公式サイト
 http://www.consul.io/intro/index.html
 GitHub
 https://github.com/hashicorp/consul
Consul関連文書の参考訳、Serfとの違い等 | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2014/04/19/translation_consul_related_documents/
?10,000ft view
?10,000ft view
http://www.slideshare.net/zembutsu/serf-orchestration-with-zabbix-operation
Consul
http://www.consul.io/
おしまい。ありがとうございました。
 よい子の皆も Consul を試してみよう! お兄さんとの約束さ!
@zembutsu
みんな~
Consul ためさなイカ

Serf2Excel - Serf を実運用に活かす話 + Consul もあるよ