Serf という Orchestration ツール #immutableinfra

43
Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved. Serf という Orchestration ツール March 25th, 2014 Naotoshi Seo @sonots DeNA Co., Ltd.

description

 

Transcript of Serf という Orchestration ツール #immutableinfra

Page 1: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Serf という Orchestration ツール

March 25th, 2014

Naotoshi Seo @sonotsDeNA Co., Ltd.

Page 2: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

2

自己紹介・瀬尾 直利 @sonots・DeNA Co., Ltd・インフラのDev・Rubyist・OSS 活動家・Fluentd コミッタ

Page 3: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

⁃ グラフツール⁃ HTTP POST するだけ⁃ GrowthForecast の Ruby クローン

http://focuslight.github.io/

Page 4: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

http://blog.livedoor.jp/sonots/archives/29646713.html

Yohoushi分散 Focuslight グラフツール

Page 5: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

⁃ ログを処理するアプリケーション(or フレームワーク)⁃ Ruby プラグインの仕組みが強力 (+250 plugins)

Page 6: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Page 7: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

7

Page 8: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Serf(1)

8

⁃ Orchestration ツール⁃ Vagrant で有名な Mitchell Hashimoto 氏が作った go 製のツール

⁃ メンテナは同 Hashicorp の Armon 氏

http://www.serfdom.io/

Page 9: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

オーケストレーション

9

BootstrappingOSのインストール作業 / Kickstart

Configurationサーバの設定作業 / Chef、Puppet

Orchestrationサーバ群のクラスタリングロードバランサに追加したり、監視入れたり、サーバ管理ツールに登録したり、という他のツールと連携するための作業手でコマンド叩いたり。Serf を使ったり (New!)

Page 10: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Blue-Green Deployment

10

http://martinfowler.com/bliki/BlueGreenDeployment.html

ここの設定

Page 11: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

インフラ作業あるある

11

新規サーバ1台投入するためには1. OSインストール (AWSインスタンス立ち上げる、mbgaclone [1])2. セットアップ (chef, puppet, touryo)オーケストレーション作業も必要1. サーバ管理ツールに登録 (admintool [1])2. 監視ツールに登録 (Nagios, Zabbix)3. メトリクス収集ツールに登録 (Ganglia, Munin)4. DNS登録5. LB 登録 (BigIP, nginx, HAProxy)

http://www.amazon.co.jp/dp/4774151114[1] mbgaを支える技術

Page 12: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

12

⁃ オーケストレーション作業は 1台でも面倒⁃ 100台入れ替える⁃ 1日10 Blue-Green Deployment したい

手動とか\(^o^)/オワタ

Page 13: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

13

