在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集群。