Hazelcast集羣服務(3)——集羣功能詳解

  在前2篇博文中,介紹了 Hazelcast的基本原理 和 Hazelcast基本配置。後續的博文會逐一介紹Hazelcast的主要功能組件。本篇將詳細說明Hazelcast集羣組建、集羣數據通信相關的內容,大家可以用來當做使用Hazelcast的幫助文檔、或進行技術決策分析的指導文檔。

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>

    組網功能的配置由 <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地址中的成員會相互發現對方。

    membersmember的複數形態。在元素中可以使用逗號(“,”)分割多個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-countauto-increment來決定。下面是關於他們的說明:

  • port-count:默認時,Hazelcast將嘗試綁定100個端口。意思是,如果將端口設置爲5701,當有一個成員加入到集羣,Hazelcast將嘗試在5701到5801之間尋找一個端口。當有大量的實例運行在同一個機器,而端口較爲緊缺時,可以適當的加大這個數字。這個參數就是用於此目的,默認是100。
  • auto-incrementHazelcast將會嘗試在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有個坑時在同時支持IPV6IPV4的環境會優先使用IPV6作爲默認地址協議,這樣會導致有時組網會失敗。可以將jvm系統參數java.net.preferIPv4Stack設置爲truejava -Djava.net.preferIPv4Stack=[true|false]...)來指定jvm環境強制使用ipv4

    到此,Hazelcast組建集羣和網絡通信相關的內容介紹完畢,總的來說都是網絡配置相關的說明。後續的博文會逐一介紹Hazelcast的分佈式數據結構(Map、List等)和分佈式功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章