SlideShare a Scribd company logo
GMO Pepabo, Inc.
アドバンスドシニア
近藤うちお
2015/04/19 Pepabo Tech Conference
Consul は
全自動オーケストレーションの
夢を見るか?
me
Consul は 全自動オーケストレーションの 夢を見るか?
Rubyist
Consul は 全自動オーケストレーションの 夢を見るか?
From Fukuoka
Consul は 全自動オーケストレーションの 夢を見るか?
自動化厨
DevOps er
Consul は 全自動オーケストレーションの 夢を見るか?
デブオプスでCFPに応募しました
20I5.6.27 sat 10:00-17:00 @ Hakata!
今日のテーマ
Consul
Consul は 全自動オーケストレーションの 夢を見るか?
Consul has multiple components
> サービスディスカバリ
> ヘルスチェック
> Key/Value Store
> 複数データセンタ対応
Consul has multiple components
> サービスディスカバリ
> ヘルスチェック
> Key/Value Store
> 複数データセンタ対応
Excuse
> 0.5.0 の新機能については

全然紹介しません……
Raft Consensus
Algorithm
Raft Consensus
Algorithm
執政官
Consul
リーダー投票
http://ja.wikipedia.org/wiki/%E5%8F%A4%E4%BB%A3%E3%83%AD%E3%83%BC
%E3%83%9E%E3%81%AE%E5%85%AC%E8%A1%86%E6%B5%B4%E5%A0%B4
“– http://www.slideshare.net/pfi/raft-36155398
誤解を恐れずにザックリ説明すると
Client からのリクエストを
Leader がシリアライズしてクラスタ内の
他のプロセスに同じ順序でばらまく。
その他の参考サイト:
http://blog.obfuscatism.net/blog/2014/12/01/raft/
http://thesecretlivesofdata.com/raft/
cf. Raftの実装
> いくつかある
> https://github.com/hashicorp/raft
> Ruby は Celluloidプロジェクトの

https://github.com/celluloid/floss が

良さそう
Consulの
インストールと
運用
泥臭く、
嵌った点を共有します……
ディレクトリルール
> -config-dir= /etc/consul.d
> -data-dir= /var/consul/data
> -ui-dir= /var/consul/web_ui
> (プロセスはconsulユーザで動かす)
rpm つくった
> ドッカーでナウくビルドできます
> あえてサービスを含まない
> http://qiita.com/udzura/items/38075556d7609abd210a
consul agent -server
> スーパーバイザ∼ディー
> 実際はpuppetのsupervisordモジュール経
由で設定している
[program:consul_master]
command=/usr/bin/consul agent -config-dir=/etc/consul.d
numprocs=1
numprocs_start=0
priority=999
autostart=true
autorestart=true
startsecs=10
startretries=3
exitcodes=0,2
stopsignal=INT
stopwaitsecs=10
user=consul
redirect_stderr=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/consul_master/consul_master.err
stderr_logfile_maxbytes=250MB
stderr_logfile_backups=10
environment=GOMAXPROCS=4
停止時にちゃんとleaveしてくれ
> stopsignal=INT
> INTで止めるとgracefulにクラスタを

抜けるので、正しく止める際の手順では

明示するのが良さそう
> TERMとかで止めるとクラスタに残る
> 一応設定で変更可能
> https://www.consul.io/docs/agent/options.html#leave_on_terminate
サーバの数
> 3以上、なるだけサーバにしている
> "bootstrap_expect": 3
> https://www.consul.io/docs/internals/consensus.html
-bootstrap(-expect)?
> -bootstrap での起動は雑に試す時
> 本運用では -bootstrap-expectで
> 「3台未満は冗長構成と言わない」
> 2台ではリーダーがいつまでも決まらない
> Raft だから……
> http://thesecretlivesofdata.com/raft/ を

眺めて理解
-serverとクライアント
> 基本的に -server で立ち上げる
> 運用の都合上、台数が増減するもの
はクライアントモードにしている
> 万一落としたサーバがリーダーだったら、
リーダ不在期間が一瞬とは言え発生してし
まう。なるべく減らしたい
GOMAXPROCS
> CPUと同数(4なら4)
> Vagrant上では、ちゃんとVMに

CPUを2以上割り当てないと

永遠にリーダーが交代し続けて

面倒なことに。
> I/O APIC の有効化をしないとダメ

(忘れがち)
http://qiita.com/d_nishiyama85/items/c50c95795865ae7f714b
“– https://groups.google.com/forum/#!msg/consul-tool/qewFEqgAoF8/
b9hxhmy1v6gJ
The reason we recommend setting
GOMAXPROCS is to avoid potential
starvation of the scheduler. … If
a single goroutine blocks the scheduler it
can cause degraded performance.
vm.overcommit_memory=0
> 設定しないと、こう言う怖いログが出て

落ちる。-server の時のみ。
> http://qiita.com/udzura/items/d24157a8d5ba6ab60ec0
Programmable
Consul
consul watch
consul watch とは
> consulサブコマンド
> Consulでクラスタを組んでおけば、

色々なイベントを監視できる。
> 監視したいイベントを指定すると

特定のコマンドにJSONを渡せる。
> イベントが起こったらすぐ発火する。
イベント一覧
> key: KVSの値
> keyprefix: あるプレフィックス以下のKVSの値
> services: サービス全体の状態変更
> nodes: ノードの状態変更(追加削除)
> service: 特定のサービスの変更
> checks: 特定のcheckの変更
> event: カスタムイベント
実際は自分で
consul watch
せずにツールを噛ますことが多い
ヘルスチェックのサマリを
通知
consul-alerts
> eventやcheckを監視して通知する

