副標題:《Programming Erlang》第十章 分布式編程 讀書筆記
題外話:很久沒更新blog了,前陣子又是工作忙,又是要考試,實在沒精力寫blog。倒是攢了不少材料,以後慢慢添吧。
這章最重要的內容就是erlang中兩個節點之間的串連規則。
同一台機器上的兩個節點之間的串連很簡單,直接照著書上做就行了,比較麻煩的是不同機器之間節點的串連。
書中的部分代碼我測試的結果是錯的,猜測可能和erlang的版本有關,也有可能和環境有配置關。
首先,需要解釋一下long name和short name之間的區別。
舉例來說,
erl
-name li@Server1.com
erl -name li@10.68.8.50
這是long name,用'-name'標識。
erl -sname li@Server1
erl -sname li
這是short name,用'-sname'標識。
從格式上來說,short name後面跟的網域名稱不能是IP,也不能夠帶有‘.’,比如不能是'Server1.com'而只能是'Server1'。
從用法上來說,
如果兩個節點運行在一個機器上,就用 sname,
比如'erl -sname li','erl -sname liu'
如果兩個節點運行在不同的機器上,且兩個機器運行在不同的網段,那麼必須用long name,
比如'erl -name li@Server1.com',erlang會通過DNS解析出名字中的網域名稱,找到對應的機器
如果兩個節點運行在不同的機器上,但兩個機器在同一個子網中,那麼可以和上面一樣用long name方式,
比如 'erl -name li@Server1.com','erl -name li@10.68.8.50'
也可以用sname,但是必須保證sname的名字在/etc/hosts中能找到對應的IP,
比如 'erl -name li@Server1',這時候/etc/hosts中需要添加 'Server1 10.68.8.51'
總而言之,如果需要用到DNS,那麼必須使用long name,如果不需要用到DNS,可以使用sname,但需要設定/etc/hosts。
瞭解了long name和short name的區別,下面的部分就容易了。
以書中的代碼為例,假設現在有兩台機器A和B,靜態IP分別為10.68.8.50和10.68.8.51,機器名分別為Server1.aaa.com和Server2.aaa.com,且在同一個子網中,那麼可以實驗如下操作:
方案1:
A,B: erl -sname gandalf@10.68.8.50/51
結果:錯誤,如果網域名稱是IP,必須是-name
方案2:
A: 設定/etc/hosts,添加 'Server2 10.68.8.51'
erl -sname gandalf@Server1 -setcookie abc
......
kvs:start().
B: 設定/etc/hosts,添加 'Server1 10.68.8.50'
erl -sname bilbo@Server2 -setcookie abc
> rpc:call(gandalf@Server1, kvs, store, [weather, fine]).
結果: 正確輸出。
方案3:
A: erl -name gandalf@10.68.8.50 -setcookie abc
......
kvs:start().
B: erl -name bilbo@10.68.8.51 -setcookie abc
> rpc:call(’gandalf@10.68.8.50‘, kvs, store, [weather, fine]).
結果: 正確輸出。
注意:在rpc:call中,gandalf@10.68.8.50必須加上單引號,否則識別不了正確的IP
方案4:
A: erl -name gandalf@Server1.aaa.com -setcookie abc
......
kvs:start().
B: erl -name bilbo@Server2.aaa.com -setcookie abc
> rpc:call(gandalf@Server1.aaa.com, kvs, store, [weather, fine]).
結果: 如果DNS能夠解析Server1.aaa.com,那麼結果正確。否則找不到對應的節點。