作者 | RocketMQ社区
来源|阿里巴巴云原生公众号

“童年的雨天最是泥泞,却是记忆里最干净的曾经。凛冬散尽,星河长明,新的一年,万事顺遂,再见,2020!”

走过这个岁末,万众期待的 Apache RocketMQ 4.8.0 终于发布了,在这个版本中社区对 RocketMQ 完成大量的优化和问题修复。更重要的是,该版本从性能、稳定性、功能三个方面大幅度提升 DLedger 模式能力。

DLedger 是 OpenMessaging 中一个基于 Raft 的 CommitLog 存储库实现,从 RocketMQ 4.5.0 版本开始,RocketMQ 引入 DLedger 模式来解决了 Broker 组内自动故障转移的问题,而在 4.8.0 版本中社区也对 RocketMQ DLedger 模式进行了全面升级。

性能升级

  • 异步化 pipeline 模式

RocketMQ 4.7.0 重新升级了同步双写的架构,利用异步化 pipeline 模式大幅提升了同步双写的性能。在 RocketMQ 4.8.0 中,社区将这一改进应用到 DLedger 模式中, 下图展示了 DLedger 模式下 broker 处理发送消息的过程。在原本的架构中, SendMessageProcessor 线程对每一个消息的处理,都需要等待多数派复制成功确认,才会返回给客户端,而在新版本中,利用 CompletableFuture 对线程处理消息的过程进行异步化改造,不再等待多数派的确认即可对下一个请求进行处理,Ack 操作由其他线程确认之后再进行结果处理并返回给客户端。通过对复制过程进行切分并将其流水线化,减少线程的长时间等待,充分利用 CPU,从而大幅提高吞吐量。

  • 批量日志复制

Batch 一直是性能优化的重要方式,在新版本中,可以通过设置 isEnableBatchPush=true 来开启 DLedger 模式的批量复制。通过将多条数据聚合在一个包中进行发送,可以降低收发包的个数,从而降低系统调用和上下文的切换。在数据发送压力比较大,并且可能达到系统收发包瓶颈的情况下,批量复制能显著提高吞吐量。值得注意的是,DLedger 模式下的批量复制并不会对单个包进行延时的攒批处理,因此不会影响单个消息的发送时延。

除了上述的性能优化,社区还对 DLedger 模式下影响性能的锁、缓存等做了数项性能优化,使 DLedger 模式下的性能提升数倍。

稳定性升级

为了验证和测试 Dledger 模式的可靠性,除了本地对 DLedger 模式进行了各种各样的测试,社区利用 OpenMessaging-Chaos 框架对 RocketMQ DLedger 模式进行了大量 Chaos 测试。OpenMessaging-Chaos 是一个利用故障注入来验证各种消息平台一致性和高可用性的测试框架,在 OpenMessaging-Chaos 的测试中,客户端并发地向待测试集群发送和接收消息,中间会间隔性地对集群进行故障注入,最后给出测试结果,包括是否丢消息,是否有重复消息,集群平均故障恢复时间等。利用 OpenMessaging-Chaos,我们验证了 DLedger 模式在以下故障注入场景下的表现:

  • random-partition(fixed-partition)故障随机挑选节点进行网络隔离,模拟常见的对称网络分区。

  • random-loss 故障随机挑选节点并对这些节点接收和发送的网络包进行按比例丢弃,模拟一些节点网络较差的情况。

  • random-kill(minor-kill、major-kill、fixed-kill)故障模拟常见的进程崩溃情况。

  • random-suspend(minor-suspend、major-suspend、fixed-suspend)故障模拟一些慢节点的情况,比如发生 Full GC、OOM 等。

  • bridge 和 partition-majorities-ring 故障模拟比较极端的非对称网络分区。

以 minor-kill 故障注入为例,我们部署 5 个节点组成一组 DLedger 模式的 RocketMQ broker 进行 Chaos 测试。minor-kill 故障注入会随机挑选集群中少数节点进程杀死,由于杀死少数节点,即使集群不可用也能在一段时间内恢复,方便测试集群平均故障恢复时间。

