MQ 系列之 ActiveMQ 搭建 Zookeeper + Replicated LevelDB 集群

1.1 简介

1.1.1 概述

  从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的 Masster-Slave 方式.,增加了基于 Zookeeper + LevelDB 的 Master-Slave 实现方式,从 5.9 版本后也是官网推荐。需要注意的是 LevelDB 存储尚不支持存储与“延迟”和“计划任务消息”关联的数据。这些文件存储在单独的 non-replicated KahaDB 中。如果将“延迟”和“计划任务消息”与 replicated LevelDB 一起使用,则会发生意外结果,因为该消息将不会复制到 Slave Broker 上,当主服务器故障转移到从服务器时,该数据将不存在,不能实现消息的高可用。
在这里插入图片描述

1.1.2 原理

  使用 ZooKeeper 集群注册所有的 ActiveMQ Broker 但只有其中的一个 Broker 可以提供服务它将被视为 Master,其他的 Broker 处于待机状态被视为 Slave。如果 Master 因故障而不能提供服务 ZooKeeper 会从 Slave 中选举出一个 Broker 充当 Master。Slave 连接 Master 并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到连接至 Master 的 Slaves。如果 Master 宕机推选出的 Slave 会成为 Master。故障节点在恢复后会重新加入到集群中并连接 Master 进入 Slave 模式。所有需要同步的消息操作都将等待存储状态被同步到其他法定节点后才能完成。
在这里插入图片描述





1.2 集群搭建

1.2.1 前期准备

♞ Java 环境,演示使用 JDK 1.8
♞ Zookeeper 集群,ActiveMQ 集群高可用依赖于 Zookeeper 集群高可用
♞ 准备三台服务器安装好 MQ,这里使用一台虚拟机创建不同的目录演示


1.2.2 修改配置文件

  修改 broker 标签中的 brokerName 属性,使得集群中的 ActiveMQ brokerName 保持一致,然后注掉默认的 KahaDB 改为 replicated LevelDB,配置如下所示

<persistenceAdapter>
	 <replicatedLevelDB
            directory="${activemq.data}/leveldb"
            replicas="3"
            bind="tcp://0.0.0.0:62621"
            zkAddress="192.168.91.129:2181,192.168.91.130:2181,192.168.91.131:2181"
            hostname="192.168.91.129"
            zkPath="/activemq/leveldb-stores"
            />
 </persistenceAdapter>

1.2.3 启动

依次启动 ActiveMQ 然后到 Zookeeper 中可以查看到节点信息
在这里插入图片描述

1.2.4 编码

  ActiveMQ 的客户端只能访问 Master 的 Broker,其他处于 Slave 的 Broker 不能访问,所以客户端连接的 Broker 应该使用 failover 失败转移协议。当一个 ActiveMQ 节点挂掉或者一个 Zookeeper 节点挂掉,ActiveMQ 服务依然正常运转,如果仅剩一个 ActiveMQ 节点,由于不能选举 Master,所以 ActiveMQ 不能正常运行;同样的,如果 Zookeeper 仅剩一个节点活动,不管 ActiveMQ 各节点存活,ActiveMQ 也不能正常提供服务。ActiveMQ 集群的高可用,依赖于 Zookeeper 集群的高可用。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/12/9
 * @description NIO
 */
@SpringJUnitConfig(locations = "classpath:application.properties")
public class ActiveMQSend {
    private String URL = "failover:(tcp://192.168.91.129:61616,tcp://192.168.91.130:61616,
tcp://192.168.91.1319:61616)?randomize=false"

    @Test
    public void send() throws JMSException {
        // 创建工厂对象
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        // 由工厂对象创建连接对象
        Connection connection = factory.createConnection();
        // 开启连接
        connection.start();

        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建消息
        TextMessage textMessage = session.createTextMessage();
        textMessage.setText("我是消息生产者");

        // 创建生产者
        Destination destination = session.createQueue("myText");
        MessageProducer producer = session.createProducer(destination);

        // 发送消息
        producer.send(textMessage);

        // 关闭资源
        producer.close();
        session.close();
        connection.close();
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值