实战分享:activemq 在灾备双活建设中的研究

作者简介:刘韬,在中间件领域有多年的实战经验,精通 WebLogic server,Websphere,Jboss,Tomcat,tuxedo,mq,osb等多种中间件技术,对中间件的故障处理、性能优化、升级迁移等需求积累了丰富经验。

概述

activemq 是业界非常流行的、功能强大的、开源消息中间件。以快速、支持多种跨语言客户端和协议著称;完全支持 JMS 1.1 and J2EE 1.4。在各个行业中有大量的应用案例。

由于 activemq 承担着消息服务的重要角色,在这篇文章中我们重点讲述在灾备双活建设中 activemq 设计、规划、部署。

随着各个行业对 IT 灾备建设的重视,越来越多的企业、单位正在筹备、实施 IT 灾备建设。由于早期的建设并没有充分考虑多数据中心下容灾方案,势必在新的多数据中心环境需要做一番整体架构的调整、重建。

本文是对目前业界流行的消费服务产品 active 在灾备双活建设的一些探讨,希望起到抛砖引玉的效果。

目标

灾备双活建设最完美的架构设计:在同城、异地 2 个数据中心,在最极端情况下,例如单数据中心垮掉情况下,保证消息零丢失,支持 7*24 服务要求。

需求描述

机房故障

1) 现象描述

消息队列中间件部署在 A、B 两个不同的机房中,客户端根据负载的策略转发到对应机房的消息中间件,其中 A 或者 B 机房因为断电或者灾难等因素出现故障,无法继续提供服务。此时仅有一个机房正常。

2) 现象图示

3) 服务影响

正常情况下,对于客户端的连接平均分布在两个机房中,出现单个机房故障后,连接在故障机房中的连接会断开,正在执行未提交的事务将会回滚,对于发起的新连接不受任何影响,依然可以通过配置的负载策略访问正常机房中的消息中间件服务。

4) 故障恢复

当机房恢复正常后,启动消息中间件服务,此时,只要主机、网络恢复正常,消息中间件服务就可以启动成功。这时,AB 机房按照负载策略继续处理连接,最终使得每个机房的中间件连接数无限接近。

活动预告

云南的朋友们有福利了,云和恩墨大讲堂-云南站,将于 8.31(下周五)在昆明举办。本次活动邀请到了 ACOUG 联合创始人,Oracle ACE 总监,云和恩墨创始人盖国强先生、云和恩墨西区交付总监郭耀龙先生。演讲议题涵盖 Oracle 18c 的新特性解析和 DBA 的未来、 Oracle 数据库故障诊断、金融行业 PaaS 云数据库平台解决方案等。欢迎各位数据库爱好者报名参与!

服务器DOWN

1) 现象描述

在运行的消息中间件集群架构中,存在 N 个主机,其中任意 N-2 个主机 DOWN 机,不具备服务提供能力,仅剩余大于 1 个主机存活可以提供服务的场景。

2) 现象图示

3) 服务影响

主机 DOWN 掉后,已经连接在该主机消息中间件上的连接会断开,对应的事务会回滚,新的连接不受到影响。

4) 故障恢复

当主机故障处理后,启动故障主机,并启动消息中间件服务。根据负载均衡算法,客户端连接会重新分配到该主机上的节点。

消息中间件节点崩溃

1) 现象描述

在运行的消息中间件集群架构中,存在 N 个节点,其中任意 N-2 个节点崩溃,不具备服务提供能力,仅剩余大于1个节点存活可以提供服务的场景。

2) 现象图示

3) 服务影响

当消息中间件节点崩溃后,已经连接在该主机消息中间件上的连接会断开,对应的事务会回滚,新的连接不受到影响。

4) 故障恢复

当消息队列节点故障处理后,启动消息中间件服务。根据负载均衡算法,客户端连接会重新分配到该节点。

架构设计

架构设计要点

