ActiveMQ三台消息服务器实现完美集群实战

###三台服务器完美集群实践
将节点A和节点B组成消息同步,节点A和节点C组成消息同步,节点B和节点C组成Master/Slave

节点服务端口管理端口存储网络连接器用途
Node-A616168161-Node-B,Node-c消费者
Node-B616178162/share_file/kahadbNode-A生产者,消费者
Node-C616188163/share_file/kahadbNode-A生产者,消费者

节点A因为是Broker集群,不需要配置存储,默认的也可以,因为它不去负责生产者的消息发送,它只负责消费,B和C因为是Master/Slave集群,配置了共享文件夹(暂时在同一台服务器所以只需指定共享文件夹),如果在不同服务器上进行集群,我们需要共享一个文件出来供大家使用,推荐使用支持SAN的分布文件系统,网络连接用来做Broker集群的。节点A不用来做生产者是因为,假如A作为生产者,因为现在网络连接是双向连接,A上面的消息也能被B和C消费掉,但是当A上有消息并且还未被消费的时候节点A挂掉,那么B和C就收不到消息了。

开始操作:
1.首先进入ActiveMQ的安装地址,建立一个文件夹用来存放三个节点的文件,复制安装包到该目录,并重命名为ActiveMQA,ActiveMQB,ActiveMQC。
2.创建一个共享目录用来做Master/Slave集群的共享储存文件夹。
3.开始配置三个节点,进入节点A的conf,配置activemq.xml文件,找到网络连接的配置,61616和8161是默认端口,不需要改变,其他协议端口暂时也不需要,直接注释掉,具体如下:

<transportConnectors>
	<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
	<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
</transportConnectors>

给A节点添加网络连接器的配置项:因为是三台比较明确的服务器,直接使用静态发现

<networkConnectors>
  <networkConnector name="local_network" uri="static:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)"/>
</networkConnectors>

配置管理界面服务器的jetty端口,配置jetty.xml文件即可。A节点使用默认端口,不需要修改,只需修改BC节点。

因为B节点和C节点配置的时Master/Slave集群,所以需要配置持久化的方案。

<persistenceAdapter>
  <kahaDB directory="D:\Program Files\apache-activemq-5.15.5\ServerCluster\kahadb"
</persistenceAdapter>

C节点和B节点配置差不多类似。

至此配置完成,按照顺序启动各个服务(A,B,C)

启动情况如下图:
这里写图片描述
发现61616和61617已经启动,并且都有一个本地连接,但是61618没有对外提供服务,但是进程已经启动了,这是因为B和C配置的时Master/Slave,所以B节点获取到了共享文件夹的所有权,所以C节点正在等待获得资源和对外提供服务,也即是在C未获得资源之前不对外提供服务。
测试将B杀掉,C能提供服务。成连接等待状态,恢复B之后变成Slave,不对外提供服务,如下图:

这里写图片描述

代码测试:

生产者:

客户端配置失效转移(url = “failover:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)?randomize=true”)
分析:failover作为状态转移的配置,B和C中当B连接出错时会自动转移到C节点,这样当我们的服务器B出现问题时不用修改程序会自动连接到C节点,继续向服务器发送消息,后面的参数表示随机选择一台,当出现问题选择另一台。A节点作为Broker集群只是一个消费者,所以在客户端生产者中不需要配置61616的A节点连接。

消费者:
url = “failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)?randomize=true”
分析:ABC三个节点都可以作为消费者进行消费

使用Spring的JMSTemplate进行测试,配置两个连接工厂,一个是生产者的,一个是消费者的,因为这两者的失效转移配置不一样,分别配置两个JMSTemplate,配置如下:

<bean id="jmsFactoryProducer" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL"
                          value="failover:(tcp://localhost:61617,tcp://localhost:61618)?randomize=true"/>
            </bean>
        </property>
    </bean>

    <bean id="jmsFactoryConsumer" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL"
                          value="failover:(tcp://localhost:61616,tcp://localhost:61617,tcp://localhost:61618)?randomize=true"/>
            </bean>
        </property>
    </bean>

    <!-- Spring JMS Template -->
    <bean id="myJmsTemplateProducer" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactoryProducer"/>
    </bean>

    <bean id="myJmsTemplateConsumer" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactoryConsumer"/>
    </bean>

测试发送和接收一百条队列消息:
生产者代码,消费者代码和测试代码在我的学习笔记中都有。下面只做结果分析。
结果分析:(以下分析通过后台管理界面观察得到)
B节点作为生产者生产了一百条消息,A节点的网络连接是连接到B节点,然后挂掉B节点,此时C节点成为新的Master拥有B之前生产的100条消息,然后再进行消息消费,发现是在A节点获取到这100条消息,他的连接是连接到C节点。C节点的网络连接时A,此时可以看到服务器与服务器之间建立了桥的连接。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值