節點啟動後自動連接其它配置節點

問題: 如何指定一個節點在啟動後自動連接到別的節點上?

這個我們要使用到 sys.config ,這是erlang的配置文檔,這個文檔一般都是$ROOT/releases/Vsn下

首先我們要先啟動一個master節點,Node.list可以看到當前節點並沒有連接到任何節點

iex --cookie secret --name master@127.0.0.1
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.2.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(master@127.0.0.1)1>Node.list
[]

我們再啟動一個slave節點,讓它啟動時直接連接到master上

新建sys.config

#sys.config
[{kernel,
 [
 {sync_nodes_optional, ['master@127.0.0.1']},
 {sync_nodes_timeout, 150000}
 ]}
].

這個配置可以表明,啟動後會主動連接到’master@127.0.0.1’ ,如果沒有連接成功會每150秒再重連。

iex --cookie secret --name slave@127.0.0.1 --erl "-config sys.config"
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.2.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(slave@127.0.0.1)1> Node.list
[:"master@127.0.0.1"]

這時在2個節點上用Node.list都可以看到對方啦。 注意: 一定要保持2個節點的cookie是一樣的

再驗證一下:

iex(slave@127.0.0.1)2>:rpc.call(:"master@127.0.0.1", :io, :format, [:user, "~ts pid: ~p~n", ["我是在master節點上運行的", self()]])
:ok
iex(slave@127.0.0.1)2>self
#PID<0.69.0>

這個format只是會在原運行節點上輸出,因為使用了:user, 所以我們在master上看到結果

iex(master@127.0.0.1)2> 我是在master節點上運行的 pid: <9547.69.0>

可以看到master上輸入的pid是slaver上的進程pid, 其中9547是標記它來自slaver@127.0.0.1節點, 即:<0.69.0> ==<9547.0.0>

sys.config實現了發佈新的release後會根據新的sys.config再加載配置

When traversing the contents of sys.config and a filename is encountered, its contents are read and merged with the result so far. When an application configuration tuple{Application, Env} is found, it is merged with the result so far. Merging means that new parameters are added and existing parameter values overwritten.

官方的例子給得太簡單啦,演示個完整的例子看看:)

假如我們想在上面的slaver節點上的kernel再加一個配置database的地址, 那麼我們新建一個region.config

#File: /etc/region.config
[{kernel, [
 {database_for_example_purposes, "db://prod-host-omg:8089"}
 ]}].

那麼我們要做的就是把region.config加到sys.config

#File: sys.config
[{kernel, [
 {sync_nodes_optional, ['master@127.0.0.1']},
 {sync_nodes_timeout, 150000}
 ]},
 "/etc/region.config"].

我們再驗證一下是否改變

iex --cookie secret --name slave@127.0.0.1 --erl "-config ./sys.config"
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.2.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(slave@127.0.0.1)1> Application.get_all_env(:kernel)
[database_for_example_purposes: 'db://prod-host-omg:8089',
 sync_nodes_timeout: 150000, included_applications: [],
 sync_nodes_optional: [:"master@127.0.0.1"], error_logger: :tty]

有興趣可以看看extrm release 如何生成sys.config的

參照資料