昨日の「Vagrant で複数台の Elasticsearch サーバを立ててみた」で、2台のサーバでそれぞれに Elasticsearch を立ち上げたのだけど、同一クラスタにならなかった件を調査してた。
当初、es1 の上で _cat/nodes
を叩いても、自サーバで動いている Y-wing しか見えなかった。
$ curl -XGET 'http://localhost:9200/_cat/nodes'
packer-debian-7 127.0.1.1 3 52 0.07 d * Y-wing
es1 から es2 への ping は通るし、Elasticsearch の API を叩いても反応するのでネットワーク的には問題無さそうだった。
es1 のネットワーク・インターフェイスを見ると、eth0 と eth1 があって、それぞれ 10.0.2.15 と 192.168.33.10 になっていた。
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:fd:fc:ab
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fefd:fcab/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6411 errors:0 dropped:0 overruns:0 frame:0
TX packets:2385 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5860601 (5.5 MiB) TX bytes:202732 (197.9 KiB)
eth1 Link encap:Ethernet HWaddr 08:00:27:c8:25:95
inet addr:192.168.33.10 Bcast:192.168.33.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:247 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:63026 (61.5 KiB) TX bytes:760 (760.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:67 errors:0 dropped:0 overruns:0 frame:0
TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6230 (6.0 KiB) TX bytes:6230 (6.0 KiB)
es2 の方をみると、こちらも eth0 と eth1 があって、それぞれ 10.0.2.15 と 192.168.33.11 が存在する。
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:fd:fc:ab
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fefd:fcab/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25585 errors:0 dropped:0 overruns:0 frame:0
TX packets:11349 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:32314409 (30.8 MiB) TX bytes:712003 (695.3 KiB)
eth1 Link encap:Ethernet HWaddr 08:00:27:52:98:aa
inet addr:192.168.33.11 Bcast:192.168.33.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:198 errors:0 dropped:0 overruns:0 frame:0
TX packets:76 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:48689 (47.5 KiB) TX bytes:6114 (5.9 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:171 errors:0 dropped:0 overruns:0 frame:0
TX packets:171 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:17184 (16.7 KiB) TX bytes:17184 (16.7 KiB)
ここで「あれちょっと待った、eth0 は es1 も es2 も 10.0.2.15 じゃないか」と気がついた。
Elasticsearch は「同一ネットワークに同一クラスタ名があったら、そのクラスタに参加する」という動きをするのだけど、もしかしてその「同一ネットワーク」の検出に 10.0.2.15 を使ってしまっているのではないか?という点に思い至った。
なんかそういう時のための設定ってあるんじゃないかなー?と /etc/elasticsearch/elasticsearch.yml を見てみたところ、network.publish_host
という設定項目を発見した。
この項目に es1 は 192.168.33.10、es2 は 192.168.33.11 という自分のサーバの IP アドレスをそれぞれ設定してやり、10.0.2.x のネットワークではなく 192.168.33.x のネットワークでクラスタを探すように指定した。
これで「同一ネットワーク上の同一クラスタ」を発見できるようになった。
$ curl -XGET 'http://localhost:9200/_cat/nodes'
packer-debian-7 127.0.1.1 3 52 0.04 d * Y-wing
packer-debian-7 127.0.1.1 3 52 0.00 d m A-wing
_cat/nodes
を実行してみると、Y-wing に A-wing が合流できたのが見えた。
あとはこいつを Chef 側に適用してやれば良さそうだ。