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