tjinjin's blog

インフラ要素多めの個人メモ

Consulについてまとめてみた(基本編)

About

最近Consulを使い始めたので、基本的な所をまとめてみます。

Consulとは

読み方は”コンスル”が正しいらしいです。でも”コンサル”って呼んでます←

公式HPを見ると、

Service discovery and configuration made easy. Distributed, highly available, and datacenter-aware.

トノコト

簡単に言うと、クラスタを組んでいろいろいい感じにできるツールという所でしょうか。

Consulでできること(一部)

  • クラスタを組んでいるサーバ内で同じ情報を参照することができる(内部DNSやKey/Valueストアとして)
  • ヘルスチェックに失敗したサーバを自動で切り離すことができる
  • DBで言うところのMasterが死んだ時のfailover機能が実装されていて、細かい設定が要らない
  • 各サーバ内でコマンド実行とかもできる
  • 特定のeventなどを監視して特定の処理を実行できる

Consulの仕組み(ざっくり)

  • Consul起動時のオプションによって大きくclient/serverモードに区別される
  • clientはデータの保持とかはせずに、各サーバと通信をする
  • serverは奇数台で構成させることが推奨されていて、serverの中にleaderと呼ばれる役割を担うものがraftというプロトコルで自動で選出される
  • leader/not leaderの関係はDBのMaster/Slaveに近い。KVなどのデータのマスターはLeaderが持っていて、各Serverでの問い合わせは基本的にLeaderにフォワードされる。not leaderもデータとしては保持していてレプリケーションしているので、leaderが死んだ時も情報を引き継げる
  • leaderが死んだ場合は自動でフェイルオーバーされる

Consulの基本的な使い方

インストール

consulはgo言語で実装されているので、バイナリをDLするだけです。DLして解凍したものを/usr/local/binあたりに入れておくとよいです

起動方法と起動オプション

$ consul agent -server -bootstrap-expect=1 -web-ui=dir \
    -data-dir=/tmp/consul -conf-dir=/etc/consul.d
  • -server : Consul起動モードの設定。何も付けないとclientモードでの起動になる
  • -data-dir : Consulが内部的に利用するディレクトリ。特に意識しなくていいと思ってます。
  • -ui-dir : web-uiが提供されているのでDLして展開したフォルダを指定すれば画面で見れる
  • -conf-dir : 設定をjsonで書けるので、あれば指定する。なくてもよい
  • -bootstrap-expect : これはConsulクラスタを形成した際にserverノードが指定した数に達したタイミングでリーダの選出を行うための設定。数に達しないと、一向にリーダが決まらない状態になる

agentのコマンドについて

ConsulにはいろいろなCLIが用意されている。よく使うコマンドを紹介 * consul join : クラスタを組む際に利用。consul join <ipaddress>というように使うことで指定したipのクラスタに自分を所属させることができる * consul members : クラスタを形成しているmemberの情報が見れる

$ consul members
Node               Address          Status  Type    Build  Protocol  DC
api    10.0.0.2:8301   alive   server  0.6.0  2         dc1
batch  10.0.2.2:8301  alive   server  0.6.0  2         dc1
build  10.0.1.2:8301  alive   server  0.6.0  2         dc1
  • consul exec : 特定のコマンドをクラスタで実行できる
$ consul exec hostname
    api: api
    api:
==> api: finished with exit code 0
    build: build
    build:
==> build: finished with exit code 0
    batch: batch
    batch:
==> batch: finished with exit code 0
3 / 3 node(s) completed / acknowledged

APIについて

ConsulにはAPIも用意されており、情報の参照だったり、任意の情報をKVに貯めることができる。

$ curl http://localhost:8500/v1/status/leader # リーダの参照
$ curl http://localhost:8500/v1/status/peers  # 実際に通信しているサーバ一覧
$ curl http://localhost:8500/v1/kv/<key>      # keyに登録されているデータの参照
$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1 # KVにデータを登録
$ curl http://localhost:8500/v1/kv/web/key1 | jq .0          # KVの参照 
[
  {
    "LockIndex": 0,
    "Key": "web/key1",
    "Flags": 0,
    "Value": "dGVzdA==",
    "CreateIndex": 4261,
    "ModifyIndex": 4261
  }
]
$ curl -X DELETE http://localhost:8500/v1/kv/web/key1        # KVの削除
$ curl http://localhost:8500/v1/kv/web/key1

試すには?

VMクラスタを組むのは苦しいのでdockerを利用されている方がいるので、そちらを使って試すとよさそうです。

GitHub - Lorentzca/c3d: Create Consul Cluster on Docker

まとめ

まだまだ内部の仕組みや各プロトコルなど細かい部分が抑えられてないので、徐々に理解していきたいです。

参考