天天看點

RabbitMQ叢集Erlang知識擴充

Erlang是 一種通用的面向并發的程式設計語言

Erlang的推出則是為了打造一款高并發高擴充性的實時系統。例如應用于電信,銀行,商業,即時通訊等場合。Erlang的運作時系統内置了對并發,分布式,容錯等的處理。

Erlang的容錯能力是它與生俱來的的能力,因為這是電信領域的重要需求。但是這并不代表Erlang是複雜的、不具表達力的。

OTP包含了一組庫和實作方式,可以建構大規模、容錯和分布式的應用程式,包含了許多強大的工具,能夠實作H248,SNMP等多種協定,核心概念是OTP行為,可以看作一個用回調函數作為參數的應用程式架構,類似一個J2EE容器。行為負責解決問題的非函數部分,回調函數負責解決函數部分。

Erlang僅僅能在具有相同的magic cookie系統之間的直接對話。如果想要在幾台機器之間運作互相通信的Erlang程式,最簡單的方法就是放置一個名叫".erlang.cookie"的檔案在每個機器的$HOME目錄裡,并且把該檔案的權限設定為400,該檔案的内容即cookie名字。400權限意味着該檔案僅能被此檔案的owner通路。 

引用

$ cd 

$ cat  .erlang.cookie 

this is very secret 

$ chmod 400 .erlang.cookie 

Erlang支援分布式通信的兩大基石 

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()可以取得目前節點的名字,節點的名字格式為: nodename@hostname。如果一個節點運作在非分布式模式下,則該節點的名字預設是nonode@nohost。在單台機器上允許同時運作多個節點。 

如何啟動一個節點? 

啟動一個節點可以使用指令 

erl -name my_node_name

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

或者 

erl -sname my_node_name

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

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

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

當Erlang VM作為一個節點運作時,他的節點名稱會顯示在指令行提示符中,比如我啟動了一個名叫guibin的短名稱節點: 

$ 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> 

Erlang nodes是如何找到對方并通信? 

負責Erlang節點間通信的是一個叫作epmd(Erlang Port Mapper Daemon)的背景線程。如下: 

$ 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 

當啟動一個node時,node會檢查本機是否有epmd在運作,如果沒有則啟動epmd。epmd啟動之後會跟蹤記錄所有本機運作的node和這些node被配置設定的端口号。 

當一個在本機的node想和遠端的node通信時,本地的epmd首先會和遠端的epmd通信(預設在4369端口上使用TCP/IP),詢問是否有相應的node在那裡運作。如果有,則遠端的epmd會響應請求,并直接和本地的epmd通信。 

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

注意:Erlang預設的分布模型是基于所有叢集中的機器都運作在一個被信任和可靠的網絡中。如果實際運作的網絡環境并非如此信任和可靠,而是通過廣域網連接配接,則叢集中的機器間通信應該直接使用TCP(或者UDP,或者SCTP)。或者也可以基于SSL、SSH或者IPsec建立隧道通信。 

Erlang基于cookie的安全系統 

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

推薦隻有owner才對cookie檔案具有讀的權限,即400。 

Erlang分布式控制常用指令選項 

指令erl用來啟動Erlang的運作時系統(Erlang runtime system)。 

-name NodeName

這個選項使得啟動的Erlang的運作時系統處于分布式模式下,節點名稱為NodeName@FullyQualifiedName。 

-sname NodeName

這個選項使得啟動的Erlang的運作時系統也處于分布式模式下,節點名稱為NodeName@ShortName。 

-setcookie Cookie

該選項設定目前節點的Magic Cookie為Cookie,而不使用預設的~/.erlang.cookie中的内容作為Cookie。 

-connect_all false

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

本文轉自    OpenStack2015 部落格,原文連結:   http://blog.51cto.com/andyliu/1902266     如需轉載請自行聯系原作者

<a href="http://blog.51cto.com/search/result?q=linux+openstack+dock" target="_blank">linux openstack dock</a>

繼續閱讀