测试过程中我们设置四个客户端并发向 RocketMQ DLedger 集群发送和接收消息,故障注入时间间隔为 100s,即 100s 正常运行,100s 故障注入,一直循环,整个阶段一共持续 2400s。测试结束后,OpenMessaging-Chaos 会给出测试结果和时延图。下图展示了整个测试过程中入队操作的时延情况。

图中纵坐标是是时延,横坐标是测试时间,绿色框表示数据发送成功,红色框表示数据发送失败,蓝色框表示不确定是否数据添加成功,灰色部分表示故障注入的时间段。可以看出一些故障注入时间段造成了集群短暂的不可用,一些故障时间段则没有,这是合理的。由于是随机网络分区,所以只有杀死的少数节点包含 leader 节点时才会造成集群重新选举,但即使造成集群重新选举, DLedger 模式在一段时间后也会恢复可用性。

下图是测试结束后 OpenMessaging-Chaos 给出的统计结果,可以看到一共成功发送了 11W 个数据,没有数据丢失,这表明即使在故障下,RocketMQ DLedger 模式仍旧满足 At Least Once 的投递语义。此外,RTOTestResult 表明 12 次故障时间段一共发生了 3 次集群不可用的情况(与上述时延图一致),但每次集群都能在 30 秒以内恢复,平均故障恢复时间在 22 秒左右。

在 OpenMessaging Chaos 测试过程中,我们发现了 DLedger 模式存在的数个隐性问题并进行了修复,提高了 DLedger 模式下对进程异常崩溃、慢节点、对称/非对称网络分区、网络丢包的容错能力,也进一步验证了 DLedger 模式的可靠性。

功能升级

  • DLedger 模式支持 Preferred Leader

在旧版本中一组 Broker 中选谁作为 Leader 完全是随机的。但是在新版中我们可以通过配置 preferredLeaderId 来指定优先选举某个节点为 Leader,如下图所示,通过在三个机房部署 DLedger 模式的 broker 组,利用 preferred leader 可以更好的实现机房对齐的功能,图中 DC1 中服务更好,我们可以优先选择在 DC1 中部署 Master。此外,利用 preferred leader 还可以更好实现 DLedger 集群混部,从而充分利用机器资源。

  • DLedger 模式支持批量消息

从 RocketMQ 4.8.0 开始,DLedger 模式支持批量消息发送,从而在消息类型的支持上完全与 Master-Slave 部署形态保持一致。

除了对 DLedger 模式的大量优化,本次 RocketMQ 版本一共包含 Improvement 25 个,Bug Fix 11 个,文档和代码格式优化 16 个。据不完全统计,这些贡献来自近 40 位 RocketMQ 社区的 Contributor,感谢大家的积极参与。也非常期待有更多的用户、厂商、开发者参与到 RocketMQ 建设中来,加入 Apache RocketMQ 社区,永远不会太迟!