それ Serf で(ry

Page 14: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Serf の動作イメージ

14

Page 15: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf agent の起動

15

$ serf agent -node=one

$ serf agent -node=two \ -bind=127.0.0.1:7947 -rpc-addr=127.0.0.1:7374

one two

$ serf membersone 127.0.0.1:7946 alive

$ serf members -rpc-addr=127.0.0.1:7374two 127.0.0.1:7947 alive

Page 16: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf join

16

$ serf join 127.0.0.1:7946 # join to one

$ serf members # oneone 127.0.0.1:7946 alivetwo 127.0.0.1:7947 alive

$ serf members -rpc-addr=127.0.0.1:7374 # twotwo 127.0.0.1:7947 aliveone 127.0.0.1:7946 alive

one twojoin

Page 17: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

17

A

D

B

C

1. join

D join

D join

※ Gossip プロトコルで伝搬

A joinB joinC join

Page 18: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

18

A

D

B

C

1. join

D join

D join

※ Gossip プロトコルで伝搬

A joinB joinC join

Page 19: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

イベントハンドラ

19

⁃ 任意のイベントで起動するスクリプトを登録できる#!/bin/bash# handler.shechoecho "New event: ${SERF_EVENT}. Data follows..."while read line; do printf "${line}\n"done

$ serf agent -event-handler=$HOME/handler.sh

⁃ 環境変数 SERF_EVENTにイベント毎に別の値が入る⁃ member-join, member-leave, member-failed, member-reap, user

⁃ STDIN にホスト名、IPアドレス 

Page 20: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

具体例

20

Page 21: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Serfで/etc/hosts更新

21

https://github.com/kentaro/serf-hosts

A

BC

join

member-join1. /etc/hosts にホスト名, IPアドレス追加member-leave1. /etc/hosts 該当行削除

同スクリプト 同スクリプト

Page 22: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

SerfでHAProxyに登録

22

http://blog.glidenote.com/blog/2013/10/30/serf-haproxy/

HAProxy

Web2Web1join

member-join1. /etc/haproxy/haproxy.cfg 追記2. /etc/init.d/haproxy reloadmember-leave1. /etc/haproxy/haproxy.cfg 該当行削除2. /etc/init.d/haproxy reload

スクリプトなし スクリプトなし

Page 23: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

サーバが起動したら自動で監視設定

自動でサービスイン

23

Page 24: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Immutable インフラに適したアーキテクチャ(持論)

24

Page 25: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

25

Monitor

中央集権型 Agent型

Web1 Web2

web1.cfgweb2.cfg

Web1 Web2agent agent

Monitor設定変更なし

ホストが立ち上がると勝手に情報を送り始める

Page 26: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Agent 型が適している

26

Page 27: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

27

⁃ HAProxy ロードバランサ (中央集権)⁃ MyDNS で DNSラウンドロビン (中央集権)⁃ Big IP ロードバランサ (中央集権)⁃ Ganglia リソースメトリクス (gmond, Agent 型)⁃ Munin リソースメトリクス (中央集権)⁃ Nagios 監視ツール (中央集権)⁃ Sensu 監視ツール (Agent 型)⁃ GrowthForecast, Focuslight グラフツール (Agent型)⁃ Fluentd ログ収拾 (Agent 型)

いろんなツール

Page 28: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

中央集権型ツールをagent 型アーキテクチャに

こじつけ直すのが

28

Serf

Page 29: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

思ったこと / 気になったことツラツラ

29

Page 30: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

どのぐらいの時間で伝搬されるのか?

30

http://www.serfdom.io/docs/internals/simulator.html

⁃ 30ノードで1.25s、100ノードでも2sほど

Page 31: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

イベントをどのノードに発火すべきか

31

⁃ 最初にどれかのノードに member-join イベントを発火しなければならない。

⁃ DNSラウンドロビンを使うとかして、ランダムに選択されるようにするとよさそう。

⁃ ※ もちろんその DNS の管理は serf で

A

D

B

C

DNSラウンドロビン

Page 32: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Event-handler script の更新は?

32

⁃ event handler スクリプトにバグがあるなどして更新する必要があった場合に、serf クラスタ全体に撒いて回らないといけない。

⁃ それこそ serf を使ってクラスタ全体を更新したい⁃ が、更新するためのスクリプトがバグっている⁃ 今までどおり capistrano かなにかで撒く?⁃ ※ Immutable ならイメージを更新してデプロイ

Page 33: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

監視をどのタイミングではずすべき?

33

⁃ member-leave, member-failed イベントで監視を外す

⁃ すると、本当にサーバが死んだ時にアラート飛ばない        ↓⁃ サーバ down 監視以外を Serf で外す⁃ サーバ down 監視を外すのは手動で(?)

Page 34: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

34

⁃ 監視に入れるなどの処理は全て Serf でやっておく⁃ サービスインはやらない

⁃ テストチームの作った自動QAで振る舞いをテスト⁃ (主にオーケストレーション層のテスト)⁃ 良きタイミングで別の仕組みでサービスイン?

いきなりサービスインは怖い?

Page 35: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

Advanced

35

Page 36: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf event

36

$ serf event [options] name [payload]

ex) serf event deploy 20140325

⁃ 環境変数 SERF_EVENTに user が、⁃ 環境変数 SERF_USER_EVENT に name が入る⁃ STDIN に payload が入る

⁃ ユーザーカスタムイベント

http://www.serfdom.io/docs/agent/event-handlers.html

Page 37: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf monitor

37

$ serf monitor

⁃ 稼働中の serf agent に attach してログを見れる⁃ serf agent のログレベルが warn でも、⁃ serf monitor -log-level debug と指定すればデバグレベルで参照できる

Page 38: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf tag

38

$ serf tags -set tag=value$ serf tags -delete tag

⁃ ノードにタグを付ける

$ serf membersone 127.0.0.1:7946 alive tag=value

⁃ 環境変数 SERF_TAG_{TAG} に value が入る⁃ ※ role は deprecated になりました

Page 39: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf query

39

$ serf query [options] name [payload]

⁃ event と違い、レスポンス (STDOUT) を受け取る⁃ クエリが終わるまで待ち続ける⁃ ただし、timeout したら諦める

⁃ -tag tag=value オプションでタグを指定できる

Page 40: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf query 応用例(1)

40

$ serf agent -event-handler=query:uptime=uptime

⁃ 全ホストから uptime コマンドの結果を集める

$ serf query uptimeAck from 'one'Response from 'one': 17:50 up 3 days, 2:52, 10 users, load averages: 3.83 2.46 2.27Total Acks: 1Total Responses: 0

http://pocketstudio.jp/log3/2014/03/14/serf-0-5-0/

Page 41: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

serf query 応用例(2)

41

$ serf agent -event-handler=query:sh=/bin/bash

⁃ event-handler に sh を登録⁃ 任意のコマンドを実行できる⁃ 全ホストで nginx reload とか、その他自由

⁃ ※ ただし、timeout したら諦める

$ serf query sh “service nginx reload”

Page 42: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

まとめ 

42

⁃ Serf の紹介をしました⁃ Immutable インフラには Agent 型があっている⁃ サーバ増やした(減らした) → 設定ファイル修正して git commit && push して deploy とかやってられない

⁃ Serf で中央集権型を Agent 型にしちゃうと捗る

Page 43: Serf という Orchestration ツール #immutableinfra

Copyright (C) 2014 DeNA Co.,Ltd. All Rights Reserved.

43

Thank you