雑文発散

«前の日記(2014-11-20) 最新 次の日記(2014-11-22)» 編集
過去の日記

2014-11-21 [長年日記]

[Vagrant][Chef] Elasticsearch がクラスタ化されない原因が分かった

昨日の「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 側に適用してやれば良さそうだ。