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
まとめ
まだまだ内部の仕組みや各プロトコルなど細かい部分が抑えられてないので、徐々に理解していきたいです。