再见 2020!Apache RocketMQ 发布 4.8.0,DLedger 模式全面提升!相关推荐

  1. Apache RocketMQ 发布 v4.4.0,新添权限控制和消息轨迹特性

    近日,Apache RocketMQ 发布了 v4.4.0,该版本主要增加了权限控制(ACL)和消息轨迹(Message Trace)两大特性,并做了8项优化,和修复了4处bug. 权限控制(ACL) ...

  2. Apache RocketMQ 4.8.0,DLedger 模式全面提升!

    简介:"童年的雨天最是泥泞,却是记忆里最干净的曾经.凛冬散尽,星河长明,新的一年,万事顺遂,再见,2020!" 作者 | RocketMQ社区 来源|阿里巴巴云原生公众号 &quo ...

  3. 全面升级 —— Apache RocketMQ 5.0 SDK 的新面貌

    简介:长久以来,RocketMQ 易于部署.高性能.高可用的架构,支撑了数十年来集团内外海量的业务场景.时至今日,为了迎接如今云原生时代的新挑战,我们重磅推出了 RocketMQ 5.0 新架构. 作 ...

  4. Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink

    点击蓝字 关注我们 2021 年 12 月 9 日,SeaTunnel (原名 Waterdrop) 进入 Apache 孵化器.4 个月后的 2022 年 3 月 18 日,其首个 Apache 版 ...

  5. Apache RocketMQ 4.0.0 - linux安装与配置笔记

    https://my.oschina.net/langxSpirit/blog/910177 摘要: 官网的Quick Start太简陋,很多坑在里面,这里整理记录一下. 一.安装与配置 1.下载 官 ...

  6. Apache Flink ML 2.2.0 发布公告

    来源 | Apache Flink 官方博客 翻译 | 林东 Apache Flink 社区很荣幸地宣布 Apache Flink ML 2.2.0 版本正式发布!本次发布的版本重点添加了 Flink ...

  7. Apache RocketMQ在我司的最佳实践--智慧政务场景下的分布式消息与分布式事务

    <本文已参与 RocketMQ Summit 优秀案例征文活动,点此了解详情> 缘起 对于Apache RocketMQ的了解,追溯起来,可以说是从开源初始,就认识到了它.那时候的它,还是 ...

  8. 消息中间件学习总结(5)——RocketMQ之Apache RocketMQ背后的设计思路与最佳实践

    摘要:为了更好地让开发者们更加深入了解阿里开源,阿里云云栖社区在3月1号了举办"阿里开源项目最佳实践"在线技术峰会,直播讲述了当前阿里新兴和经典开源项目实战经验以及背后的开发思路. ...

  9. 汉得企业级PaaS平台 HZERO 发布 1.5.0.RELEASE 版本

    HZERO是一款基于微服务架构的企业级PaaS平台,可支持企业各类系统搭建.产品研发,帮助企业快速构架技术中台. HZERO应用微服务.容器.DevOps等云原生技术,封装了大量技术开发包.技术应用组 ...

最新文章

  1. web中的cookies以及作用--web testing 学习笔记
  2. mySql比较并获取当前时间x分钟之前的数据(时间是字符串类型)
  3. UML中类之间的几种关系
  4. Azure SQL作業
  5. 三角矩阵的逆矩阵怎么求_「线性代数」求可逆矩阵P,使得相似矩阵对角化
  6. thoughtworks面试总结
  7. Sqoop基于时间列的增量数据之LastModified方式
  8. 如何关掉visual studio 2012 实时调试器
  9. android killer反编译闪退,Android Killer反编译失败
  10. 刺激战场极寒模式到底有多疼?掌握这些攻略帮你活到最后
  11. Dungeon Master题解bfs
  12. 事件冒泡详解及阻止事件冒泡
  13. 高品质MP3制作攻略
  14. 糖尿病新世界杂志糖尿病新世界杂志社糖尿病新世界编辑部2022年第12期目录
  15. 套路无处不再,也日新月异,最终是防不胜防
  16. OpenGL超级宝典 统一变量(uniform variable)
  17. jsp 学习笔记( java编译报错:程序包 javax.servlet和javax.servlet.http 不存在)
  18. 基于Python实现的网络嗅探器【100010784】
  19. linux 中的中断处理
  20. [Java]_[初级]_[如何调用外部命令获取输出并设置它的超时退出]

热门文章

  1. 【Linux】 iptables vs firewalld
  2. 5、学MySQL前必须要了解的数据库专业术语
  3. 1.19 final修饰符详解
  4. 1.6 Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流
  5. RabbitMQ消息的确认模式
  6. matlab等距线扫描多边形程序实现_常用的3D扫描仪都有哪些类型?
  7. 重磅:某国产操作系统发布,称完全可替代Windows 7,由华为牵头制作!
  8. 昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了
  9. hibernate继承关系映射方法(三)--每个具体类一张表TPC
  10. Oracle中concat与||区别(以及与mysql中concat函数区别)