【Hazelcast系列 二】創(chuàng)建Hazelcast集群

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

1、集群發(fā)現(xiàn)機(jī)制

Hazelcast集群是一個(gè)由運(yùn)行Hazelcast實(shí)例構(gòu)成的網(wǎng)絡(luò),成員自動加入集群,成員自動加入集群依賴集群發(fā)現(xiàn)機(jī)制。當(dāng)Hazelcast集群建立完成,集群間成員使用TCP/IP互相通信,這不受集群發(fā)現(xiàn)機(jī)制的約束。Hazelcast支持以下發(fā)現(xiàn)機(jī)制:

  • TCP

  • 多播

    多播使用UDP協(xié)議,在生產(chǎn)環(huán)境中,UDP經(jīng)常被禁止使用,因此不推薦使用多播發(fā)現(xiàn)機(jī)制。

  • GCP Cloud Discovery

  • AWS Cloud Discovery

  • Apache jclouds Cloud Discovery

  • Azure Cloud Discovery

  • Zookeeper

  • Consul

  • Etcd

  • PCF

  • OpenShift

  • Eureka

  • Heroku

  • Kubernetes

Hazelcast支持業(yè)界主流的集群發(fā)現(xiàn)機(jī)制,可以根據(jù)自己的需求和條件選擇適合自己的集群發(fā)現(xiàn)機(jī)制。

2、TCP發(fā)現(xiàn)機(jī)制

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

使用xml配置TPC/IP發(fā)現(xiàn)的簡單配置如下:

<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進(jìn)行配置,Hazelcast所有的配置都支持以yaml文件的方式進(jìn)行配置,上面xml對應(yīng)的yaml等效配置如下

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

Hazelcast同時(shí)還支持以yaml的方式進(jìn)行所有的配置,上面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、多播發(fā)現(xiàn)機(jī)制

Hazelcast允許集群成員間使用多播通信來相互發(fā)現(xiàn)。集群成員間不需要互相知道對方的具體地址,而只是向集群內(nèi)所有監(jiān)聽的成員廣播消息。多播是否可用或允許使用依賴于環(huán)境,使用前請謹(jǐn)慎確認(rèn),避免環(huán)境不允許使用而導(dǎo)致功能異常。

下面是使用xml配置多播發(fā)現(xiàn)機(jī)制的最簡單配置:

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

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

4、發(fā)現(xiàn)本地客戶端

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

下面的xml提供了集群配置多播發(fā)現(xiàn)插件的最簡單配置:

<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、創(chuàng)建集群

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

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

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

        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);

上面的代碼創(chuàng)建了三個(gè)實(shí)例:instance1、instance2和instance3,其中instance1和instance屬于IoT集群,instance3屬于edge集群。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容