Hazelcst組網
Hazelcast自稱"分布式數據網格”,那他最基本、最重要的功能就是時時刻刻都在多台服務器之間工作,這樣必須有網絡環境對其分布式功能提供支持。Hazelcast在網絡環境中工作分為2個階段:首先是組網階段,隨后是數據傳輸階段。
組網是指每個Hazelcast節點啟動時,都會搜尋是否有Hazelcast節點可以連接,組網過程支持多種協議。完成組網后,節點會和其他組建成集群的節點進行通信,這個階段就是數據傳輸階段,此時只支持使用TCP/IP協議來傳遞數據。Hazelcast的所有網絡行為,都是通過<networt></network>元素配置決定的。<join>元素用來配置組建集群的相關的參數。
組播協議(Multicast)組建集群
在使用組播協議(Multicast)作為自動組建集群機制時,集群中的成員不需要知道其他成員的詳細地址(IP),他們僅僅是通過組播將信號廣播到其他成員的監聽端口中。使用之前確保網絡環境支持 Multicast。
下面是一個通過組播協議(Multicast)組網的例子:
<hazelcast> <network> <join> <multicast enabled="true"> <multicast-group>224.2.2.3</multicast-group> <multicast-port>54327</multicast-port> <multicast-time-to-live>32</multicast-time-to-live> <multicast-timeout-seconds>2</multicast-timeout-seconds> <trusted-interfaces> <interface>192.168.1.102</interface> </trusted-interfaces> </multicast> <tcp-ip enabled="false"> </tcp-ip> <aws enabled="false"> </aws> </join> <network>
</hazelcast>
組網功能的配置由 <join> 及其子元素來確定。其中 <multicast> 元素用來配置 組播協議 組網的相關參數。當設置 <multicast> 元素中 enabled 屬性為 true 時,表示啟用 組播協議 組網。下面將詳細說明每一個參數:
enabled:[true|false],指定是否使用組播協議來組建集群。
multicast-group:組播分組的IP地址。當要創建同一個網段的集群時,需要配置這個參數。取值范圍從224.0.0.0到239.255.255.255,默認224.2.2.3。
multicast-port:組播協議啟用套接字的端口(socket port),這個端口用於Hazelcast監聽外部發送來的組網請求。默認54327。
multicast-time-to-live:組播協議發送包的生存時間周期(TTL)。可以從 協議官方文檔 詳細了解 組播協議的TTL。
multicast-timeout-seconds:當節點啟動后,這個參數(單位:秒)指定了當前節點等待其他節點響應的時間周期。例如,設置為60秒時,每一個節點啟動后通過組播協議廣播消息,如果主節點在60秒內返回響應消息,則新啟動的節點加入這個主節點所在的集群,如果設定時間內沒有返回消息,那么節點會把自己設置為一個主節點,並創建新的集群(主節點可以理解為集群的第一個節點)。默認值為2秒。
trusted-interfaces:可信任成員的IP地址。當一個節點試圖加入集群,如果其不是一個可信任節點,他的加入請求將被拒絕。可以在IP的最后一個數字上使用通配符(*)來設置一個IP范圍(例如:192.168.1.* 或192.168.1.100-110)。
TCP協議組建集群
除了使用 組播協議,還可以使用TCP/IP協議來組建集群。當使用TCP/IP來組建新集群時,第一個節點必須將所有要加入集群的節點IP地址添加到對應列表中。在集群已經運行之后,新加入的節點不必知道所有的集群節點,但是至少要知道並連接到一個已經啟動的集群節點。
下面是一個使用TCP/IP協議來組建集群的例子:
<hazelcast> <network> <join> <multicast enabled="false"> </multicast> <tcp-ip enabled="true"> <required-member>192.168.1.104</required-member> <member>192.168.1.104</member> <members>192.168.1.105,192.168.1.106</members> <connection-timeout-seconds>60</connection-timeout-seconds> </tcp-ip> </join> </network> </hazelcast>
從上面的例子可以看出使用TCP/IP組建網絡涉及的配置參數並不多。首先需要將<tcp-ip>元素中的enabled屬性設置為true表示啟用TCP/IP協議來組網。然后每個元素對應的含義如下
required-member:加入集群的成員IP地址,只有這些IP地址的成員存在時集群才會組建。也就是說如果要當前節點加入集群,必須<required-member>元素中的指定的IP地址已經有集群節點先啟動了,該節點才能啟動,可以用於限制節點的啟動順序。
member:成員的IP地址。指定要加入集群的成員IP地址,這些IP地址中的成員會相互發現對方。
members:member的復數形態。在元素中可以使用逗號(“,”)分割多個IP地址。還可以使用-或*等符號來表達多個IP地址。
connection-timeout-seconds:定義連接超時時間。Hazelcast嘗試連接到一個已知的節點(member元素指定)的最大超時時間,如果在指定時間內連接失敗,將會放棄連接。當參數設置太小時,可能會導致一個成員可能無法連接到集群。設置太高時,成員啟動的等待時間會比較久,因為當某些<member>元素標記的節點未啟動時,需要花費較多時間等待。如果有較多的不同IP地址的成員需要加入集群,可以適當增加這個值,以保證所有的成員可以正確加入集群。默認值為5。
其他組網方式
除了上面說的 組播協議 和 TCP/IP協議 組建集群的方式,Hazelcast還為某些特定的使用場景提供了組建集群的方法。目前提供了基於亞馬遜的EC2環境和jclouds組建集群,目前還沒有亞馬遜的雲服務的使用經驗,相關配置就不詳細說明了,如果需要在亞馬遜雲部署集群可以留言一起聊聊,我會盡量把知道的分享給有需要的朋友。
Hazelcast網絡運行
在完成集群組網以后Hazelcast的節點之間就會開始數據通信,因此Hazelcast還提供了大量的元素來對數據通信進行配置,看下面這個例子:
<network> <public-address>11.22.33.44:5555</public-address> <port auto-increment="true" port-count="100">5701</port> <outbound-ports> <ports>0</ports> </outbound-ports> <reuse-address>false</reuse-address> <interfaces enabled="false"> <interface>10.10.1.*</interface> </interfaces> <ssl enabled="false" /> <socket-interceptor enabled="false" /> <symmetric-encryption enabled="false"> <algorithm>PBEWithMD5AndDES</algorithm> <salt>thesalt</salt> <password>thepass</password> <iteration-count>19</iteration-count> </symmetric-encryption> </network>
除了<join>元素,Hazelcast還提供了上面XML中的元素來配置網絡數據通信,下面我們一一介紹他的作用。
public-address
配置當前節點的對外公開地址。什么叫對外公開地址呢?默認情況下,一個節點會使用它的套接字(sockets)地址作為公開地址。但是經過網絡地址轉換(NAT),2個節點可能無法彼此訪問。此時只有將2個節點的公開地址設置為在NAT上定義的地址才能完成連接。這種情況下,公開地址並不是本地的地址,而是一個由NAT定義的虛擬地址。這個設置對於在私有雲的環境中使用Hazelcasst會非常有用。需要注意的是,這個元素的配置需要制定端口,即 [domain|ip]:port 的格式。
port
指定Hazelcast用於集群成員之間數據通信的端口。Hazelcast會根據端口的使用情況自動檢查可以使用的端口。檢查方式主要通過<port>元素中的port-count和auto-increment來決定。下面是關於他們的說明:
- port-count:默認時,Hazelcast將嘗試綁定100個端口。意思是,如果將端口設置為5701,當有一個成員加入到集群,Hazelcast將嘗試在5701到5801之間尋找一個端口。當有大量的實例運行在同一個機器,而端口較為緊缺時,可以適當的加大這個數字。這個參數就是用於此目的,默認是100。
- auto-increment:Hazelcast將會嘗試在5701到5801之間尋找未被使的端口。通常情況下,不需要去修改這個值,這個配置已經非常方便使用。但是在某些時候,系統希望使用指定的端口,此時可以通過關閉自動增長功能來實現——將auto-increment屬性設置設為false。
outbound-ports
默認情況下,在打開一個套接字(socket)用於傳輸數據時系統會選擇一個臨時端口。但是如果啟用某些安全策略或防火牆可能會限制某些臨時端口的使用。為了解決這個問題,Hazelcast提供<outbound-ports>元素來指定套接字的臨時對外傳輸端口。可以像下面這樣配置多個套接字端口:
<network> <outbound-ports> <ports>33000-35000</ports> <ports>37000,37001,37002,37003</ports> <ports>38000,38500-38600</ports> </outbound-ports> </network>
默認為<ports>0</ports>,表示由Hazelcast自己選擇可用端口。
Reuse Address
配置地址是否可以重用。當關閉一個集群節點時,服務器的套接字(socket)端口會處於 TIME_WAIT 狀態。如果將<reuse-address>元素設置為true,那么TIME_WAIT狀態將被忽略,新加入的節點可以重復使用已經釋放的端口。
Interfaces
指定Hazelcast使用的網絡接口地址。一些服務器可能有多個網絡接口(多個網卡),因此可能需要限定可用的IP地址。范圍字符('*' and '-')可以用於多個地址,例如 10.3.10.*是指從10.3.10.0到10.3.10.255的端口均可使用,又例如:10.3.10.4-18是指從10.3.10.4到10.3.10.18的IP地址(包含4和18)。將<interfaces>的enabled設置為true,則會啟用網絡接口配置(默認是禁用的),在啟用網絡接口配置后如果Hazelcast找不到配置的IP地址,將會輸出一個異常信息,並停止啟動節點。
其他商用授權配置
除了前面提到的幾個配置,Hazelcast還額外提供了<ssl>、<socket-interceptor>、<symmetric-encryption>三個安全相關的配置,但是需要獲取Hazlecast的商用授權下載商用版本這些配置才能生效。ssl表示啟用ssl傳輸、interceptor用於傳輸攔截器、symmetric-encryption用於傳輸數據加密。
IPV6支持
Hazelcast的所有網絡IP配置都支持IPV6。例如可以使用下面的方式來配置IP地址:
<hazelcast> <network> <port auto-increment="true">5701</port> <join> <multicast enabled="false"> <multicast-group>FF02:0:0:0:0:0:0:1</multicast-group> <multicast-port>54327</multicast-port> </multicast> <tcp-ip enabled="true"> <member>fe80::223:6cff:fe93:7c7e:5701</member> <interface>fe80:0:0:0:45c5:47ee:fe15:493a</interface> </tcp-ip> </join> <interfaces enabled="true"> <interface>fe80:0:0:0:45c5:47ee:fe15:*</interface> <interface>fe80::223:6cff:fe93:0-5555</interface> </interfaces> </network> </hazelcast>
需要強調的是,並不是所有的環境都能有效的支持IPV6。而Hazelcast有個坑時在同時支持IPV6和IPV4的環境會優先使用IPV6作為默認地址協議,這樣會導致有時組網會失敗。可以將jvm系統參數java.net.preferIPv4Stack設置為true(java -Djava.net.preferIPv4Stack=[true|false]...)來指定jvm環境強制使用ipv4。
到此,Hazelcast組建集群和網絡通信相關的內容介紹完畢,總的來說都是網絡配置相關的說明。后續的博文會逐一介紹Hazelcast的分布式數據結構(Map、List等)和分布式功能,敬請期待。