分布式的Erlang OTP介紹

2021-08-31 06:03:34 字數 3356 閱讀 4378

分布式的erlang/otp介紹

[email protected]

erlang僅僅能在具有相同的magic cookie系統之間的直接對話。如果想要在幾台機器之間執行相互通訊的erlang程式,最簡單的方法就是放置乙個名叫".erlang.cookie"的檔案在每個機器的$home目錄裡,並且把該檔案的許可權設定為400,該檔案的內容即cookie名字。400許可權意味著該檔案僅能被此檔案的owner訪問。

[quote]$ cd

$ cat .erlang.cookie

this is very secret

$ chmod 400 .erlang.cookie

[/quote]

[size=medium]erlang支援分布式通訊的兩大基石[/size]

1. 程序間通過拷貝通訊(process communication by copying)

2. 透明的位置資訊(location transparency)

erlang自己會保證程序識別符號在執行網路上的唯一,即便是跨機器(erlang guarantees that process identifiers are unique on the network, even across machines.)也一樣。

每乙個erlang vm都叫作乙個節點(node),當兩個或者多個node都知道了對方之後,這些節點就形成了集群(cluster)。erlang集群預設情況下是完全連線(fully connected)的,即erlang集群中的每乙個節點都知道每乙個其他的節點,並且相互之間能夠直接通訊。正因為如此,在實際中erlang通常只有幾十個節點,一般不會有幾百個或者更多的節點,因為在完全連線的網路中,節點越多,保持節點之間的通訊開銷越大。

但是可以通過某個特殊的節點,將多個cluster連線成乙個更大的cluster,這樣的cluster不是完全連線的,cluster直接是通過這個特殊的節點連線的。

在erlang集群中,節點不會主動去尋找其他節點,除非他尋找其他節點有事要做;在找到其他節點之後,他們會相互追蹤對方,並且交換彼此所知道的其他節點資訊,以便於形成乙個完全連線的網路。

每個節點都有自己的名字(name),其他節點就是通過這個名字來查詢到該節點,並且與之互動。通過內建函式node()可以取得當前節點的名字,節點的名字格式為: [b]nodename@hostname[/b]。如果乙個節點執行在非分布式模式下,則該節點的名字預設是[b]nonode@nohost[/b]。在單台機器上允許同時執行多個節點。

[size=medium]如何啟動乙個節點?[/size]

啟動乙個節點可以使用命令

[quote]erl -name my_node_name[/quote]

-name選項用在有dns正常工作的普通網路中,即可以正常使用完全限定名(fully qualified name)的網路環境中。

或者[quote]erl -sname my_node_name[/quote]

當完全限定名(fully qualified name)不起作用的時候,使用-sname選項。這種情況經常發生在區域網的生產環境中。比如在區域網中不能通過網域名稱訪問其他機器時,你只能使用短名稱(sname)訪問。

只要所有節點都在同乙個子網中,短名稱就起作用。

使用短名稱和長名稱的節點會使用不同的通訊模式工作。在同乙個erlang集群中,所有節點必須使用統一的通訊模式,或者使用長名稱,或者都是用短名稱,不可混用。

當erlang vm作為乙個節點執行時,他的節點名稱會顯示在命令列提示符中,比如我啟動了乙個名叫guibin的短名稱節點:

[quote]$ erl -sname guibin

erlang r14b01 (erts-5.8.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

eshell v5.8.2 (abort with ^g)

(guibin@localhost)1>

[/quote]

[size=medium]erlang nodes是如何找到對方並通訊?[/size]

[quote]$ ps ax | grep epmd

305 ?? s 0:00.02 /opt/local/lib/erlang/erts-5.8.2/bin/epmd -daemon

513 s003 u+ 0:00.00 grep epmd

[/quote]

當啟動乙個node時,node會檢查本機是否有epmd在執行,如果沒有則啟動epmd。epmd啟動之後會跟蹤記錄所有本機執行的node和這些node被分配的埠號。

當乙個在本機的node想和遠端的node通訊時,本地的epmd首先會和遠端的epmd通訊(預設在4369埠上使用tcp/ip),詢問是否有相應的node在那裡執行。如果有,則遠端的epmd會響應請求,並直接和本地的epmd通訊。

但是epmd不會自動去尋找其他的epmd,這些通訊和尋找過程必須被node的查詢操作觸發。

[b]注意:erlang預設的分布模型是基於所有集群中的機器都執行在乙個被信任和可靠的網路中。[/b]如果實際執行的網路環境並非如此信任和可靠,而是通過廣域網連線,則集群中的機器間通訊應該直接使用tcp(或者udp,或者sctp)。或者也可以基於ssl、ssh或者ipsec建立隧道通訊。

[size=medium]erlang基於cookie的安全系統[/size]

如果在一台機器上至少啟動過一次node之後,就會生成cookie檔案。初次啟動node,node會自動生成由隨機字串組成的cookie。預設情況下,乙個node認為其他的能和他通訊的node[b]都具有相同的cookie[/b]。

推薦只有owner才對cookie檔案具有讀的許可權,即400。

[size=medium]erlang分布式控制常用命令選項[/size]

命令[b]erl[/b]用來啟動erlang的執行時系統(erlang runtime system)。

[quote]-name nodename[/quote]

這個選項使得啟動的erlang的執行時系統處於分布式模式下,節點名稱為nodename@fullyqualifiedname。

[quote]-sname nodename[/quote]

這個選項使得啟動的erlang的執行時系統也處於分布式模式下,節點名稱為nodename@shortname。

[quote]-setcookie cookie[/quote]

該選項設定當前節點的magic cookie為cookie,而不使用預設的~/.erlang.cookie中的內容作為cookie。

[quote]-connect_all false[/quote]

這個選項設定該啟動節點和其他erlang節點的連線模式為非完全連線,即該節點僅僅儲存和他直接通訊的節點狀態,非直接連線的節點狀態不理會。

分布式事務介紹

1 什麼是分布式系統 部署在不同結點上的系統通過網路互動來完成協同工作的系統。比如 充值加積分的業務,使用者在充值系統向自己的賬戶充錢,在積分系統中自己積分相應的增加。充值系統和積 分系統是兩個不同的系統,一次充值加積分的業務就需要這兩個系統協同工作來完成。2 什麼是事務 事務是指由一組操作組成的乙...

分布式系統介紹

目錄標籤 空格分隔 讀書筆記 總結 1 增加網路開銷與延遲,不過基本上影響很小,可以不在考慮因素之內 2 負載均衡硬體 軟體出現問題,那麼整個網路都會受到影響,所以需要考慮 伺服器的雙機熱備問題。而且在切換過程中,未完成的請求還是會受到影響。總的來說,是一種非常方便及適用的保證高可用的一種方式。總結...

分布式服務介紹

隨著網際網路發展,的應用規模在不斷的擴大,普通的單體應用不能滿足需求,可能一處小小的修改就回導致乙個應用的重新部署,而且也不能對付大流量訪問。此時使用微服務架構來實現,功能模組化,比如可以拆分出user 使用者模組 order 訂單模組 當使用者模組訪問量很大時,可以把使用者模組獨立部署到1號機,2...