假设我们有三台服务器:
$ tar -zxvf zookeeper-3.4.9.tar.gz
$ cp -R zoo_sample.cfg /home/zookeeper-3.4.9/conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
关键配置说明:
dataDir:zookeeper数据存放目录
dataLogDir:zookeeper保存日志文件的目录
clientPort:zookeeper端口
tickTime:zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位
initLimit:集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
syncLimit:集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
server.N=YYY:A:B:服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口),这个配置项的书写格式比较特殊。其中N表示服务器编号,YYY表示服务器的IP地址,A为LF通信端口,表示该服务器与集群中的leader交换的信息的端口。B为选举端口,表示选举新 leader时服务器间相互通信的端口(当leader挂掉时,其余服务器会相互通信,选择出新的leader)。一般来说,集群中每个服务器的A端口都 是一样,每个服务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能时A端口和B端口不一样
activemq配置,会按照规划配置3个服务,并统统交由zookeeper进行调度
安装
此处,不在赘述activemq的安装,详见《ActiveMQ教程(一)-安装 》:http://blog.csdn.net/eugeneheen/article/details/55190552
配置核心配置文件/home/apache-activemq-5.9.1-bin/activemq.xml
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.propertiesvalue>
property>
bean>
<bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
lazy-init="false" scope="singleton"
init-method="start" destroy-method="stop">
bean>
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-test" dataDirectory="${activemq.data}">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" >
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000"/>
pendingMessageLimitStrategy>
policyEntry>
policyEntries>
policyMap>
destinationPolicy>
<managementContext>
<managementContext createConnector="false"/>
managementContext>
<persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/kahadb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="192.168.0.201:2181"
zkSessionTimeout="10s"
hostname="192.168.0.201"
zkPath="/home/leveldb-stores"
/>
persistenceAdapter>
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70" />
memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
tempUsage>
systemUsage>
systemUsage>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:51511?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
transportConnectors>
<shutdownHooks>
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
shutdownHooks>
broker>
<import resource="jetty.xml"/>
beans>
配置详细说明:
a、统一设置brokerName
所有activemq服务,必须全部配置brokerName为统一值
"http://activemq.apache.org/schema/core" brokerName="broker-test" dataDirectory="${activemq.data}">
b、配置persistenceAdapter
persistenceAdapter设置持久化方式,主要有三种方式:kahaDB(默认方式)、数据库持久化、levelDB(activemq v5.9.0提供支持)
<persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/kahadb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="192.168.0.201:2181"
zkSessionTimeout="10s"
hostname="192.168.0.201"
zkPath="/home/leveldb-stores"
/>
persistenceAdapter>
directory:存储数据的路径
replicas:集群中的节点数,以(replicas/2)+1公式表示集群中至少要正常运行的服务数量】, 3台集群那么允许1台宕机, 另外两台要正常运行
bind:当这个服务节点成为Master, 它会绑定配置好的地址和端口来履行主从复制协议(配置为各activemq服务所在的ip,保证端口不同即可)
zkAddress:zookeeper的ip和port,如果是zookeeper集群以”,”隔开
zkSessionTimeout:zookeeper回话的超时时间
zkPassword:zookeeper服务平台的密码
hostname:activemq服务部署机器的ip
zkPath:zookeeper选举信息交换的存贮路径
sync:认为消息被消费完成前, 同步信息所存贮的策略, 如果有多种策略用逗号隔开, ActiveMQ会选择较强的策略(local_mem, local_disk则肯定选择存贮在本地硬盘)
c、配置transportConnector消息端口
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:51511?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
transportConnectors>
保证各activemq服务的消息端口不一致即可,比如三台activemq服务端口分别配置为:51511、51512、51513
id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
property属性port的value值改为你想配置的端口
$ {zookeeper_home}/bin/zkServer.sh start
$ {activemq_home}/bin/active start
zookeeper的策略, 从三台activemq服务器选一台运行, 其他两台等待运行, 只是做数据上的主从同步。
所以, 启动ZooKeeper服务器和ActiveMQ服务器后, 访问http://192.168.0.200.1:8161/admin/ 、 http://192.168.0.201:8161/admin/、 http://192.168.0.202:8161/admin/ 只会有一个成功
使用Spring管理Bean,配置如下:
id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="userName" value="admin" />
<property name="password" value="admin" />
<property name="brokerURL" value="failover:(tcp://192.168.0.201:51511,tcp://192.168.0.201:51512,tcp://192.168.0.201:51513)?initialReconnectDelay=100" />