您的位置:首页 > 运维架构 > 网站架构

ActiveMQ高可用架构(zookeeper+levelDB)

2016-11-14 10:03 281 查看
从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式增加了基于ZooKeeper + LevelDB的 Master-Slave实现方式,其他两种方式文件共享和数据库共享依然存在。

http://activemq.apache.org/clustering.html

http://activemq.apache.org/masterslave.html

http://activemq.apache.org/replicated-leveldb-store.html

基于可复制的 LevelDB

LevelDB 是 Google开发的一套用于持久化数据的高性能类库。LevelDB并不是一种服务,用户需要自行实现Server。是单进程的服务,能够处理十亿级别规模Key-Value 型数据,占用内存小。

在ActiveMQ中,基于可复制的LevelDB使用Apache的zookeeper机制从一组broker节点中选举出一个master主节点来配置LevelDB存储,然后将所有slave从节点通过复制master主节点的更新来进行同步。

基于可复制的LevelDB存储使用与LevelDB存储相同的数据文件,因此可以在任何时候在复制和非复制之间切换broker配置。

集群原理图:



高可用的原理:首先,broker启动时,它向ZooKeeper(集群)注册自己的信息(brokerName,消息日志的版本戳等),如果此时group中没有其他broker实例,会阻塞初始化过程,等待足够多的broker加入group,当broker的数量达到“replicas/2+1”时,zookeeper将根据”消息日志的版本戳“、”权重“的大小决定选举出一个master,即”版本戳“越大(数据最新)、权重越高的broker优先成为master,只有成为master的broker 可以提供服务,其他的broker 处于待机状态,被视为slave。

当一个broker成为master时,它会向zookeeper注册自己的sync地址信息,slave根据sync地址与master建立连接,并同步消息文件(download)。当足够多的slave数据同步结束后,master将初始化transportConnector,此后client将可以与master进行数据交互。

Master-slaves集群中,所有的broker必须具有相同的brokerName,作为group域来限定集群的成员,只有相同的brokerName才会被认定为同一个集群,brokeId可以不同,仅作为描述信息。

”replicas“参数表示消息最多可以备份在几个broker实例上,默认为3,只有当”replicas/2+1“个broker存活时(包含master),集群才有效,才会选举master和备份消息,replicas必须>=2。client发送给master的持久化消息,master首先保存在本地,然后立即同步(sync)给选定的(replicas/2+1-1)个slaves,只有当这些节点也同步成功之后,消息才算交互结束,对于剩下的节点,master采用异步(async)的方式转发。这种设计要求,可以保证集群中消息的可靠性,只有当(replicas/2 + 1)个节点物理故障,才会有丢失消息的风险。通常replicas为3,这要求开发者需要至少部署3个broker实例。如果replicas过大,会严重影响master的吞吐能力,因为它在sync消息的过程中会消耗太多的时间。

如果集群故障,在重启broker实例时,建议首先查看每个broker中查看LevelDB日志文件的版本戳(文件名为16进制数字),并优先启动版本戳较大的实例。(因为replicas多数派的约束,随机重启也不会有太大的问题)。但是不得随意调小replicas的值,如果你确实需要修改,那就首先关闭集群,一定优先启动版本戳最大的broker。

通常zookeeper集群至少需要3个实例,才能保证zookeeper本身的高可用性,不要接入负载过高的zookeeper集群,以免给消息服务引入不稳定因素。

配置方式:

<broker brokerName="broker" ... >
...
<persistenceAdapter>
<replicatedLevelDB
directory="activemq-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="zoo1.example.org:2181,zoo2.example.org:2181,zoo3.example.org:2181"
zkPassword="password"
zkPath="/activemq/leveldb-stores"
hostname="broker1.example.org"
/>
</persistenceAdapter>
...
</broker>


配置属性:





bind属性表示当此broker实例成为master时,开启一个socket地址,此后slave可以通过此地址与其同步数据。

path下用来存储group中所有broker的注册信息,此值在group中所有的broker上都要一样。

hostname用来描述当前机器的核心信息,通常为机器IP。

对于client端而言,仍然需要使用failover协议,且协议中需要包含group中所有broker的链接地址。

failover://(tcp://localhost1:61616,tcp://localhost2:61616.tcp://locahost3:61616)?randomize=false
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