Hazelcast集群服务(3)——集群功能详解

    在前2篇博文中,介绍了 Hazelcast的基本原理Hazelcast基本配置。后续的博文会逐一介绍Hazelcast的主要功能组件。本篇将详细说明Hazelcast集群组建、集群数据通信相关的内容,大家可以用来当做使用Hazelcast的帮助文档、或进行技术决策分析的指导文档。

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>

    组网功能的配置由 <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地址中的成员会相互发现对方。

membersmember的复数形态。在元素中可以使用逗号(“,”)分割多个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-countauto-increment来决定。下面是关于他们的说明:

  • port-count:默认时,Hazelcast将尝试绑定100个端口。意思是,如果将端口设置为5701,当有一个成员加入到集群,Hazelcast将尝试在5701到5801之间寻找一个端口。当有大量的实例运行在同一个机器,而端口较为紧缺时,可以适当的加大这个数字。这个参数就是用于此目的,默认是100。
  • auto-incrementHazelcast将会尝试在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有个坑时在同时支持IPV6IPV4的环境会优先使用IPV6作为默认地址协议,这样会导致有时组网会失败。可以将jvm系统参数java.net.preferIPv4Stack设置为truejava -Djava.net.preferIPv4Stack=[true|false]...)来指定jvm环境强制使用ipv4

    到此,Hazelcast组建集群和网络通信相关的内容介绍完毕,总的来说都是网络配置相关的说明。后续的博文会逐一介绍Hazelcast的分布式数据结构(Map、List等)和分布式功能。

原文地址:https://www.chkui.com/article/hazelcast/hazelcast_introduction_of_cluster

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

使用fuzzDB进行web安全测试

写在前面: fuzzDB看字面意思就知道,他是一个用于fuzz网站的库。类似于wwwscan之类工具的字典,但是他的过人之处是他是“开源”的,会有很多大神帮你维...

41880
来自专栏JetpropelledSnake

RESTful源码学习笔记之RPC和Restful深入理解

RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实...

11930
来自专栏惨绿少年

AWStats日志分析系统

AWStats是一款功能强大且功能强大的免费工具,可以图形方式生成高级Web,流媒体,ftp或邮件服务器统计信息。此日志分析器用作CGI或命令行, 并在几个图形...

18410
来自专栏颇忒脱的技术博客

远程Debug Java进程的方法

远程debug的意思是启动一个Java进程,启动一个debugger进程,将两者连接起来,利用debugger来debug Java进程。

26920
来自专栏拭心的安卓进阶之路

Android 进阶13:几种进程通信方式的对比总结

不花时间打基础,你将会花更多时间解决那些不必要的问题。 RPC 是什么 RPC 即 Remote Procedure Call (远程过程调用) 是一种计算机通...

40550
来自专栏我是攻城师

理解Java中锁的状态与优化

关于锁的知识,按大类来说,通常我们只分乐观锁和悲观锁。但在Java语言里对同步锁的状态又进行了细化通常有无锁状态,偏向锁,自旋锁,轻量级锁,重量级锁,这么做的目...

17940
来自专栏Felix的技术分享

用Android Studio调试Framework层代码

65350
来自专栏SpringBoot 核心技术

SpringCloud组件:Eureka服务注册中心内置的REST节点列表

你有没有考虑过Eureka Client与Eureka Server是通过什么方式进行通讯的? 为什么Client启动成功后Server就会被注册到Serve...

1.1K20
来自专栏一枝花算不算浪漫

集群下session共享问题的解决方案.

950100
来自专栏安恒网络空间安全讲武堂

PHP的libcurl中存在的一些问题

PHP的libcurl中存在的一些问题 看了近来的几场ctf题目,学习了一些关于php libcurl的一些知识,在这里总结一下。 0x1发送POST请求时造成...

25950

扫码关注云+社区

领取腾讯云代金券