4 种高可用 RocketMQ 集群搭建方案!
背景
笔者所在的业务线,最初化分为三个服务,由于业务初期业务复杂度相对简单,三个业务服务都能很好的独立完成业务功能。
随着产品迭代,业务功能越来越多后慢慢也要面对高并发、业务解耦、分布式事务等问题,所以经过团队内部讨论,引入 RocketMQ 消息中间件来更好的处理业务。
由于公司内部业务线部署相互独立,我们业务线对引入 RocketMQ 的需求也比较急切,所以打算自己搭建一套高可用的 RocketMQ 集群,同时对于自建的 RocketMQ 集群需要如下特性:
- 高可用
- 高并发
- 可伸缩
- 海量消息
命名服务(NameServer)
首先第一步要让 NameServer 高可用,前期规划了三台机器部署 NamseServer 这样可以充分保证可用性,即使两台机器挂掉也能保证集群的正常使用,只要有一个 NamseServer 还在运行,就能保证 RocketMQ 系统的稳定性。
NameServer 的设计是相互的独立的,任何一台 NameServer 都可以的独立运行,跟其他机器没有任何通信。
每台 NameServer 都会有完整的集群路由信息,包括所有的 Broker 节点的信息,我们的数据信息等等。所以只要任何一台 NamseServer 存活下来,就可以保存 RocketMQ 信息的正常运行,不会出现故障。
Broker 集群部署架构
开始部署 RocketMQ 之前,我们也做过一些功课,对现在 RocketMQ 支持的集群方案做了一些整理,目前 RocketMQ 支持的集群部署方案有以下4种:
- 多Master模式:一个集群无Slave,全是Master,例如2个Master或者3个Master
- 多Master多Slave模式-异步复制:每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级)
- 多Master多Slave模式-同步双写:每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功
- Dledger部署:每个Master配置二个 Slave 组成 Dledger Group,可以有多个 Dledger Group,由 Dledger 实现 Master 选举
多 Master 模式
一个 RocketMQ 集群中所有的节点都是 Master 节点,每个 Master 节点没有 Slave 节点。
这种模式的优缺点如下:
- 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
- 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
多 Master 多 Salve - 异步复制 模式
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级)
这种模式的优缺点如下:
- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
- 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
多 Master 多 Salve - 同步双写 模式
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功
这种模式的优缺点如下:
- 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
- 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
Dledger 模式
RocketMQ 4.5 以前的版本大多都是采用 Master-Slave 架构来部署,能在一定程度上保证数据的不丢失,也能保证一定的可用性。
但是那种方式 的缺陷很明显,最大的问题就是当 Master Broker 挂了之后 ,没办法让 Slave Broker 自动 切换为新的 Master Broker,需要手动更改配置将 Slave Broker 设置为 Master Broker,以及重启机器,这个非常麻烦。
在手式运维的期间,可能会导致系统的不可用。
使用 Dledger 技术要求至少由三个 Broker 组成 ,一个 Master 和两个 Slave,这样三个 Broker 就可以组成一个 Group ,也就是三个 Broker 可以分组来运行。一但 Master 宕机,Dledger 就可以从剩下的两个 Broker 中选举一个 Master 继续对外提供服务。
整体架构:高可用、高并发、可伸缩 、海量消息
经过上面4种集群方案的比较,最终确定使用 Dledger 方式最终的逻辑部署图如下:
上图的虚线框表示一个 Dledger Group。
高可用
三个 NameServer 极端情况下,确保集群的可用性,任何两个 NameServer 挂掉也不会影响信息的整体使用。
在上图中每个 Master Broker 都有两个 Slave Broker,这样可以保证可用性,如在同一个 Dledger Group 中 Master Broker 宕机后,Dledger 会去行投票将剩下的节点晋升为 Master Broker。
高并发
假设某个Topic的每秒十万消息的写入, 可以增加 Master Broker 然后十万消息的写入会分别分配到不同的 Master Broker ,如有5台 Master Broker 那每个 Broker 就会承载2万的消息写入。
可伸缩
如果消息数量增大,需要存储更多的数量和最高的并发,完全可以增加 Broker ,这样可以线性扩展集群。
海量消息
数据都是分布式存储的,每个Topic的数据都会分布在不同的 Broker 中,如果需要存储更多的数据,只需要增加 Master Broker 就可以了。
欢迎关注公众号:架构文摘,获得独家整理120G的免费学习资源助力你的架构师学习之路!
公众号后台回复
arch028
获取资料:
4 种高可用 RocketMQ 集群搭建方案!的更多相关文章
- Hadoop-HA(高可用)集群搭建
Hadoop-HA集群搭建 一.基础准备工作 1.准备好5台Linux系统虚拟服务器或物理服务器 我这里演示采用虚拟服务器搭建Hadoop-HA集群,各自功能分配如下: NameNode节点:vt-s ...
- 高可用k8s集群搭建
虚拟机选择 Win10 Hyper-V 总体架构 三个master,三个node master的组件 etcd kube-apiserver kube-controller-manager kube- ...
- 高可用mysql集群搭建
对web系统来说,瓶颈大多在数据库和磁盘IO上面,而不是服务器的计算能力.对于系统伸缩性我们一般有2种解决方案,scale-up(纵向扩展)和scale-out(横向扩展).前者如扩内存,增加单机性能 ...
- ElasticSearch 高可用分布式集群搭建,与PHP多线程测试
方案: 使用HAproxy:当其中一台ElasticSearch Master宕掉时,ElasticSearch集群会自动将运行正常的节点提升为Master,但HAproxy不会将失败的请求重新分发到 ...
- activeMq-2 高可用以及集群搭建
Activemq 的集群方法可以有多种实现方式,我们这里使用zookeeper来实现 要搭建集群,请确保已经搭建好zookeeper环境.这里不再演示. 基本原理: 使用ZooKeeper(集群)注册 ...
- Apache tomcat高可用web集群搭建过程配置记录
说明,本文仅作为个人搭建配置保存,问题处理没有一一列出,过程也未见详尽,有问题的朋友可以直接留言给我,会一一回复,谢谢. 小目标: 支持故障转移(或主备,扩展性不佳),保证故障转移后,对前端用户透明, ...
- 搭建高可用mongodb集群(三)—— 深入副本集内部机制
在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...
- 搭建高可用mongodb集群(一)——配置mongodb
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...
- 搭建高可用mongodb集群—— 分片
从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出 ...
随机推荐
- K8S使用群晖DS218+的NFS
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 从小白到 6 个 offer,我究竟是怎么刷题的?
最近自习室里又兴起了一阵刷题潮,大家相约刷题~ 今天和大家系统分享下我去年转行时的一个刷题过程和方法,希望对你有所帮助. 首先介绍下我的编程基础,我学的是金融工程专业,硕士时学过 C++ 的课,这也是 ...
- 2018-12-7 CSAPP及C++
今天虽然起床迟,但从结果上来看,学习效率还算不赖.从这几天的状况来看,为记录晚上上床后的学习内容,决定把在床上的学习内容算在后一天的学习中.那么从现在开始就可以协商英语的半个小时100个单词了. 英语 ...
- 关于Java中泛型、反射和注解的扫盲篇
泛型 泛型概念 泛型是在JDK1.5之后引入的,旨在让我们写出更加通用化,更加灵活的代码.通用化的手段在于让数据类型变得参数化,定义泛型时,对应的数据类型是不确定的,泛型方法被调用时,会指定具体类 ...
- 【Kata Daily 191012】Find numbers which are divisible by given number
题目: Complete the function which takes two arguments and returns all numbers which are divisible by t ...
- LR逻辑回归附代码
参考https://zhuanlan.zhihu.com/p/74874291 import pandas as pdpd.set_option('display.max_columns', 500) ...
- Spider--补充_None_global_urlparse
# 知识点补充: # 1) None: a = None if a: print("非None") else: print("None") if a is no ...
- 企业网络拓扑MSTP功能实例(二)
组网图形 MSTP简介 以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路.但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量 ...
- 为什么人们总是认为epoll 效率比select高!!!!!!
今天看公司代码时,发现代码里面使用的事清一色的代码使用epoll, 所以就得说一说了:宏观看一看epoll 和select的实现: select原理概述 调用select时,会发生以下事情: 从用户空 ...
- python之《tkinter》
1.创建窗口 import tkinter as tk window = tk.Tk() window.title('my window') window.geometry('300x100') -- ...