Hazelcast集群服务(3)——集群功能详解
Hazelcst组网
Hazelcast自称"分布式数据网格”,那他最基本、最重要的功能就是时时刻刻都在多台服务器之间工作,这样必须有网络环境对其分布式功能提供支持。Hazelcast在网络环境中工作分为2个阶段:首先是组网阶段,随后是数据传输阶段。
组网是指每个Hazelcast节点启动时,都会搜寻是否有Hazelcast节点可以连接,组网过程支持多种协议。完成组网后,节点会和其他组建成集群的节点进行通信,这个阶段就是数据传输阶段,此时只支持使用TCP/IP协议来传递数据。Hazelcast的所有网络行为,都是通过<networt></network>元素配置决定的。<join>元素用来配置组建集群的相关的参数。
组播协议(Multicast)组建集群
在使用组播协议(Multicast)作为自动组建集群机制时,集群中的成员不需要知道其他成员的详细地址(IP),他们仅仅是通过组播将信号广播到其他成员的监听端口中。使用之前确保网络环境支持 Multicast。
下面是一个通过组播协议(Multicast)组网的例子:
<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>192.168.1.102</interface> </trusted-interfaces> </multicast> <tcp-ip enabled="false"> </tcp-ip> <aws enabled="false"> </aws> </join> <network>
</hazelcast>
组网功能的配置由 <join> 及其子元素来确定。其中 <multicast> 元素用来配置 组播协议 组网的相关参数。当设置 <multicast> 元素中 enabled 属性为 true 时,表示启用 组播协议 组网。下面将详细说明每一个参数:
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协议组建集群
除了使用 组播协议,还可以使用TCP/IP协议来组建集群。当使用TCP/IP来组建新集群时,第一个节点必须将所有要加入集群的节点IP地址添加到对应列表中。在集群已经运行之后,新加入的节点不必知道所有的集群节点,但是至少要知道并连接到一个已经启动的集群节点。
下面是一个使用TCP/IP协议来组建集群的例子:
<hazelcast> <network> <join> <multicast enabled="false"> </multicast> <tcp-ip enabled="true"> <required-member>192.168.1.104</required-member> <member>192.168.1.104</member> <members>192.168.1.105,192.168.1.106</members> <connection-timeout-seconds>60</connection-timeout-seconds> </tcp-ip> </join> </network> </hazelcast>
从上面的例子可以看出使用TCP/IP组建网络涉及的配置参数并不多。首先需要将<tcp-ip>元素中的enabled属性设置为true表示启用TCP/IP协议来组网。然后每个元素对应的含义如下
required-member:加入集群的成员IP地址,只有这些IP地址的成员存在时集群才会组建。也就是说如果要当前节点加入集群,必须<required-member>元素中的指定的IP地址已经有集群节点先启动了,该节点才能启动,可以用于限制节点的启动顺序。
member:成员的IP地址。指定要加入集群的成员IP地址,这些IP地址中的成员会相互发现对方。
members:member的复数形态。在元素中可以使用逗号(“,”)分割多个IP地址。还可以使用-或*等符号来表达多个IP地址。
connection-timeout-seconds:定义连接超时时间。Hazelcast尝试连接到一个已知的节点(member元素指定)的最大超时时间,如果在指定时间内连接失败,将会放弃连接。当参数设置太小时,可能会导致一个成员可能无法连接到集群。设置太高时,成员启动的等待时间会比较久,因为当某些<member>元素标记的节点未启动时,需要花费较多时间等待。如果有较多的不同IP地址的成员需要加入集群,可以适当增加这个值,以保证所有的成员可以正确加入集群。默认值为5。
其他组网方式
除了上面说的 组播协议 和 TCP/IP协议 组建集群的方式,Hazelcast还为某些特定的使用场景提供了组建集群的方法。目前提供了基于亚马逊的EC2环境和jclouds组建集群,目前还没有亚马逊的云服务的使用经验,相关配置就不详细说明了,如果需要在亚马逊云部署集群可以留言一起聊聊,我会尽量把知道的分享给有需要的朋友。
Hazelcast网络运行
在完成集群组网以后Hazelcast的节点之间就会开始数据通信,因此Hazelcast还提供了大量的元素来对数据通信进行配置,看下面这个例子:
<network> <public-address>11.22.33.44:5555</public-address> <port auto-increment="true" port-count="100">5701</port> <outbound-ports> <ports>0</ports> </outbound-ports> <reuse-address>false</reuse-address> <interfaces enabled="false"> <interface>10.10.1.*</interface> </interfaces> <ssl enabled="false" /> <socket-interceptor enabled="false" /> <symmetric-encryption enabled="false"> <algorithm>PBEWithMD5AndDES</algorithm> <salt>thesalt</salt> <password>thepass</password> <iteration-count>19</iteration-count> </symmetric-encryption> </network>
除了<join>元素,Hazelcast还提供了上面XML中的元素来配置网络数据通信,下面我们一一介绍他的作用。
public-address
配置当前节点的对外公开地址。什么叫对外公开地址呢?默认情况下,一个节点会使用它的套接字(sockets)地址作为公开地址。但是经过网络地址转换(NAT),2个节点可能无法彼此访问。此时只有将2个节点的公开地址设置为在NAT上定义的地址才能完成连接。这种情况下,公开地址并不是本地的地址,而是一个由NAT定义的虚拟地址。这个设置对于在私有云的环境中使用Hazelcasst会非常有用。需要注意的是,这个元素的配置需要制定端口,即 [domain|ip]:port 的格式。
port
指定Hazelcast用于集群成员之间数据通信的端口。Hazelcast会根据端口的使用情况自动检查可以使用的端口。检查方式主要通过<port>元素中的port-count和auto-increment来决定。下面是关于他们的说明:
- port-count:默认时,Hazelcast将尝试绑定100个端口。意思是,如果将端口设置为5701,当有一个成员加入到集群,Hazelcast将尝试在5701到5801之间寻找一个端口。当有大量的实例运行在同一个机器,而端口较为紧缺时,可以适当的加大这个数字。这个参数就是用于此目的,默认是100。
- auto-increment:Hazelcast将会尝试在5701到5801之间寻找未被使的端口。通常情况下,不需要去修改这个值,这个配置已经非常方便使用。但是在某些时候,系统希望使用指定的端口,此时可以通过关闭自动增长功能来实现——将auto-increment属性设置设为false。
outbound-ports
默认情况下,在打开一个套接字(socket)用于传输数据时系统会选择一个临时端口。但是如果启用某些安全策略或防火墙可能会限制某些临时端口的使用。为了解决这个问题,Hazelcast提供<outbound-ports>元素来指定套接字的临时对外传输端口。可以像下面这样配置多个套接字端口:
<network> <outbound-ports> <ports>33000-35000</ports> <ports>37000,37001,37002,37003</ports> <ports>38000,38500-38600</ports> </outbound-ports> </network>
默认为<ports>0</ports>,表示由Hazelcast自己选择可用端口。
Reuse Address
配置地址是否可以重用。当关闭一个集群节点时,服务器的套接字(socket)端口会处于 TIME_WAIT 状态。如果将<reuse-address>元素设置为true,那么TIME_WAIT状态将被忽略,新加入的节点可以重复使用已经释放的端口。
Interfaces
指定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)。将<interfaces>的enabled设置为true,则会启用网络接口配置(默认是禁用的),在启用网络接口配置后如果Hazelcast找不到配置的IP地址,将会输出一个异常信息,并停止启动节点。
其他商用授权配置
除了前面提到的几个配置,Hazelcast还额外提供了<ssl>、<socket-interceptor>、<symmetric-encryption>三个安全相关的配置,但是需要获取Hazlecast的商用授权下载商用版本这些配置才能生效。ssl表示启用ssl传输、interceptor用于传输拦截器、symmetric-encryption用于传输数据加密。
IPV6支持
Hazelcast的所有网络IP配置都支持IPV6。例如可以使用下面的方式来配置IP地址:
<hazelcast> <network> <port auto-increment="true">5701</port> <join> <multicast enabled="false"> <multicast-group>FF02:0:0:0:0:0:0:1</multicast-group> <multicast-port>54327</multicast-port> </multicast> <tcp-ip enabled="true"> <member>fe80::223:6cff:fe93:7c7e:5701</member> <interface>fe80:0:0:0:45c5:47ee:fe15:493a</interface> </tcp-ip> </join> <interfaces enabled="true"> <interface>fe80:0:0:0:45c5:47ee:fe15:*</interface> <interface>fe80::223:6cff:fe93:0-5555</interface> </interfaces> </network> </hazelcast>
需要强调的是,并不是所有的环境都能有效的支持IPV6。而Hazelcast有个坑时在同时支持IPV6和IPV4的环境会优先使用IPV6作为默认地址协议,这样会导致有时组网会失败。可以将jvm系统参数java.net.preferIPv4Stack设置为true(java -Djava.net.preferIPv4Stack=[true|false]...)来指定jvm环境强制使用ipv4。
到此,Hazelcast组建集群和网络通信相关的内容介绍完毕,总的来说都是网络配置相关的说明。后续的博文会逐一介绍Hazelcast的分布式数据结构(Map、List等)和分布式功能,敬请期待。