デーモンを手軽に作れる
Ikachanへの通知……
> カスタムコマンドが指定できる
> カスタムコマンド作った
> https://github.com/udzura/consul-simple-notifier
> 作ったけど大量のノード入れ替えの
際には厳しい……
Slackへの通知
> 組み込みである
> 組み込み、フォーマットがしょぼいのでPRした
……
> スルー😢
> ぼくのforkをビルドすればイケます
ELBっぽい何か
動的ロードバランサーと言う夢
> ロードバランサーには夢がある
> NginxやPoundの設定を

動的書き換えとか
> mod/ngx_mrubyを使うとか
> Automatic Load Balancer
> Serfでも無論できます
> 「Webサーバの増減」なので

もしかしたら、単にバックエンドの
Nginxが死んだだけとかだとダメ……
> http://blog.glidenote.com/blog/2013/10/30/serf-haproxy/
Serf+HAProxyで作る
consul-
template
consul-template
> hashicorp公式
> consulのイベントを監視し、

サービス追加、ノード追加、

その他のタイミングでファイル更新
> ノードの情報からテンプレートを作れる
> 一緒にコマンドを打てる(reloadとか)
https://github.com/hashicorp/consul-template
具体的な奴
> Solrのクラスタを組みたい
> 前段のLBはNginxにした
> バックエンドのSolrスレーブは

横にスケールさせたい……
> ポチポチと追加する?
こう言うテンプレート
upstream solr_slaves {
{{range service "solr@pepabo-dc" "passing"}}
server {{.Address}}:{{.Port}};{{end}}
}
server {
listen 8983;
server_name _;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
location / {
proxy_pass http://solr_slaves;
}
}
こう言うテンプレート
upstream solr_slaves {
{{range service "solr@pepabo-dc" "passing"}}
server {{.Address}}:{{.Port}};{{end}}
}
server {
listen 8983;
server_name _;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
location / {
proxy_pass http://solr_slaves;
}
}
こうじゃ
$ /usr/local/bin/consul-template 
-consul 127.0.0.1:8500 
-template  

'/usr/local/consul-templates/nginx-solr.conf.ctmpl:
/etc/nginx/dynamic-conf.d/solr.conf:
systemctl reload nginx'
-log-level debug
……
長さは、厳しい……
こう言うのができる
upstream solr_slaves {
server 10.0.12.34:8983;
server 10.0.12.56:8983;
server 10.0.12.78:8983;
}
server {
listen 8983;
server_name _;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
location / {
proxy_pass http://solr_slaves;
}
}
通知する
> 変更したら通知して欲しい
> シェルとかでラッパーを噛ませば良し
良かったこと
> 動的にメンバを追加削除できる

(少なくともAPI的なキックポイント
がある)
> ヘルスチェックをしてくれる
> この2点の要件を難なく満たす

動的LBが、結構あっさりと作れるぞ?
厳しいなと思うこと
> Goのテンプレート記法慣れなすぎる
> ピンポイントでLBとかに使うのは

いいけど……、
> あんまり凝ると無限に

consul-templateの

デーモンができるのでは……
そして伝説へ……
Populus
Consul は 全自動オーケストレーションの 夢を見るか?
populus
> Consul event definition DSL
(仮)
> Senatus Populusque Romanus

から取った
> 名作ゲームとは無関係です……
Consulと以下のことをします
> consul watch プロセスの立ち上げ
と監視
> master node に一台だけ立ち上げ
> イベントごとの処理を定義するDSL
> 通知、ファイル生成、コマンド発行
……ぐらいはする
具体的なDSL
中身
> specinfra で

リモートコマンド

を発行
> ぼくもspecinfra一派になりました
> open3でconsulプロセスを立ち上げて監視
> なるべくなるべく標準ライブラリ
> Threadやinstance_evalがいっぱいだ
課題
> まだ consul watch -type event しか対応
していない………………
> せっかくのConsulなのに単一のマスターノード
が必要。いいのかな……
> Consulなので、アクティブスタンバイ構成にするのは楽
ではある
> なんかロバスト感に不安はある……
> 枯れてない、どころか俺が作った
demo
https://cloud.githubusercontent.com/assets/91011/7214167/8127b948-
e5d9-11e4-9fe3-6be611cd47af.gif
Consul は 全自動オーケストレーションの 夢を見るか?
TODOs
> とりあえず足りてない機能を……
> ファイルまだ生成できないし……
> checks, nodes ぐらいは

watchしたいし……
> あと、インストールが普通に考えて

大変なので omnibus にしたいな∼
→さっきできました!
絶賛開発中
> https://github.com/udzura/
populus
まとめ
Consulは

ただの「Nagiosの代替」
ではない
コードの力で
複雑なサービスディスカバリにも
対応できる
Consulが解決する課題は
多いが、
検証がまだまだ必要
Thanks
> @hiboma さん
> 彼のアドバイスが無ければここまで早く

導入が終わらなかったと思います……
PR
Consulを全力で使える仕事あります
> GMOペパボは

福岡/東京ともにエンジニアを

募集中です。
> アプリケーション/インフラ両方です!
> 詳細は:

http://pepabo.com/recruit/
career/
併せて読みたい
> OpenStack基盤との組み合わせて

オペレーションの破壊的な進化が実現できる
(かも)(まだ分かんないよ?)
注目の求人
minne 基盤エンジニア
ぼくらと
やっていきませんか
EOF

More Related Content

Consul は 全自動オーケストレーションの 夢を見るか?