Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

elasticsearchのクラスタで利用するNICをインターフェース名で指定する方法

複数のインターフェースを搭載するマシンでelasticsearchをクラスタ稼働させると、1つ目のインターフェースのIPを対向クラスタへ返します。そのため、1つ目のインターフェースでクラスタ同士の疎通が出来ない構成で稼働させるには、network.publish_hostの調整が必要です。

もちろんサーバ毎の設定ファイルに個別にIPアドレスを書けば動きますが、そんな運用の手間となる設定は入れたくないですよね。
そういった時に便利に使える論理名(プレースホルダ)が用意されているので、それを使いましょう。

elasticsearchのネットワーク設定で使える論理名

これらの論理名はnetwork.bind_hostnetwork.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_あたりを使っておくと設定ファイルの統一も図れて良さそうですね。