一、实现分布式集群多副本的三种方式

1.1 M/S模式

即Master/Slaver模式。该模式在过去使用的最多,RocketMq之前也是使用这样的主从模式来实现的。主从模式分为同步模式和异步模式,区别是在同步模式下只有主从复制完毕才会返回给客户端;而在异步模式中,主从的复制是异步的,不用等待即可返回。

同步模式

同步模式特点:高延迟、低吞吐、无数据丢失(发生故障时)、自动故障转移、强一致性

异步模式

异步模式特点:低延迟、高吞吐、少量数据丢失(主挂掉时)、平均修复时间较长、最终一致性

1.2 基于zookeeper服务

image.png

和M/S模式相比zookeeper模式是自动选举的主节点,不过rocketMq暂时不支持zookeeper,且基于ZooKeeper的服务也带来一个比较严重的问题:依赖加重。因为运维ZooKeeper是一件很复杂的事情。

1.3 基于raft

Raft

相比zookeeper,raft自身就可以实现选举,raft通过投票的方式实现自身选举leader。去除额外依赖。目前RocketMq 4.5.0已经支持

二、Dledger介绍(摘自github)

GitHub地址:https://github.com/openmessaging/openmessaging-storage-dledger/blob/master/docs/cn/introduction_dledger.md#dledger-%E7%9A%84%E5%AE%9E%E7%8E%B0

Dledger是一个基于Raft的 Commitlog 存储 Library。DLedger 定位是一个工业级的 Java Library,可以友好地嵌入各类 Java 系统中,满足其高可用、高可靠、强一致的需求。Dledger是基于日志实现的,只拥有日志的写入和读出接口,且对顺序读出和随机读出做了优化。

DLedger 的实现大体可以分为以下两个部分: 1.选举 Leader 2.复制日志

image.png

2.1 Dledger在RocketMq的实现

image.png

实现方式:

DLedgerCommitlog 用来代替现有的 Commitlog 存储实际消息内容,它通过包装一个 DLedgerServer 来实现复制;

依靠 DLedger 的直接存取日志的特点,消费消息时,直接从 DLedger 读取日志内容作为消息返回给客户端;

依靠 DLedger 的 Raft 选举功能,通过 RoleChangeHandler 把角色变更透传给 RocketMQ 的Broker,从而达到主备自动切换的目标

三、 RocketMq-Dledger集群搭建

一下主要介绍如何部署自动容灾切换的 RocketMQ-on-DLedger Group。

RocketMQ-on-DLedger Group 是指一组相同名称的 Broker,至少需要 3 个节点,通过 Raft 自动选举出一个 Leader,其余节点 作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用。

RocketMQ-on-DLedger Group 能自动容灾切换,并保证数据一致。

RocketMQ-on-DLedger Group 是可以水平扩展的,也即可以部署任意多个 RocketMQ-on-DLedger Group 同时对外提供服务。

3.1 源码构建

3.1.1构建Dledger

git clone https://github.com/openmessaging/openmessaging-storage-dledger.git

cd openmessaging-storage-dledger

mvn clean install -DskipTests

3.1.2 构建RocketMq

git clone https://github.com/apache/rocketmq.git

cd rocketmq

git checkout -b store_with_dledger origin/store_with_dledger

mvn -Prelease-all -DskipTests clean install -U

3.2编写配置

每个 RocketMQ-on-DLedger Group 至少准备三台机器(本文假设为 3)。

编写 3 个配置文件,建议参考 conf/dledger 目录下的配置文件样例。

关键配置介绍:

name

含义

举例

enableDLegerCommitLog

是否启动 DLedger

true

dLegerGroup

DLedger Raft Group的名字,建议和 brokerName 保持一致

RaftNode00

dLegerPeers

DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致

n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913

dLegerSelfId

节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一

n0

sendMessageThreadPoolNums

发送线程个数,建议配置成 Cpu 核数

16

这里贴出 conf/dledger/broker-n0.conf 的配置举例。

brokerClusterName = RaftCluster

brokerName=RaftNode00

listenPort=30911

namesrvAddr=127.0.0.1:9876

storePathRootDir=/tmp/rmqstore/node00

storePathCommitLog=/tmp/rmqstore/node00/commitlog

enableDLegerCommitLog=true

dLegerGroup=RaftNode00

dLegerPeers=n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913

## must be unique

dLegerSelfId=n0

sendMessageThreadPoolNums=16

3.3 启动Broker

nohup sh bin/mqbroker -c conf/dledger/xxx-n0.conf &

nohup sh bin/mqbroker -c conf/dledger/xxx-n1.conf &

nohup sh bin/mqbroker -c conf/dledger/xxx-n2.conf &

四、容灾、高可用方案推荐

目前RocketMq主要有两种选择

1.M/S

2.Dledger模式

两种的优缺点:

Master/Slave

优点:实现简单

缺点:不能自动控制节点切换,一旦出了问题,需要人为介入。

