3.2.4 broker cluster和 master-slave的区别... 6
1 activemq 安装过程
1、使用 root 用户建立一个普通用户(Activemq 用户)。如:
adduser activemq
passwd activemq
[输入用户密码]
[再次输入用户密码确认]
2、登录activemq用户。
3、从http://activemq.apache.org/activemq-591-release.html下载apache-activemq-5.9.1-bin.tar.gz
4、解压tar -xvf /home/activemq/apache-activemq-5.9.1-bin.tar.gz
5、进入activemq根目录:cd /home/activemq/apache-activemq-5.9.1
6、拷贝examples/conf/activemq-jdbc.xml 文件到目录conf/activemq-oracle-jdbc.xml下。
7、vi conf/activemq-oracle-jdbc.xml 根据注释,修改数据源,并且参考activemq.xml引入资源jetty.xml。jetty.xml用于启用activemq的admin控制台。
主要做如下修改:
(1) 修改持久化适配器为oracle data source
(2) 修改数据库Oracle Data Source
(3) 引入jetty.xml
修改后的activemq-oracle-jdbc.xml如:
8、将oracle的驱动jar包复制到lib目录下。
9、启动服务器:bin/activemq start xbean:conf/activemq-oracle-jdbc.xml
按回车后,应该会显示activemq进程的pid。会在data目录下创建一个标识pid的文件。activemq关闭服务器时会查找此文件
10、 可以通过命令:tail -f data/activemq.log 监控activemq的日志
11、 关闭服务器:bin/activemq stop
2 监控
Activemq控制台:http:// ip:8161/admin 默认用户/密码:admin/admin。
控制台界面如下:
3 运维配置
3.1 ActiveMQ系统配置
参考:http://activemq.apache.org/version-5-xml-configuration.html
spring xml配置格式,通常配置
1、目标策略,如:生产者流量控制,内存限制,消息数量限制,队列分发顺序;
2、管理上下文;
3、持久化适配器;
4、系统用量;
5、网络连接器;用于集群内部通讯;
6、传输连接器;用于与客户端消息通讯;
7、关闭勾子;
8、引入其它资源;如WEB控制台;
3.2 Activemq集群
master-slave也有多种实现方式。它们的不同只是在共享数据和锁机制上。
3.2.1 基于JDBC的主从模式
需要启动两个activemq服务器(进程),使用相同的数据库(数据源配置信息一致)。因为数据通过数据库共享,放在一个地方,不需要停机恢复master-slave。这种方式,需要额外的数据库服务器,如果数据库失效了,那么就全失效了
当一个服务器启动后,会使用(第一次则创建)三个表,ACTIVEMQ_ACKS,ACTIVEMQ_LOCK,ACTIVEMQ_MSGS。
ACTIVEMQ_LOCK:
此表用于主从模式锁定,当第一个activemq服务器启动后会锁住此表成为master,第二个activemq服务器启动后试图锁住此表不会成功,成为slave。
ACTIVEMQ_MSGS:
此表用于持久化消息,所有需要持久化的消息会记录在此表中,消息的具体内容是BLOB字段。
3.2.2 基于共享存储(文件)的主从模式
例如SAN存储、NFS文件系统。
3.2.3 基于zookeeper的主从模式
此种模式是5.9版本后新增的。还没有经过大量实践验证。据说通过zookeeper可以很好的解决主从切换的问题。
3.2.4 broker cluster和 master-slave的区别
ActiveMQ有强大而灵活的集群功能,可以做broker的集群,也可以做master-slave方式的集群。前者能在多个broker之前fail-over和 load-balance,但是在某个节点出故障时,可能导致消息丢失;而后者能实时备份消息,和fail-over,但是不能load- balance。
broker cluser的方式,在一个broker上发送的消息可以在其它的broker上收到。当一个broker失效时,客户端可以自动的转到别的broker 上运行,多个broker可以同时提供服务,但是消息只存储在一个broker上,如果那个broker失效了,那么客户端直到它重新启动后才能收到该 broker上的消息,假如很不幸,那个broker的存储介质坏了,那么消息就丢失掉了。
Master-slave方式中,只有master提供服务,slave只是实时的备份master的数据,所以消息不会丢失。当master失效时,slave会自动升为master,客户端会自动转到slave上工作,所以能fail-over。由于只有master提供服务,所以不能将负载分到多个broker上。
3.3 ActiveMQ的消息重发与死信管理(DLQ)
DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。
出现以下情况时,消息会被再投递
1. A transacted session is used and rollback() is called.
2. A transacted session is closed before commit is called.
3. A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.
当一个消息被redelivered超过maximumRedeliveries(缺省为6次,具体设置请参考后面的链接)次数时,会给broker发送一个"Poison ack",这个消息被认为是a poison pill,这时broker会将这个消息发送到DLQ,以便后续处理。
缺省的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。
缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ
可以通过配置文件(activemq.xml)来调整死信发送策略。
3.3.1 不使用缺省的死信队列
缺省所有队列的死信消息都被发送到同一个缺省死信队列(ActiveMQ.DLQ),不便于管理。可以通过individualDeadLetterStrategy或sharedDeadLetterStrategy策略来进行修改。如下:
<broker...>
<destinationPolicy>
<policyMap>
<policyEntries>
<!— 设置所有队列,使用 '>' ,否则用队列名称 -->
<policyEntry queue=">">
<deadLetterStrategy>
<!-- queuePrefix:设置死信队列前缀
useQueueForQueueMessages: 设置使用队列保存死信,还可以设置useQueueForTopicMessages,使用Topic来保存死信
-->
<individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy> ...
</broker>
3.3.2 非持久消息保存到死信队列
<policyEntry queue=">">
<deadLetterStrategy>
<sharedDeadLetterStrategy processNonPersistent="true" />
</deadLetterStrategy>
</policyEntry>
3.3.3 过期消息不保存到死信队列
<policyEntry queue=">">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
3.3.4 持久消息不保存到死信队列
对于过期的,可以通过processExpired属性来控制,对于redelivered的失败的消息,需要通过插件来实现如下:
丢弃所有死信
<beans>
<broker ...>
<plugins>
<discardingDLQBrokerPlugin dropAll="true" dropTemporaryTopics="true" dropTemporaryQueues="true" />
</plugins>
</broker>
</beans>
丢弃指定目的死信
<beans>
<broker ...>
<plugins>
<discardingDLQBrokerPlugin dropOnly="MY.EXAMPLE.TOPIC.29 MY.EXAMPLE.QUEUE.87" reportInterval="1000" />
</plugins>
</broker>
</beans>
4 ActiveMQ传输
一般生产环境池化连接,而且是长连接。消费者也是长连接,服务器推送消息。
org.apache.activemq.pool.PooledConnectionFactory可以池化“连接”、会话、消息生产者。但不会池化消息消费者。消费者与中间件通常是长连接,中间件会推送消息给消费者。消费时,会有一个预取消息多少的配置。所以关闭消费者会比池化归还消费者更高效。会话及消息生产者是不常用资源(不会始终都有消息要发送),其发生不会线性而是比较波动。所以池化生产者更高效,减少创建连接的成本。当有消费者集合时,可以减少消息预取值。
4.1 支持的传输协议:
Activemq主要有12种传输方式,以下是常用的几种传输方式。
4.1.1 TCP Transport
最常用的是TCP Transport,对于公司目前的情况使用这种即可。
配置语法:服务器端需要加上 transport.*前缀,
可参考:http://activemq.apache.org/tcp-transport-reference.html
TCP Transport属性(选项)可以设置心跳机制,保持连接活跃。
服务器端配置URL(in TransportConnector)
tcp://localhost:61616?transport.trace=false&transport.soTimeout=60000
客户端配置URL
tcp://localhost:61616?trace=false&soTimeout=60000
4.1.2 SSL Transport
4.1.3 Multicast Transport
4.2 ActiveMQ自动重连
参考:http://activemq.apache.org/how-do-i-configure-automatic-reconnection.html
如果一个消息代理失败了, ActiveMQ可以使用failover: 协议自动重连到一个可用的消息代理。不仅自动重连,还会恢复所有的临时目标、会话、生产者以及最重要的消费者。所有这些是在JMS(ActiveMQ)客户端安静的发生,而不需要在我们的应用代码里考虑。
可以如下方式配置:
|
failover的具体的选项配置信息可参考:
http://activemq.apache.org/failover-transport-reference.html
一般不需要特别配置选项,默认即可。默认情况下failover会跟踪事务,发生中的事务会被重放。
如果服务器传输连接器配置了 updateClusterClients为真,则客户端只需要知道一个地址,服务器会告诉客户端其它的可用的用于失效转移或平衡的机器地址。
5 ActiveMQ持久化
1、 JDBC存储(from V4)
2、 KahaDB(from V5.3)
3、 LevelDB Store(V5.8)
4、 Replicated LevelDB Store(V5.9)
6 常用命令
启动服务器:bin/activemq start xbean:conf/activemq-oracle-jdbc.xm
关闭服务器:bin/activemq stop
监控日志:tail -f data/activemq.log
7 性能优化
1、基准模式:基于JDBC的主从模式,可以支持持久化,可以支持故障转移;只需两台机器;保障可靠性。
2、对于不需要持久化的消息,可以使用非持久化模式;
3、对于主题(pub-sub),可以通过集群模式,配置NetworkConnector。多机同时服务。
4、可以将主题与队列,分由不同的机器负责。主题与队列在服务器中没有必须的交集。
5、最后,可以改为通过共享存储(例如SAN)支持消息的持久化。及支持主从模式,支持集群模式。
6、极端情况下,一个服务器可以只支持一两个队列或主题。通过横向硬件扩展达到扩容目的。