elixir初心者の初めての分散処理
1. 動作確認環境
- ubuntu18.04(僕はvagrant上のvmでやりました)
- Elixir 1.7.4 (Erlang/OTP 21)
- Google Computer Engin(ファイアウォール設定はデフォルトのままでつながります)
2. erlangvmのノード間通信の仕組み
Erlangvmはepmdというデーモンプロセスを4369番ポートでプロキシサーバとして使います。なので双方にelixirをインストールして、GCEとlocalhost上の4369番ポートを使えるようにしてください。
epmdはipアドレスでノードを探し、共通のcookieが設定されている場合双方のノードを接続します。
3. erlangvmのIPaddrとcookie
ipアドレスをノードに設定するには--nameオプションを使い node名@ IP の形でiexを起動します。また、cookieの指定は--cookieオプションで行います.
iex --name foo@IP --cookie test
GCEではcookieをこの形でiex起動時に設定してもインスタンスごとに異なるデフォルト?のクッキーに上書きされた状態でnodeが起動してしまいます
なので
iex --name bar@external_IP
で立ち上げた後に
iex> Node.set_cookie :"test"
を用いてGCE側のノードにlocalhostのノードと同じクッキーを設定します
ではlocalhostからGCEのノードに接続します。
iex> Node.connect :"bar@external_IP"
true
ノードリストの確認(どちらかのノードで以下のコマンドを使用します)
iex> Node.list
接続先ノード情報の出力があれば成功です。
4. 通信できないときのtips
cookieの確認
iex> Node.get_cookie
IPアドレスの確認
iex> :inet.getif
(ググれば一番上に出るけどドキュメントには載ってないerlangのモジュール関数)
IPの確認はpingとtcpdumpでもできます。
$ping external_IP
$sudo tcpdump
5. 最後に
今回はGCEインスタンスを用いたノード間通信を行いました。
因みにwifi接続の場合gce側から実機に接続を試みてもwifiがwebサーバーからの攻撃対策でping接続をブロックするので繋がりません。もちろん上記のように実機から接続すれば通信できます。