【Hazelcast系列 二】創建Hazelcast集群

Hazelcast系列 一 中介紹了什么是Hazelcast,以及為什么選擇Hazelcast,在本章中我們將介紹如何配置一個Hazelcast集群。

1、集群發現機制

Hazelcast集群是一個由運行Hazelcast實例構成的網絡,成員自動加入集群,成員自動加入集群依賴集群發現機制。當Hazelcast集群建立完成,集群間成員使用TCP/IP互相通信,這不受集群發現機制的約束。Hazelcast支持以下發現機制:

  • TCP

  • 多播

    多播使用UDP協議,在生產環境中,UDP經常被禁止使用,因此不推薦使用多播發現機制。

  • GCP Cloud Discovery

  • AWS Cloud Discovery

  • Apache jclouds Cloud Discovery

  • Azure Cloud Discovery

  • Zookeeper

  • Consul

  • Etcd

  • PCF

  • OpenShift

  • Eureka

  • Heroku

  • Kubernetes

Hazelcast支持業界主流的集群發現機制,可以根據自己的需求和條件選擇適合自己的集群發現機制。

2、TCP發現機制

如果在你的環境中多播不是一個合適的選擇,你可以把Hazelcast配置成一個完整的TPC/IP集群(發現和通信都使用TCP/IP協議)。使用TCP/IP配置Hazelcast集群成員發現時,需要列出全部或部分成員的主機名或IP地址。無需列出所有集群成員,但是當新成員加入時,至少有一個列出的成員必須在集群中處于活躍狀態。

使用xml配置TPC/IP發現的簡單配置如下:

<hazelcast>
    ...
    <network>
        <join>
            <multicast enabled="false">
            </multicast>
            <tcp-ip enabled="true">
                <member>machine1</member>
                <member>machine2</member>
                <member>machine3:5799</member>
                <member>192.168.1.0-7</member>
                <member>192.168.1.21</member>
            </tcp-ip>
        </join>
    </network>
    ...
</hazelcast>

除去使用xml進行配置,Hazelcast所有的配置都支持以yaml文件的方式進行配置,上面xml對應的yaml等效配置如下

  • member 可以配置主機名 和IP,也可以配置IP地址范圍。
  • 如果member是多個IP地址可以使用members簡化配置:
<members>192.168.1.0-7,192.168.1.21</members>
  • 如果沒有提供端口,Hazelcast會從5701、5702等嘗試。
  • 默認Hazelcast綁定所有的網絡接口來接收流量,但是可以通過設置hazelcast.socket.bind.any=false 來改變,并通過interface 來決定綁定的網絡接口,如果沒有配置interface的值, Hazelcast會選擇一個網絡接口綁定

Hazelcast同時還支持以yaml的方式進行所有的配置,上面xml等效的yaml配置如下:

hazelcast:
  network:
    join:
      multicast:
        enabled: false
        multicast-group: 224.2.2.3
        multicast-port: 54327
      tcp-ip:
        enabled: true
        member-list:
          - machine1
          - machine2
          - machine3:5799
          - 192.168.1.0-7
          - 192.168.1.21

3、多播發現機制

Hazelcast允許集群成員間使用多播通信來相互發現。集群成員間不需要互相知道對方的具體地址,而只是向集群內所有監聽的成員廣播消息。多播是否可用或允許使用依賴于環境,使用前請謹慎確認,避免環境不允許使用而導致功能異常。

下面是使用xml配置多播發現機制的最簡單配置:

<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>169.254.82.121</interface>
                </trusted-interfaces>
            </multicast>
        </join>
    </network>
    ...
</hazelcast>

對于參數multicast-timeout-seconds 需要多加注意,該參數表明了一個成員等待合法的多播響應的時間,單位為s,如果在設定的時間內沒有收到合法的響應,該成員就會選舉自己成為leader并創建自己的集群。該參數只適用于集群無leader而且新的成員剛啟動的場景。如果參數的值設置的太大,比如60s,這意味著在選舉出leader之前需要等待60s之后才能進行下一次的嘗試。值設置過大和過小都需要謹慎處理,如果值設置的太小,可能導致成員過早的放棄而開始下一輪嘗試。

4、發現本地客戶端

使用多播插件,本地java客戶端和Hazelcast成員之間可以互相發現,插件以SPI機制的方式提供。為了使用多播發現Hazelcast成員和java客戶端都需要配置插件。

下面的xml提供了集群配置多播發現插件的最簡單配置:

<hazelcast>
    ...
    <properties>
        <property name="hazelcast.discovery.enabled">true</property>
    </properties>
    <network>
        <join>
            <multicast enabled="false">
            </multicast>
            <tcp-ip enabled="false">
            </tcp-ip>
            <discovery-strategies>
                <discovery-strategy class="com.hazelcast.spi.discovery.multicast.MulticastDiscoveryStrategy" enabled="true">
                    <properties>
                        <property name="group">224.2.2.3</property>
                        <property name="port">54327</property>
                    </properties>
                </discovery-strategy>
            </discovery-strategies>
        </join>
    </network>
    ...
</hazelcast>
  • group 多播組
  • port 多播端口

5、創建集群

通過cluster-name 是創建集群最簡單的方法,cluster-name 也是對集群隔離分組的簡單方式,下面創建了一個名字為IoT 的Hazelcast集群:

<hazelcast>
    <cluster-name>IoT</cluster-name>
</hazelcast>

也可以使用編碼的方式配置集群。一個JVM可以運行多個Hazelcast實例,每個實例只能加入一個組(集群),每個實例只和所屬集群的實例交互,與其他集群的實例隔離。

        GroupConfig iotGroupConfig = new GroupConfig();
        iotGroupConfig.setName("IoT");
        Config iotConfig = new Config();
        iotConfig.setGroupConfig(iotGroupConfig);

        GroupConfig edgeGroupConfig = new GroupConfig();
        edgeGroupConfig.setName("edge");
        Config edgeConfig = new Config();
        edgeConfig.setGroupConfig(iotGroupConfig);

        HazelcastInstance instance1 = Hazelcast.newHazelcastInstance(iotConfig);
        HazelcastInstance instance2 = Hazelcast.newHazelcastInstance(iotConfig);
        HazelcastInstance instance3 = Hazelcast.newHazelcastInstance(edgeConfig);

上面的代碼創建了三個實例:instance1、instance2和instance3,其中instance1和instance屬于IoT集群,instance3屬于edge集群。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容