activemq笔记3-zookeeper和mq实现主从

本文详细介绍了如何使用Zookeeper实现ActiveMQ的主从配置,包括Zookeeper的准备、ActiveMQ的多实例安装、主从启动、状态检查以及多主机多MQ的主从配置。在Zookeeper中管理主从状态,确保高可用性和数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Zookeeper准备

1、解压zookeeper
2、Zookeeper目录中创建data目录
(1)目录中创建一个标记文件(用于区分不同zookeeper)
(2)echo 1 >> myid
3、在conf配置文件件中复制zoo模板,并创建zoo.cfg(默认zookeeper读取zoo.cfg)
4、修改zoo.cfg配置文件
在这里插入图片描述
zookeeper主从端口分配
在这里插入图片描述
5、复制zookeeper02、zookeeper03
6、启动zookeeper
(1)启动命令:/usr/local/zookeeper01/bin/zkServer.sh start
(2)关闭命令:/usr/local/zookeeper01/bin/zkServer.sh stop
(3)查看状态:/usr/local/zookeeper01/bin/zkServer.sh status
(4)要至少启动两个 Zookeeper 启动. 启动单一 Zookeeper,无法正常提供服务.

2、activemq主从安装(单一主机多mq)

1、在同一个 Linux 中安装三个 ActiveMQ 实例,使用不同端口实现同时启动,分配如下
主机 Ms端口 服务端口 Jetty端口
192.168.111.128 62626 61616 8161
192.168.111.128 62627 61617 8162
192.168.111.128 62628 61618 8163

2、修改jetty端口
(1)Activemq/conf/jetty.xml中修改
(2)Jetty是activemq的图形化界面服务,默认端口为8161
3、修改activemq的brokerName
(1)统一各个节点的brokerName命名
4、持久化配置
(1)修改 conf/activemq.xml 文件。
(2)修改 broker 标签中子标签 persistenceAdapter 相关内容。

  • replicas 属性代表当前主从模型中的节点数量。按需配置。

  • bind 属性中的端口为主从实例之间的通讯端口。代表当前实例对外开放端口是什么,三 个实例分别使用62626、62627、62628
    端口。

  • zkAddress 属性代表 ZooKeeper 安装位置,安装具体情况设置。

  • zkPath 是 ActiveMQ 主从信息保存到 ZooKeeper 中的什么目录内。

  • hostname 为 ActiveMQ 实例安装 Linux 的主机名,可以在/etc/hosts 配置文件中设置。设 置格式为:IP
    主机名。 如: 127.0.0.1 mq-server

<persistenceAdapter> 
	<replicatedLevelDB 
		directory="${activemq.data}/levelDB" 
		replicas="3" 
		bind="tcp://0.0.0.0:62626" 
		zkAddress="192.168.159.130:2181,192.168.159.130:2182,192.168.159.130:2183" 
		zkPath="/activemq/leveldb-stores" 
		hostname="mq-server" /> 
</persistenceAdapter>

5、服务端口配置
(1)服务端口即activemq对外提供的访问端口,默认为61616;端口分配见上述列表。

3、启动主从

1、命令:mq01/bin/activemq start
在这里插入图片描述
2、查看状态
(1)Jps
在这里插入图片描述
(2)zookeeper客户端查看
①zookeeper01/bin/zkCli.sh 进入zookeeper客户端
②ls /activemq/leveldb-stores 访问activemq保存在zookeeper的目录
③get /activemq/leveldb-stores/00000000000
在这里插入图片描述
(3)查看activemq主从节点
①命令 get/activemq/leveldb-stores/00000000000
②elected 不是null的则为主节点;否则为从节点
在这里插入图片描述
(4)说明
①控制台只有主机才可以访问
②主机宕机后从机转成主机
③主机宕机后会转移相应数据至新主机中
④从机宕机后恢复主机会将该从机未接受指令发送至从机

4、多主机多mq主从

1、统一activemq.xml中brokerName
2、persistenceAdapter配置

