右往左往ブログ

日々よりみち

consulのdatacenter間接続

consulをいろいろと検証してみているので、分かったことをまとめます。
consulのversionは0.5.2です。

consulとは

consulとはservice検出、healthcheck機能やkey/value store機能を持ったクラスタリングソフトです。

https://www.consul.io/

公式によると以下。

  • サービス検出
  • ヘルスチェック
  • Key/Valueストア
  • マルチデータセンタ

consul接続イメージ

今回構築しているのは以下のようなイメージです。

  • dc1,dc2の2つのデータセンタがあり、それぞれにconsulサーバ1台、consulクライアント1台が属する
  • dc1とdc2間は接続されている

f:id:unchemist:20150620190747p:plain

このようなときに、どのような見え方になるのか?を確認してみます。

構築

dc1 server

consul agent -config-file=/etc/consul/conf.d/dc1_server.json

/etc/consul/conf.d/dc1_server.json

{
  "datacenter": "dc1",
  "data_dir": "/tmp/consul",
  "server": true,
  "bootstrap_expect": 1
}

dc1 client

consul agent -config-file=/etc/consul/conf.d/dc1_client.json -join=dc1server

/etc/consul/conf.d/dc1_client.json

{
  "datacenter": "dc1",
  "data_dir": "/tmp/consul",
  "server": false
}

dc2 server

consul agent -config-file=/etc/consul/conf.d/dc2_server.json -join-wan=dc1server

/etc/consul/conf.d/dc2_server.json

{
  "datacenter": "dc2",
  "data_dir": "/tmp/consul",
  "server": true,
  "bootstrap_expect": 1
}

dc2 client

consul agent -config-file=/etc/consul/conf.d/dc2_client.json -join=dc2server

/etc/consul/conf.d/dc2_client.json

{
  "datacenter": "dc2",
  "data_dir": "/tmp/consul",
  "server": false
}

consul membersでの見え方

dc1 serverから見た場合

[root@dc1server /]# consul members
Node       Address           Status  Type    Build  Protocol  DC
dc1client  172.17.0.58:8301  alive   client  0.5.2  2         dc1
dc1server  172.17.0.57:8301  alive   server  0.5.2  2         dc1
[root@dc1server /]# consul members -wan
Node           Address           Status  Type    Build  Protocol  DC
dc1server.dc1  172.17.0.57:8302  alive   server  0.5.2  2         dc1
dc2server.dc2  172.17.0.59:8302  alive   server  0.5.2  2         dc2

dc1 clientから見た場合

[root@dc1client /]# consul members
Node       Address           Status  Type    Build  Protocol  DC
dc1server  172.17.0.57:8301  alive   server  0.5.2  2         dc1
dc1client  172.17.0.58:8301  alive   client  0.5.2  2         dc1
[root@dc1client /]# consul members -wan

このことから、以下のことが分かります。

  • consul membersでは、自dc内のメンバを確認できる
  • -wanオプションを付与することで、dc同士のサーバ間接続については確認可能。clientからは確認不可。

consul execでの発行先

dc1 serverから実行した場合

[root@dc1server /]# consul exec hostname
    dc1server: dc1server
    dc1server:
==> dc1server: finished with exit code 0
    dc1client: dc1client
    dc1client:
==> dc1client: finished with exit code 0
2 / 2 node(s) completed / acknowledged
[root@dc1server /]# consul exec -datacenter="dc2" hostname
    dc2server: dc2server
    dc2server:
==> dc2server: finished with exit code 0
    dc2client: dc2client
    dc2client:
==> dc2client: finished with exit code 0
2 / 2 node(s) completed / acknowledged

dc1 clientから実行した場合

[root@dc1client /]# consul exec hostname
    dc1client: dc1client
    dc1client:
==> dc1client: finished with exit code 0
    dc1server: dc1server
    dc1server:
==> dc1server: finished with exit code 0
2 / 2 node(s) completed / acknowledged
[root@dc1client /]# consul exec -datacenter="dc2" hostname
    dc2server: dc2server
    dc2server:
==> dc2server: finished with exit code 0
    dc2client: dc2client
    dc2client:
==> dc2client: finished with exit code 0
2 / 2 node(s) completed / acknowledged

このことから、以下のことが分かります。

  • serverでもclientでもexecコマンドは実行可能。
  • clientから見てmembers -wanコマンドで他dcが見えなかったとしても、コマンド自体は発行できる。

f:id:unchemist:20150620190748p:plain