elasticsearchのクラスタで利用するNICをインターフェース名で指定する方法
複数のインターフェースを搭載するマシンでelasticsearchをクラスタ稼働させると、1つ目のインターフェースのIPを対向クラスタへ返します。そのため、1つ目のインターフェースでクラスタ同士の疎通が出来ない構成で稼働させるには、network.publish_host
の調整が必要です。
もちろんサーバ毎の設定ファイルに個別にIPアドレスを書けば動きますが、そんな運用の手間となる設定は入れたくないですよね。
そういった時に便利に使える論理名(プレースホルダ)が用意されているので、それを使いましょう。
elasticsearchのネットワーク設定で使える論理名
これらの論理名はnetwork.bind_host
や network.publish_host
で利用できます。
CentOS環境ではYAMLファイル /etc/elasticsearch/elasticsearch.yml
にて設定します。
ホストの論理名 | 説明 |
---|---|
_local_ |
ローカルIPアドレス |
_non_loopback_ |
1つ目のループバックでないIPアドレス |
_non_loopback:ipv4_ |
1つ目のループバックでないIPv4アドレス |
_non_loopback:ipv6_ |
1つ目のループバックでないIPv6アドレス |
_[networkInterface]_ |
指定されたネットワークインターフェースのIPアドレス(例: _en0_ ) |
_[networkInterface]:ipv4_ |
指定されたネットワークインターフェースのIPv4アドレス(例: _en0:ipv4_ ) |
_[networkInterface]:ipv6_ |
指定されたネットワークインターフェースのIPv4アドレス(例: _en0:ipv6_ ) |
cloud-awsプラグインが入った環境では、次のネットワーク設定の論理名が利用できます。
EC2ホストの論理名 | 説明 |
---|---|
_ec2:privateIpv4_ |
プライベートIPv4アドレス |
_ec2:privateDns_ |
プライベートホスト名 |
_ec2:publicIpv4_ |
パブリックなIPv4アドレス |
_ec2:publicDns_ |
パブリックホスト名 |
_ec2_ |
短縮設定名のプライベートIPアドレス |
_ec2:privateIp_ |
短縮設定名のプライベートIPアドレス |
_ec2:publicIp_ |
短縮設定名のパブリックIPアドレス |
設定例
eth0ではなくeth1でクラスタリングしたいという例とともに、正しい設定と誤った設定を紹介します。
eth1のネットワーク設定
$ ifconfig eth1 eth1 Link encap:Ethernet HWaddr 52:54:13:00:36:08 inet addr:192.168.40.42 Bcast:192.168.40.255 Mask:255.255.255.0 inet6 addr: fe80::5054:13ff:fe00:3608/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5611 errors:0 dropped:0 overruns:0 frame:0 TX packets:2268 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:515759 (503.6 KiB) TX bytes:775476 (757.3 KiB)
設定例の紹介
デフォルトで利用されるeth0ではなくeth1を使う例を書く設定と共に紹介します。
なお、設定はYAMLなので、_eth1_
だけでなく'_eth1_'
としても同様に動きますので、好みに合わせて調整しましょう。
loopbackアドレスへの紐付け
network.publish_host: _local_
とすると次のように、localhost/127.0.0.1:9300
にてpublishされます。
最初のlocal ip addressのloopbackでないものが利用されると想定しましたが、そうではないようです。
[2014-10-31 16:21:11,044][INFO ][transport ] [labo-es01] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[localhost/127.0.0.1:9300]}
IPv4アドレスへの紐付け
network.publish_host
の値を _eth1:ipv4_
とすると次のように、eth1のIPv4アドレスを用いてpublishされます。
[2014-10-31 15:51:18,848][INFO ][transport ] [labo-es01] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.40.42:9300]}
IPv6アドレスへの紐付け
network.publish_host
の値を _eth1_
や _eth1:ipv6_
とすると次のように、eth1のIPv6アドレスを用いてpublishされます。
[2014-10-31 15:55:12,949][INFO ][transport ] [labo-es01] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/fe80:0:0:0:5054:13ff:fe00:3608%eth1:9300]}
その他の設定ミス例
インターフェース名の前後を_
を1つにするべきですが、__
という具合に2つにしてしまうと次のように動きません。
$ grep " Startup Failed" -A2 /var/log/elasticsearch/elasticsearch.log
[2014-10-31 15:45:59,609][ERROR][bootstrap ] [labo-es01] {1.3.4}: Startup Failed
...
- BindTransportException[Failed to resolve publish address]
IOException[Failed to find network interface for [__eth1__]]
--
[2014-10-31 15:48:13,317][ERROR][bootstrap ] [labo-es01] {1.3.4}: Startup Failed
...
- BindTransportException[Failed to resolve publish address]
IOException[Failed to find network interface for [__eth1:ipv4__]]
まとめ
_eth1:ipv4_
あたりを使っておくと設定ファイルの統一も図れて良さそうですね。