最近在总结hazelcast的资料,顺便把集群的也总结下.
Hazelcast自称"分布式数据网格”,那他最基本、最重要的功能就是时时刻刻都在多台服务器之间工作,这样必须有网络环境对其分布式功能提供支持。Hazelcast在网络环境中工作分为2个阶段:首先是组网阶段,随后是数据传输阶段。
组网是指每个Hazelcast节点启动时,都会搜寻是否有Hazelcast节点可以连接,组网过程支持多种协议。完成组网后,节点会和其他组建成集群的节点进行通信,这个阶段就是数据传输阶段,此时只支持使用TCP/IP协议来传递数据。
在使用组播协议(Multicast)作为自动组建集群机制时,集群中的成员不需要知道其他成员的详细地址(IP),他们仅仅是通过组播将信号广播到其他成员的监听端口中。使用之前确保网络环境支持 Multicast.
属性 | 解释 |
---|---|
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) |
multicast-timeout-seconds | 当节点启动后,这个参数(单位:秒)指定了当前节点等待其他节点响应的时间周期。例如,设置为60秒时,每一个节点启动后通过组播协议广播消息,如果主节点在60秒内返回响应消息,则新启动的节点加入这个主节点所在的集群,如果设定时间内没有返回消息,那么节点会把自己设置为一个主节点,并创建新的集群(主节点可以理解为集群的第一个节点)。默认值为2秒 |
trusted-interfaces | 可信任成员的IP地址。当一个节点试图加入集群,如果其不是一个可信任节点,他的加入请求将被拒绝。可以在IP的最后一个数字上使用通配符(*)来设置一个IP范围(例如:192.168.1.* 或192.168.1.100-110) |
The TTL (Time To Live) field in the IP header has a double significance in multicast. As always, it controls the live time of the datagram to avoid it being looped forever due to routing errors. Routers decrement the TTL of every datagram as it traverses from one network to another and when its value reaches 0 the packet is dropped.
//com.hazelcast.config.Config
Config config = new Config();
config
.getNetworkConfig()
.getJoin()
.getMulticastConfig()
.setEnabled(true)
.setMulticastGroup("224.2.2.3")
.setMulticastPort(545327)
.setMulticastTimeToLive(32)
.setMulticastTimeoutSeconds(2)
.addTrustedInterface("192.168.1.102");
config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false);
在使用TCP/IP协议来组建集群。当使用TCP/IP来组建新集群时,第一个节点必须将所有要加入集群的节点IP地址添加到对应列表中。在集群已经运行之后,新加入的节点不必知道所有的集群节点,但是至少要知道并连接到一个已经启动的集群节点.
属性 | 解释 |
---|---|
required-member | 加入集群的成员IP地址,只有这些IP地址的成员存在时集群才会组建。也就是说如果要当前节点加入集群,必须元素中的指定的IP地址已经有集群节点先启动了,该节点才能启动,可以用于限制节点的启动顺序 |
member | 成员的IP地址。指定要加入集群的成员IP地址,这些IP地址中的成员会相互发现对方 |
members | member的复数形态,还可以使用-或*等符号来表达多个IP地址 |
connection-timeout-seconds | 定义连接超时时间。Hazelcast尝试连接到一个已知的节点(member元素指定)的最大超时时间,如果在指定时间内连接失败,将会放弃连接。当参数设置太小时,可能会导致一个成员可能无法连接到集群。设置太高时,成员启动的等待时间会比较久,因为当某些元素标记的节点未启动时,需要花费较多时间等待。如果有较多的不同IP地址的成员需要加入集群,可以适当增加这个值,以保证所有的成员可以正确加入集群。默认值为5 |
//com.hazelcast.config.Config
Config config = new Config();
config
.getNetworkConfig()
.getJoin()
.getTcpIpConfig()
.setEnabled(true)
.setRequiredMember("192.168.1.104")
.addMember("192.168.1.104")
.setMembers( Arrays.asList(members))
.setConnectionTimeoutSeconds(60);
config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false);
在完成集群组网完成以后Hazelcast的节点之间就会开始数据通信,因此Hazelcast还提供了大量的属性来对数据通信进行配置
属性 | 解释 |
---|---|
public-address | 配置当前节点的对外公开地址。默认情况下,一个节点会使用它的套接字(sockets)地址作为公开地址。但是经过网络地址转换(NAT),2个节点可能无法彼此访问。此时只有将2个节点的公开地址设置为在NAT上定义的地址才能完成连接。这种情况下,公开地址并不是本地的地址,而是一个由NAT定义的虚拟地址。这个设置对于在私有云的环境中使用Hazelcasst会非常有用。需要注意的是,这个元素的配置需要制定端口,即 [domain|ip]:port 的格式 |
port | 指定Hazelcast用于集群成员之间数据通信的端口。Hazelcast会根据端口的使用情况自动检查可以使用的端口。检查方式主要通过元素中的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提供元素来指定套接字的临时对外传输端口 |
Reuse Address | 配置地址是否可以重用。当关闭一个集群节点时,服务器的套接字(socket)端口会处于 TIME_WAIT 状态。如果将元素设置为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)。将的enabled设置为true,则会启用网络接口配置(默认是禁用的),在启用网络接口配置后如果Hazelcast找不到配置的IP地址,将会输出一个异常信息,并停止启动节点 |
除了前面提到的几个配置,Hazelcast还额外提供了<ssl>、<socket-interceptor>、<symmetric-encryption>四个安全相关的配置,但是需要获取Hazlecast的商用授权下载商用版本这些配置才能生效。ssl表示启用ssl传输、interceptor用于传输拦截器、symmetric-encryption用于传输数据加密。
// com.hazelcast.config.Config
Integer[] ports = { 0 };
Config config = new Config();
config.getNetworkConfig().setPublicAddress("11.22.33.44:5555");
config.getNetworkConfig().setPort(5701).setPortAutoIncrement(true).setPortCount(100);
config.getNetworkConfig().setOutboundPorts(Arrays.asList(ports));
config.getNetworkConfig().setReuseAddress(false);
config.getNetworkConfig().getInterfaces().setEnabled(false).addInterface("10.10.1.*");
//Commercial authorization configuration start
config.getNetworkConfig().getSSLConfig().setEnabled(false);
config.getNetworkConfig().getSocketInterceptorConfig().setEnabled(false);
config.getNetworkConfig().getSymmetricEncryptionConfig()
.setAlgorithm("PBEWithMD5AndDES")
.setSalt("thesalt")
.setPassword("thepass")
.setIterationCount(19);
//Commercial authorization configuration end