<persistenceAdapter>
        <!--<kahaDB directory="${activemq.data}/kahadb"/>-->
		<replicatedLevelDB 
			directory="${activemq.data}/levelDB" 
			replicas="3" 
			bind="tcp://0.0.0.0:62626" 
			zkAddress="192.168.111.128:2181,192.168.111.128:2182,192.168.111.128:2183" 
			zkPath="/activemq/leveldb-stores" 
			hostname="192.168.111.130" />
</persistenceAdapter>

3、说明

  • 不同的节点ip不同,端口可以一致
  • persistenceAdapter中zkAddress指定对应的zookeeper集群
  • persistenceAdapter中hostname不同的节点需要单独设置本机的host以区分
  • 如果zookeeper是单个服务不是集群,则persistenceAdapter的zkAddress单独配置

5、producer代码

1、producer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:amq="http://activemq.apache.org/schema/core"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd
            http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <!-- 配置ActiveMQConnectionFactory连接工厂对象 -->
    <amq:connectionFactory
            id="amqConnectionFactory"
            brokerURL="failover:(tcp://192.168.111.130:61616,tcp://192.168.111.131:61616,tcp://192.168.111.132:61616)"
            userName="admin"
            password="admin"/>

    <!-- 配置connectionFactory的连接池信息 -->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
        <property name="connectionFactory" ref="amqConnectionFactory"></property>
        <property name="maxConnections" value="10"></property>
    </bean>
    <!-- 带有缓存功能的连接工厂,Session缓存大小可配置 -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="pooledConnectionFactory"></property>
        <property name="sessionCacheSize" value="100"></property>
    </bean>
    <!-- 配置JmsTemplate -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 给定连接工厂, 必须是spring创建的连接工厂. -->
        <property name="connectionFactory" ref="connectionFactory"></property>
        <!-- 可选 - 默认目的地命名 -->
<!--        <property name="defaultDestinationName" value="topic3"></property>-->
        <!-- pubSubDomain 为true表示发布订阅模式;false表示点对点模式 -->
        <property name="pubSubDomain" value="true"/>
    </bean>

    <!--<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="queue"/>
    </bean>-->

    <bean id="topic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="topic"/>
    </bean>

</beans>

2、controller

@Controller
public class TestPorducer {

    @Autowired
    private JmsTemplate jmsTemplate;

    @RequestMapping("sendmsg.do")
    public String send(@RequestParam("msg") final String  message) {
        System.out.println("发送消息---->"+message);
        jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
        return "ok";
    }

3、consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:amq="http://activemq.apache.org/schema/core"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.3.xsd
            http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <amq:connectionFactory brokerURL="failover:(tcp://192.168.111.130:61616,tcp://192.168.111.131:61616,tcp://192.168.111.132:61616)"
                           userName="admin" password="admin" id="amqConnectionFactory"/>

    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="amqConnectionFactory" />
        <property name="sessionCacheSize" value="10" />
    </bean>

    <!--<bean id="testConsumer" class="mail.controller.TestConsumer"></bean>

    <jms:listener-container acknowledge="auto" container-type="default"
                            destination-type="queue" connection-factory="connectionFactory">
        <jms:listener destination="simple_queue" ref="testConsumer"/>
    </jms:listener-container>-->

    <!-- queue消费者 -->
    <bean id="listener" class="mail.controller.TestConsumer"/>
    <!-- topic消费者 -->
    <bean id="listener1" class="mail.listener.TestConsumer1"/>
    <bean id="listener2" class="mail.listener.TestConsumer2"/>

    <!-- Queue监听器 -->
<!--    <jms:listener-container destination-type="queue"
                            container-type="default" connection-factory="connectionFactory"
                            acknowledge="auto">
        <jms:listener destination="queue" ref="listener" />
    </jms:listener-container>-->

    <!-- Topic监听器 -->
    <jms:listener-container destination-type="topic"
                            container-type="default" connection-factory="connectionFactory"
                            acknowledge="auto">
        <jms:listener destination="topic" ref="listener1" />
        <jms:listener destination="topic" ref="listener2" />
    </jms:listener-container>



</beans>

4、consumer.java

public class TestConsumer implements MessageListener {
    @Override
    public void onMessage(Message message) {
        // myQueueB的消费者
        try {
            String text = ((TextMessage) message).getText();
            System.out.println(this.getClass().getSimpleName() + "接受到消息---->" + text);

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值