● 采用 activemq 的何种架构来实现上述需求? 采用 主从+Broker-Cluster 方式来实现,主从架构实现了 HA(高可用)功能,借用 zookeeper 的选举投票功能,保证“过半即可用”,所以推荐的 HA 架构的节点数为单数,至少 3 个节点,任何时候垮掉一个节点都不影响正常使用。 同时结合 Broker-Cluster,Broker-Cluster 的部署方式可以解决负载均衡和分布式问题,因为单一主从方式无法解决负载均衡的问题。 ● 如何保证未消费消息在各个节点间的同步? 采用 leveldb(LevelDB 是 Google 开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能)实现各个节点间的同步写,保证数据在同一个 Broker-Cluster 组下复制,以 3 个节点为例,同一条堆积消息,在 3个 节点保持同步,在最极端情况下,即使2个节点的数据文件丢失,也能防止数据丢失。 ● 如何保证在灾难情况下,消息服务仍然可以正常提供服务?例如考虑最极端情况下,单边数据中心宕机? 采用 2 套主从、2套 Broker-Cluster,并且保证 2 个数据中心各包含一套主从的2个节点,如下图所示,cluster1 的 2 个节点在 B 中心,cluster2 的 2 个节点在 A 中心,即使 A、B 整个数据中心发生灾难,都不影响 jms 服务正常运行。 ● 保证在各种灾难场景都实现了 7*24 和消息零丢失吗? 是的,只要保证一个 cluster 下的 2 个节点可用的情况下,不管在任何一种组合下,jms 服务都是可用的。 ● 客户端如何来调用集群的 jms 地址

connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "failover:(tcp://192.168.40.140:61616,tcp://192.168.40.140:61617,tcp://192.168.40.141:61619,tcp://192.168.40.141:61620,tcp://192.168.40.141:61621,tcp://192.168.40.140:61618)");

如上例子,activemq 根据随机策略,调用任一可用的节点。

架构图示

● 架构示例图如下:

◆ 哪一个节点是 master,没有要求,那个先启动那个就可能成为 master。

◆ master 节点是当前提供服务的节点。

原创:刘韬。

投稿:有投稿意向技术人请在公众号对话框留言。

转载:意向文章下方留言。

本文分享自微信公众号 - 数据和云(OraNews)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏緣來來來

Django配置缓存机制

Django 官方关于cache的介绍:https://docs.djangoproject.com/en/dev/topics/cache/

18510
来自专栏跟着阿笨一起玩NET

如何修改SQL Server 2008数据库服务器名称

 但是在配置复制的时候却出了问题,我在MS-ZY上配置了数据库分发,配置成功,接下来想在MS-ZY2上配置订阅,可是却报错。于是我就试一下在MS-ZY2上配置分...

1.6K20
来自专栏緣來來來

安卓基础干货(三):安卓数据库的学习

title: 安卓基础干货(三):安卓数据库的学习 copyright: true categories: 安卓基础干货 date: 2018-01-10 19...

13220
来自专栏跟着阿笨一起玩NET

采用左右值编码来存储无限分级树形结构的数据库表设计

该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由...

67910
来自专栏依乐祝

[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

文章地址: https://www.cnblogs.com/yilezhu/p/9276565.html

29010
来自专栏緣來來來

Django添加sitemap功能

1、启用sitemap 在django的settings.py的INSTALLED_APPS中添加

15310
来自专栏黄Java的地盘

IndexedDB使用与出坑指南

本文通过对IndexedDB的使用方法和使用场景进行相关介绍,对常见的问题进行解答。

3.5K20
来自专栏沈唁志

2018年韩创科技旗下我图网PHP工程师面试题分享

4. 一张采用Innodb的User表,其中id为主键,name为普通索引,试从索引的数据结构角度分析,以下两条语句(均返回一条记录)在检索过程中有哪些区别

20620
来自专栏跟着阿笨一起玩NET

DBHelper数据库操作类(一)

可以参考的:http://www.oschina.net/code/snippet_4946_748

1K10
来自专栏跟着阿笨一起玩NET

浅谈数据库设计技巧(上)(转)

转一篇他人写的数据库设计技巧,感觉也不一定都正确,开拓一下思路吧。 说到数据库,我认为不能不先谈数据结构。1996年,在我初入大学学习计算机...

28310

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励