ActiveMQ 高可用配置(LevelDB)

本文写于2017年8月14日

ActiveMQ的LevelDB方案是在5.9.0版本开始引入,使用zookeeper来决定当前Replicas中的Master与Slave,并不采用zookeeper来存储MQ数据;其工作原理是生产者(或消费者)向AMQ Broker发送(或消费)消息时,Master将消息内容同步到Slave之后再响应生产者(或消费者)结果,同步的方式有多种,在下面详细描述。

环境准备

这种配置方案能够实现n/2 + 1的容错率,也就是三台服务器允许挂一台,五台能宕掉2台依次类推。

服务机器IP
zookeeper服务器192.168.1.1192.168.1.2192.168.1.3
activemq服务器192.168.1.4192.168.1.5192.168.1.6

搭建ZooKeeper

请参考:ZooKeeper管理员指南——部署与管理ZooKeeper

下载activemq

 curl -O http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.9.0/apache-activemq-5.9.0-bin.tar.gz

修改activemq配置

apache-activemq-5.9.0/conf/activemq.xml找到这种字样的配置项目:

<persistenceAdapter>
    <kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

默认情况下activemq是走kahadb存储的,这里替换为:

<persistenceAdapter>
    <replicatedLevelDB  directory="${activemq.data}/leveldb"
        replicas="3"
        bind="tcp://0.0.0.0:0"
        zkAddress="192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”  
        hostname="192.168.1.193"
        sync=“quorum_mem"
        zkPath="/activemq/leveldb-stores”
        zkSessionTimeout="15s"
    />
</persistenceAdapter>

配置项说明:

属性名默认值备注
replicas3Cluster的节点数,只有大于等于(replicas/2)+1个节点存活时,Cluster才能提供服务
securityToken各个副本节点复制数据的安全令牌,所有副本节点必须保持一致
zkAddress127.0.0.1:28181zookeeper服务列表,使用逗号分割
zkPassword连接zookeeper服务器的密码
zkPath/defaultzookeeper上存放MQServer主从选举信息的节点位置
zkSesssionTmeout2szookeeper探测MQ节点失效的周期
syncquorum_memMQ节点间的数据同步策略。可选项如下:local_mem、local_disk、remote_mem、remote_disk、quorum_mem、quorum_disk;建议:quorum_mem
bindtcp://0.0.0.0:61619当此节点变成主节点时,在绑定的地址与端口上想其他副本发送消息。配置为:tcp://0.0.0.0:0时,会自动探测端口绑定
hostname此节点的主机名,不设置时会自动检测;
weight1此节点成为主节点的选举权重,值越大越可能成为主节点

更多配置说明请参考:http://activemq.apache.org/replicated-leveldb-store.html

剩下的就是启动服务了

首先开启三台服务器上的zookeeper服务:

/opt/zookeeper-3.4.5/bin/zkServer.sh start

然后分别开启三台服务器上的activemq服务:

/opt/apache-activemq-5.9.0/bin/activemq start  #使用console可以在控制台启动,方便日志观察

好了,基本没什么问题了。然后就开始访问:http://192.168.1.1:8161 或者 http://192.168.1.2:8161 或者 http://192.168.1.3:8161, 这三个链接看哪个能访问,哪个消息服务器则表示存活提供服务。

测试

关掉1、2、3其中任何一台,经过测试能够正常提供服务,客户端会自动切换连接,达到预期目的。

客户端连接使用failover方案

failover:(tcp://192.168.1.1:61616,tcp://192.168.1.2:61616,tcp://192.168.1.3:61616)?randomize=false&timeout=5000&initialReconnectDelay=200&reconnectDelayExponent=2&maxReconnectDelay=3000&maxReconnectAttempts=5&startupMaxReconnectAttempts=5

配置jolokia

在activemq的启动参数中,添加:

ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -javaagent:/home/amq/apache-activemq-5.9.1/lib/jolokia-jvm-1.2.0-agent.jar=port=8160,host=0.0.0.0"

更多参数选项请参考:http://www.jolokia.org/reference/html/agents.html#agents-jvm

配置hawtio管理台

QA

  1. activemq启动出现异常,没有选举出主机。

    很有可能hostname配置不对,建议·hostname·配置为本机内网IP,保障能与其他副本集的机器通信顺畅。 如果使用主机名的,最好在/etc/hosts中配置好其他副本集的主机路由关系,譬如:

     192.168.1.1   lin-1.1-mq-server
     192.168.1.2   lin-1.2-mq-server
     192.168.1.3   lin-1.3-mq-server
    
  2. 开启JMX远程监控时,出现jmx.password文件权限太大的异常

    chmod 400 apache-activemq-5.9.0/conf/jmx.password

  3. 配置jolokia后,启动出线Servlet异常?

    在activemq 5.9.1版本中,注释掉activemq.xml中的<import resource="jetty.xml"/>解决;


   转载规则


《ActiveMQ 高可用配置(LevelDB)》 Angus_Lu 采用 知识共享署名 4.0 国际许可协议 进行许可。
 本篇
ActiveMQ 高可用配置(LevelDB) ActiveMQ 高可用配置(LevelDB)
本文写于2017年8月14日ActiveMQ的LevelDB方案是在5.9.0版本开始引入,使用zookeeper来决定当前Replicas中的Master与Slave,并不采用zookeeper来存储MQ数据;其工作原理是生产者(或消费者
2019-09-10 15:19:40
下一篇 
ActiveMQ 使用进阶 ActiveMQ 使用进阶
本文写于2017年7月6日Java消息服务回顾(JMS)七大组件两种模型点对点或队列模型只有一个消费者将获得消息生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。每一个成功处理的消息都由接收者签收发
2019-09-10 14:22:37
  目录