Developers Summit 2016に参加した – そのに –

インフラ最新事情 – OSSをフル活用したインフラ構築術 – (仮) by長谷川祐介(grasys, Inc.)

・grasys インフラ屋
・2015年1月にGoogle for Work Partner に
・主戦場はモバイル・スマートフォン
 →山手線回ると基地局が変わるため通信が何回か切れる→そのことも考慮してゲームは作るべき
・ライブラリをいじるのであればCentOSを辞めてDebian/Ubuntuにしよう

grasysにて利用しているOSS

・PerconaXtraDB
 InnoDBストレージをベースにマルチコア環境でより高速に動作するようにした
・MaxScale
 データベース向けのプロキシソフトウェア
・tmux
 端末多重化ソフトウェア
・HAProxy
 多機能なプロキシサーバ(ロードバランスも可能)
・GunicornDjango
 Gunicorn (Green Unicorn)
 Django:Pythonで実装されたWebアプリケーションフレームワーク
・clutils
 consul/serfの自動設定に利用
・clctl
 オーケストレーションツール
・terraform
 コードでインフラを管理するためのツール
 これがないと仕事したくないくらいすごいらしい
・Serf
 サービス検出(ノード単位)とオーケストレーションツール
 grasysでは廃止予定
・Consul
 Serfにサービス検出(DBやWEBソフトなどより具体的にできる?)を追加したようなもの
 またサーバをタグ付けして、そのタグを基にデータを取得できたりする
・SerfとConsulの範囲
2016-03-13_193359

興味があったものをざっくり調べたり、使ってみた

Terraform

・Hashicorp社(Vagrant・Packer・Serf・Consulを作っている会社)製
・2014年7月より。開発スピードが早く、まだ枯れてはいない
・サーバ構成のバージョン管理、コード管理が可能

Serf

クラスタを作成して、クラスタのメンバ内で監視し、状況に応じてコマンド実行などが可能

利用シーン
2016-03-13_130901

Consul

障害検知は監視サーバ主体であったため
異常検知までにタイムラグがあった
ノード主体で検知するためより迅速に検知し、復旧のためのアクションも可能
(アクション不要であればエージェントレスの対応も可能)

ConsulのデータはConsulサーバによってKVSに保存され
それはWebUIやenvconsulやWebAPIを利用して閲覧可能

root@hostname:/usr/local/src# wget -d https://releases.hashicorp.com/consul/0.6.3/consul_0.6.3_linux_amd64.zip
...
root@hostname:/usr/local/src# unzip consul_0.6.3_linux_amd64.zip
Archive:  consul_0.6.3_linux_amd64.zip
  inflating: consul
root@hostname:/usr/local/src# mv consul /usr/bin/

root@hostname:/home/shimizu# consul agent -data-dir /tmp -server -bootstrap-expect 3
==> WARNING: Expect Mode enabled, expecting 3 servers
==> Starting Consul agent...
==> Error starting agent: Failed to get advertise address: No private IP address found

root@hostname:/home/shimizu# consul agent -data-dir /tmp -bind x.x.x.x -server -bootstrap-expect 3
==> WARNING: Expect Mode enabled, expecting 3 servers
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'hostname'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: x.x.x.x (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2016/03/16 00:16:55 [WARN] memberlist: Binding to public address without encryption!
    2016/03/16 00:16:55 [INFO] serf: EventMemberJoin: hostname x.x.x.x
    2016/03/16 00:16:55 [WARN] memberlist: Binding to public address without encryption!
    2016/03/16 00:16:55 [INFO] serf: EventMemberJoin: hostname.dc1 x.x.x.x
    2016/03/16 00:16:55 [INFO] raft: Node at x.x.x.x:8300 [Follower] entering Follower state
    2016/03/16 00:16:55 [INFO] consul: adding LAN server hostname (Addr: x.x.x.x:8300) (DC: dc1)
    2016/03/16 00:16:55 [INFO] consul: adding WAN server hostname.dc1 (Addr: x.x.x.x:8300) (DC: dc1)
    2016/03/16 00:16:55 [ERR] agent: failed to sync remote state: No cluster leader
    2016/03/16 00:16:56 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
    2016/03/16 00:17:12 [ERR] agent: coordinate update error: No cluster leader
...

### 別コンソールで ###
root@hostname:/home/shimizu# consul members
Node      Address             Status  Type    Build  Protocol  DC
hostname  x.x.x.x:8301  alive   server  0.6.3  2         dc1

ここから consol agent -join オプションを利用してクラスタを作成していく
サービスのヘルスチェックなどは /etc/consul.d/ にファイルをおき、起動オプションに -config-dir=/etc/consul.d を加える

参考

オーケストレーション入門 – 多種多様化するサービスをConsulで連携させる
Consul 使ってみる
CONSUL-CONFIGURATION