美文网首页实战收藏-解决篇
【Hazelcast系列 二】创建Hazelcast集群

【Hazelcast系列 二】创建Hazelcast集群

作者: 大哥你先走 | 来源:发表于2020-01-11 10:23 被阅读0次

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

    相关文章

      网友评论

        本文标题:【Hazelcast系列 二】创建Hazelcast集群

        本文链接:https://www.haomeiwen.com/subject/dzyuactx.html