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();
}
}
}