Elixir Advent Calendar 2014 8日目。
今年はElixirがついにv1.0になったというのもビッグニュースでしたが、
CentOSがバージョン7になり、あれこれ大きく変わったというのも大きな話題を呼びました。
CentOS 7は、これまでのCentOS同様、長い期間に渡って使われることになるはずなので、
今のうちにそのお作法と絡めて、ノウハウを蓄積していきたいところです。
今回は、前回ご紹介したMessage Passingのやり方の応用として、
ネットワーク越しでのプロセス間通信をElixirで行う方法をご紹介します。
構成
今回、2台のIntel NUCを使います。
Firewallを開ける
CentOS 6ではiptablesでしたが、CentOS 7ではfirewalldが動作していて、外部との通信を遮断しています。
ElixirはProduction Ready。
firewalldを止めるよりは、セキュリティのために、必要なポートを開放するようにしましょう。
TCP 4369は、Erlang/OTPでおなじみです。
これとは別に、プロセス間通信を行うためのポートも開放する必要があり、
今回は例として、TCP 26000 から TCP 26099 の100ポートを開放します。
# firewall-cmd --zone=public --add-port=4369/tcp --permanent
# firewall-cmd --zone=public --add-port=26000-26099/tcp --permanent
# firewall-cmd --reload
名前解決
ノード同士を接続する際に、FQDNで名前解決できるようにする必要があります。
DNSサーバを持ち出すのは今回はオーバースペックなので、 /etc/hosts にIPアドレスとFQDNを書いておきます。
10.1.0.1 eins.elixiradventcalendar2014.net
10.1.0.7 sieben.elixiradventcalendar2014.net
iexの起動
おなじみの方法でiexをオプション付きで起動します。
まず、--snameは使いません。--nameを使います。
また、erlコマンドにはあるがiexコマンドには無いオプションを使います。
具体的には以下の通りに指定します。
% iex --name node1@eins.elixiradventcalendar2014.net --cookie elixir-example --erl "-kernel inet_dist_listen_min 26000 inet_dist_listen_max 26099"
% iex --name node1@sieben.elixiradventcalendar2014.net --cookie elixir-example --erl "-kernel inet_dist_listen_min 26000 inet_dist_listen_max 26099"
両方とも起動できました。早速、ノード同士を接続してみましょう。
iex(node1@sieben.elixiradventcalendar2014.net)1> Node.connect :"node1@eins.elixiradventcalendar2014.net"
true
成功です。
ノードのリストを表示してみましょう。
iex(node1@sieben.elixiradventcalendar2014.net)2> Node.list
[:"node1@eins.elixiradventcalendar2014.net"]
対抗側からも確認します。
iex(node1@eins.elixiradventcalendar2014.net)1> Node.list
[:"node1@sieben.elixiradventcalendar2014.net"]
接続できています。
ここから先は、ローカルホストに閉じた場合と同様です。
まとめ
CentOS 7でElixirを使ったプロセス間通信をローカルネットワーク越しに行う方法をご紹介しました。
明日は @tbpgr さんです。