LoginSignup
4
0

More than 1 year has passed since last update.

ElixirとErlangVMでGoogle Comupte Engine内のインスタンスとノード間通信

Last updated at Posted at 2020-05-21

elixir初心者の初めての分散処理

  1. 動作確認環境
  2. erlangvmのノード間通信の仕組み
  3. erlangvmのIPとcookie
  4. 通信できないときのtips
  5. 最後に

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オプションで行います.

localhost.erlangvm
iex --name foo@IP --cookie test

GCEではcookieをこの形でiex起動時に設定してもインスタンスごとに異なるデフォルト?のクッキーに上書きされた状態でnodeが起動してしまいます

なので

gce_instance.erlangvm
iex --name bar@external_IP 

で立ち上げた後に

gce_instance.erlangvm
iex> Node.set_cookie :"test"

を用いてGCE側のノードにlocalhostのノードと同じクッキーを設定します

ではlocalhostからGCEのノードに接続します。

localhost.erlangvm
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でもできます。

localhost.shell
$ping external_IP
gce_instance.shell
$sudo tcpdump

5. 最後に

今回はGCEインスタンスを用いたノード間通信を行いました。
因みにwifi接続の場合gce側から実機に接続を試みてもwifiがwebサーバーからの攻撃対策でping接続をブロックするので繋がりません。もちろん上記のように実機から接続すれば通信できます。

またrubyプログラムでErlangVMプロトコルを実装してノード接続しちゃう本格的な人もいます

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0