在前2篇博文中,介绍了 Hazelcast的基本原理 和 Hazelcast基本配置。后续的博文会逐一介绍Hazelcast的主要功能组件。本篇将详细说明Hazelcast集群组建、集群数据通信相关的内容,大家可以用来当做使用Hazelcast的帮助文档、或进行技术决策分析的指导文档。
Hazelcast自称"分布式数据网格”,那他最基本、最重要的功能就是时时刻刻都在多台服务器之间工作,这样必须有网络环境对其分布式功能提供支持。Hazelcast在网络环境中工作分为2个阶段:首先是组网阶段,随后是数据传输阶段。
组网是指每个Hazelcast节点启动时,都会搜寻是否有Hazelcast节点可以连接,组网过程支持多种协议。完成组网后,节点会和其他组建成集群的节点进行通信,这个阶段就是数据传输阶段,此时只支持使用TCP/IP协议来传递数据。Hazelcast的所有网络行为,都是通过
在使用组播协议(Multicast)作为自动组建集群机制时,集群中的成员不需要知道其他成员的详细地址(IP),他们仅仅是通过组播将信号广播到其他成员的监听端口中。使用之前确保网络环境支持 Multicast。
下面是一个通过组播协议(Multicast)组网的例子:
224.2.2.3
54327
32
2
192.168.1.102
组网功能的配置由
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/IP协议来组建集群。当使用TCP/IP来组建新集群时,第一个节点必须将所有要加入集群的节点IP地址添加到对应列表中。在集群已经运行之后,新加入的节点不必知道所有的集群节点,但是至少要知道并连接到一个已经启动的集群节点。
下面是一个使用TCP/IP协议来组建集群的例子:
192.168.1.104
192.168.1.104
192.168.1.105,192.168.1.106
60
从上面的例子可以看出使用TCP/IP组建网络涉及的配置参数并不多。首先需要将
required-member:加入集群的成员IP地址,只有这些IP地址的成员存在时集群才会组建。也就是说如果要当前节点加入集群,必须
member:成员的IP地址。指定要加入集群的成员IP地址,这些IP地址中的成员会相互发现对方。
members:member的复数形态。在元素中可以使用逗号(“,”)分割多个IP地址。还可以使用-或*等符号来表达多个IP地址。
connection-timeout-seconds:定义连接超时时间。Hazelcast尝试连接到一个已知的节点(member元素指定)的最大超时时间,如果在指定时间内连接失败,将会放弃连接。当参数设置太小时,可能会导致一个成员可能无法连接到集群。设置太高时,成员启动的等待时间会比较久,因为当某些
除了上面说的 组播协议 和 TCP/IP协议 组建集群的方式,Hazelcast还为某些特定的使用场景提供了组建集群的方法。目前提供了基于亚马逊的EC2环境和jclouds组建集群,目前还没有亚马逊的云服务的使用经验,相关配置就不详细说明了,如果需要在亚马逊云部署集群可以留言一起聊聊,我会尽量把知道的分享给有需要的朋友。
在完成集群组网完成以后Hazelcast的节点之间就会开始数据通信,因此Hazelcast还提供了大量的元素来对数据通信进行配置,看下面这个例子:
11.22.33.44:5555
5701
0
false
10.10.1.*
PBEWithMD5AndDES
thesalt
thepass
19
除了
配置当前节点的对外公开地址。什么叫对外公开地址呢?默认情况下,一个节点会使用它的套接字(sockets)地址作为公开地址。但是经过网络地址转换(NAT),2个节点可能无法彼此访问。此时只有将2个节点的公开地址设置为在NAT上定义的地址才能完成连接。这种情况下,公开地址并不是本地的地址,而是一个由NAT定义的虚拟地址。这个设置对于在私有云的环境中使用Hazelcasst会非常有用。需要注意的是,这个元素的配置需要制定端口,即 [domain|ip]:port 的格式。
指定Hazelcast用于集群成员之间数据通信的端口。Hazelcast会根据端口的使用情况自动检查可以使用的端口。检查方式主要通过
默认情况下,在打开一个套接字(socket)用于传输数据时系统会选择一个临时端口。但是如果启用某些安全策略或防火墙可能会限制某些临时端口的使用。为了解决这个问题,Hazelcast提供
33000-35000
37000,37001,37002,37003
38000,38500-38600
默认为
配置地址是否可以重用。当关闭一个集群节点时,服务器的套接字(socket)端口会处于 TIME_WAIT 状态。如果将
指定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)。将
除了前面提到的几个配置,Hazelcast还额外提供了
Hazelcast的所有网络IP配置都支持IPV6。例如可以使用下面的方式来配置IP地址:
5701
FF02:0:0:0:0:0:0:1
54327
fe80::223:6cff:fe93:7c7e:5701
fe80:0:0:0:45c5:47ee:fe15:493a
fe80:0:0:0:45c5:47ee:fe15:*
fe80::223:6cff:fe93:0-5555
需要强调的是,并不是所有的环境都能有效的支持IPV6。而Hazelcast有个坑时在同时支持IPV6和IPV4的环境会优先使用IPV6作为默认地址协议,这样会导致有时组网会失败。可以将jvm系统参数java.net.preferIPv4Stack设置为true(java -Djava.net.preferIPv4Stack=[true|false]...)来指定jvm环境强制使用ipv4。
到此,Hazelcast组建集群和网络通信相关的内容介绍完毕,总的来说都是网络配置相关的说明。后续的博文会逐一介绍Hazelcast的分布式数据结构(Map、List等)和分布式功能。