Dledger

优点:可以自己协调,并且去除依赖。

缺点: 只有RocketMq 4.5.0支持

经过上文的分析。推荐使用Dledger

rocketmq 如何保证高可用_RocketMq容灾、高可用方案相关推荐

  1. 世界领先!详解蚂蚁金服自研数据库OceanBase的高可用及容灾方案

    小蚂蚁说: 关于蚂蚁金服自研的金融级分布式关系型数据库OceanBase的故事相信大家已经不再陌生了(新来的同学可以移步<厉害了,蚂蚁金服!创造了中国自己的数据库OceanBase>了解更 ...

  2. 支付宝的高可用与容灾架构演进

    http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=402390133&idx=1&sn=395cf6e500ea912f ...

  3. 《支付宝的高可用与容灾架构演进》读后感

    本篇文章主要介绍了支付宝高可用和容灾能力建设的解决思路,高可用性指的是一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性.容灾能力一般特指面对自然灾害时的处理与恢复能力.在架构设计中, ...

  4. 如何构建故障与危机的处理能力?《高可用及容灾架构体系化建设》下篇

    如何建设全面的高可用及容灾架构体系,是一个涉及到广泛领域的话题,将分成上.下两篇呈现给读者.本文将在上篇的架构基础上,构建完整的故障与危机的处理能力,同时通过持续运营与组织保障机制的协同,打造出全面的 ...

  5. SharePlex for Oracle应用系统高可用和容灾方案

    第1章                             前言 在企业信息化进程不断加快的今天,保持业务的连续性是企业用户进行数据存储时必须考虑的重要方面.灾难的出现可能导致生产停顿.客户满意度 ...

  6. 怎样建设稳定性基础架构?《高可用及容灾架构体系化建设》上篇

    如何建设全面的高可用及容灾架构体系,是一个涉及到广泛领域的话题,将分成上.下两篇呈现给读者.本文讨论的架构体系,解耦具体产品实现,尽量只从架构原理出发,从构建一个韧性的应用基础架构内核开始,到增强应用 ...

  7. MSHA x Chaos 容灾高可用实践

    作者 | 远跖.瀚阑 来源|阿里巴巴云原生公众号 前言 由于外部环境的复杂以及硬件的不可靠,互联网服务的高可用面临着巨大的挑战,由于断网.断电等事故导致的各大互联网公司服务不可用的案例也不在少数.业务 ...

  8. springboot 故障注入_MSHA x Chaos 容灾高可用实践

    作者 | 远跖.瀚阑 来源|阿里巴巴云原生公众号 前言 由于外部环境的复杂以及硬件的不可靠,互联网服务的高可用面临着巨大的挑战,由于断网.断电等事故导致的各大互联网公司服务不可用的案例也不在少数.业务 ...

  9. 玩转ECS第6讲 | 弹性计算Region化部署和跨可用区容灾介绍

    简介:本次分享由阿里云弹性计算架构负责人李钟(谢顿)为大家介绍阿里云region化部署和跨可用区容灾的实践经验,说明多Region部署场景中使用阿里云弹性计算的最佳实践,并结合弹性计算的实践经验探讨如 ...

最新文章

  1. 我开发的代码,如何申请版权_代码简介:我花了3个月时间申请开发人员职位。 这是我学到的。...
  2. docker配置国内镜像源
  3. Scapy学习笔记二
  4. Linux(CentOS)中常用软件安装,使用及异常——MySQL, VmTools
  5. 第四次作业-四则运算
  6. 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型
  7. 向后台接口传递FormData格式的数组对象
  8. 愿岁月可回首,从家族营销到Android开发
  9. git revert 之后怎么撤销_Git 如何优雅地回退代码
  10. Python安装指南
  11. php 虚拟主机和虚拟目录的配置
  12. httpclient 连接池工具类_C# 中 HttpClient 的简单使用
  13. linux检测nfc,kali linux 能用哪些nfc读卡器
  14. 快递物流行业总结(一)中国快递行业生命周期理论
  15. 软件工程基础-个人项目-数独游戏
  16. ROS机器人建模与仿真(一)--URDF机器人建模
  17. 如何将word文档生成二维码
  18. React Reconciler
  19. 学习笔记(07):C++网络编程进阶-IO模型之重叠Overlapped IO(基于事件通知)
  20. 损坏Word文档的几种修复方法

热门文章

  1. android软键盘上推ui解决
  2. File System Auditor 安装全程截图
  3. DB Reindex
  4. 40种网站设计常用方法
  5. ASP.NET 2.0+Atlas编写鼠标拖放程序
  6. 机器学习实践二 -多分类和神经网络
  7. SQL数据类型说明和MySQL语法示例
  8. vue 响应式ui_如何在Vue.js中设置响应式UI搜索
  9. web动画_Web动画简介
  10. 从头学习计算机网络_如何从头开始构建三层神经网络