「プログラミング Erlang 10.1 名前サーバ」のステージ3

ステージ1,2はうまくいったという状況から。まずサーバー側で `$erl -name gandalf -setcookie abc` を実行しようとすると以下のようなエラーが出た。

$ erl -name gandalf -setcookie abc
2020-05-31 04:11:14.711061
   args: []
   format: "Can't set long node name!\nPlease check your configuration\n"
   label: ...(略)

これは、サーバーの名前がドメインを含むものでなかったのでエラーが出ている。今回はサーバーの名前を `localserver.com` と付けることにする。hogehoge.fuga の形になっていればなんでも良い。もし自分で別な名前にする場合はこれ以降に出てくる`localserver.com`は全て置きかえる必要がある。
 まずはサーバー側で`sudo hostname localserver.com`というコマンドを実行する。

$ sudo hostname localserver.com

その後、そのサーバーのローカルIPを調べて、今度はクライアント側の/etc/hostsに`#{調べたIP} localserver.com`という行を追加しておく。具体例として、サーバーのローカルIPが192.168.0.4の場合、クライアント側の/etc/hostsに追加する行は `192.168.0.4 localserver.com`となる。

❯ cat /etc/hosts
127.0.0.1       localhost
192.168.11.8 localserver.com # 追加
... # 省略


 上記の設定をした状態でサーバー側で`erl -name gandalf -setcookie abc`を実行すると、erlプロンプトの表示は`(gandalf@localserver.dom)1>`となっている。その状態で`kvs:start().`でサーバー側の準備は完了。

$ erl -name gandalf -setcookie abc
Erlang/OTP 23 [erts-11.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]

Eshell V11.0.2  (abort with ^G)
(gandalf@localserver.com)1> kvs:start().
true

次に、クライアント側で`erl -name bilbo -setcookie abc`でErlangノードを立ち上げると、以下のように実行できるはず。

(bilbo@MBP.local)2> rpc:call('gandalf@localserver.com', kvs, store, [weather, cold]).
true
(bilbo@MBP.local)3> rpc:call('gandalf@localserver.com', kvs, lookup, [weather]).
{ok,cold}


この時の注意点として、'gandalf@loclalserver.com' というようにサーバーの名前を「''」で囲む必要がある。本のサンプルではなぜか実行できているが、「''」が無いと`* 1: syntax error before: '.'`という構文エラーが出る。


もしこれでうまく行かなかった場合は、サーバーとクライアント側のバージョンが合っていない可能性がある。自分の場合も、クライアント側が v11.0 だったのに対して Ubuntuサーバーで適当にaptを使って入れたErlangのバージョンがv9.2と古かった。以下を参考に最新のものをインストールしたところv11.0.2になった。この状態で上のkvsのサンプルは問題無く動作したので、マイナーバージョンの違い(0.0.2の違い)はErlang間の通信では問題にはならなかった。


この記事が気に入ったらサポートをしてみませんか?