本文写于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.1 、192.168.1.2 、192.168.1.3 |
activemq服务器 | 192.168.1.4 、192.168.1.5 、192.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>
配置项说明:
属性名 | 默认值 | 备注 |
---|---|---|
replicas | 3 | Cluster的节点数,只有大于等于(replicas/2)+1个节点存活时,Cluster才能提供服务 |
securityToken | 各个副本节点复制数据的安全令牌,所有副本节点必须保持一致 | |
zkAddress | 127.0.0.1:28181 | zookeeper服务列表,使用逗号分割 |
zkPassword | 连接zookeeper服务器的密码 | |
zkPath | /default | zookeeper上存放MQServer主从选举信息的节点位置 |
zkSesssionTmeout | 2s | zookeeper探测MQ节点失效的周期 |
sync | quorum_mem | MQ节点间的数据同步策略。可选项如下:local_mem、local_disk、remote_mem、remote_disk、quorum_mem、quorum_disk;建议:quorum_mem |
bind | tcp://0.0.0.0:61619 | 当此节点变成主节点时,在绑定的地址与端口上想其他副本发送消息。配置为:tcp://0.0.0.0:0时,会自动探测端口绑定 |
hostname | 此节点的主机名,不设置时会自动检测; | |
weight | 1 | 此节点成为主节点的选举权重,值越大越可能成为主节点 |
更多配置说明请参考: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
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
开启JMX远程监控时,出现jmx.password文件权限太大的异常
chmod 400 apache-activemq-5.9.0/conf/jmx.password
配置jolokia后,启动出线Servlet异常?
在activemq 5.9.1版本中,注释掉
activemq.xml
中的<import resource="jetty.xml"/>
解决;