当前位置: 首页 > news >正文

Kylin Server V10 下 RocketMQ 主备自动切换模式部署

一、NameServer简介

        NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。

服务注册

        Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册,而不是只向其中的某些节点注册,因为 NameServer 每个节点都是对等的,所以 Broker 需要向每一个节点进行注册,这样每一个节点都会有一份 Broker 的注册信息。

服务发现

        Broker 向 NameServer 注册以后,生产者 Producer 和消费者 Consumer 就可以从 NameServer 中获取所有注册的 Broker 信息,不过由于 NameServer 每个节点是对等的,所以生产者和消费者需要感知所有的 NameServer, 之后选取一个 NameServer 从中获取 Topic 的路由信息,再向对应的 Broker 进行消息的发送和消费。

        以生产者为例,在 NameServer 集群部署模式下,生产者会从多个 NameServer 中随机选取一个进行通信,从中拉取所有 Broker 的注册信息,并将拉取到的信息进行缓存,生产者知道了 Broker 的信息后,就可以得知 Topic 的分布情况,然后选取一个消息队列,与其所在的 Broker 通信进行消息的发送。如果通信的 NameServer 宕机,消费者会轮询选择下一个 NameServer。

为什么需要 NameServer ?

        在使用 RocketMQ 的时候,为了提升性能以及应对高并发的情况,一般都会使用多个 Broker 进行集群部署,假设没有注册中心,对于 Broker 来说,如果想获取到集群中所有的 Broker 信息(生产者和消费者需要通过某个 Broker 获取整个集群的信息,从而得到Topic 的分布情况),每个 Broker 都需要与其他 Broker 通信来交换信息,以此来得到集群内所有 Broker 的信息,在 Broker 数量比较大的情况下,会造成非常大的通信压力。

Broker 注册

        Broker 启动后开启定时向 NameServer 进行注册(发送心跳包)的任务,发送心跳包的时间间隔可以在配置文件中进行设置,但是最长不能超过10s ,也就是说 Broker 最长10秒钟会向 NameServer 发送一次心跳包。

        NameServer 收到 Broker 的注册请求(心跳包)后,会判断 Broker 之前是否已经注册过,如果未注册过将其加入到注册的 Broker 集合 brokerAddrTable 中,同时也会记录收到注册请求的时间,将其加入到 brokerLiveTable 中,里面记录了 NameServer 收到每个 Broker 发送心跳包的时间,在进行心跳检测的时候根据这个时间戳来判断是否在规定时间内未收到该 Broker 发送的心跳包。

读写锁

        由于 NameServer 可能同时收到多个 Broker 的注册以及生产者或者消费者的拉取请求,为了保证数据的一致性(因为有读写请求同时发生或者写与写请求同时发生),在处理相关请求的时候需要加锁,为了提高性能,使用了 ReadWriteLock 读写锁,处理注册请求时会先添加写锁,外理拉取请求时添加读锁,这样如果某一时刻都是读的请求可以同时进行,互不影响,如果有写请求,其他请求就需要等锁释放才可以进行往下进行。如果不使用读写锁,直接对所有的请求加锁,会影响性能,实际上读与读之间并不需要加锁。

心跳检测

        NameServer 在启动的时候会开启一个用于心跳检测的定时任务(每10s执行一次),定时扫描处于不活跃状态的 Broker, 如果在规定时间内未收到某个 Broker 的心跳包,会认为此 Broker 不可用,需要将其进行剔除。

        brokerLiveTable 保存了当前 NameServer 收到的心跳数据,里面记录了每一个 Broker 最近进行注册/发送心跳的时间戳,所以只需遍历 brokerLiveTable, 获取每一个 Broker 最近一次发送心跳的时间进行判断,如果上一次发送心跳的时间 + 过期时间(120s)小于当前时间,也就是超过 120s 没有收到某个 Broker 的心跳包,则认为此 Broker 已下线,将 Broker 移除。

Broker 下线

正常下线

        当 Broker 下线的时候会向 NameServer 发起取消注册的请求,NameServer 收到请求后会将 Broker 剔除。

异常下线

        如果 Broker 异常宕机,或者发送给 NameServer 的取消注册请求由于某些原因并未发送成功,NameServer 可能并未感知到 Broker 的下线,由于心跳机制定时检测的功能,会在一段时间后发现未收到 Broker 的心跳请求,主动将 Broker 剔除。

生产者和消费者

        生产者和消费者都会定时从 NameServer 中更新 Broker 的注册信息,默认是30s 进行一次更新。

二、Controller 模式简介

        在RocketMQ 5.0 以前,有两种集群部署模式,分别为主从模式(Master-Slave模式)和 Dledger 模式。

主从模式

        主从模式中分为 Master 和 Slave 两个角色,集群中可以有多个 Master 节点,一个 Master 节点可以有多个 Slave 节点。Master 节点负责接收生产者发送的写入请求,将消息写入 CommitLog 文件,Slave 节点会与 Master 节点建立连接,从 Master 节点同步消息数据(有同步复制和异步复制两种方式)。

        消费者可以从 Master 节点拉取消息,也可以从 Slave 节点拉取消息。

在 RocketMQ 4.5 版本之前,如果 Master 宕机,不支持将 Slave 切换为 Master, 需要人工介入。

Dledger 模式

        为了解决主从架构下 Slave 不能自动切换为 Master 的问题,4.5 版本之后提供了 DLedger 模式,使用 Raft 算法,如果 Master 节点出现故障,可以自动从 Slave 节点中选举出新的 Master 进行切换。

存在问题

(1)根据 Raft 算法的多数原则,集群至少有三个节点以上,在消息写入时,也需要大多数的 Follower 节点响应成功才能认为消息写入成功;

(2)Dledger 模式下,进行消息写入的时候,使用的是 openmessaging 包中提供的接口,无法利用 RocketMQ 原生的存储和复制能力(比如非 Dledger 模式下使用暂存池方式写入);

(3)存在两套日志复制流程(主从模式下一套,Dledger 模式一套),不统一;

Controller 模式

        为了解决如上问题,RocketMQ 5.0 以后推出了 Controller 模式,它的特点如下:

(1)在主从部署模式下具备自动切换 Master 的能力;

(2)可以利用 RocketMQ 原生存储复制能力,并统一 RocketMQ 的存储和复制能力;

        RocketMQ 5.0 对Broker 选主相关的功能进行了抽离,放在 Controller 中,实现了在主从部署模式下就可以自动切换 Master, Controller 可以独立部署也可以嵌入在 NameServer 中部署。

独立部署下的 Controller如下所示:

嵌入 NameServer 中的部署图如下所示:

Controller

        也称为 Controller 控制器,一般集群中部署多个 Controller, 使用 Raft 算法选举出一个 Active DLedger Controller 作为主控制器,它主要用来管理一个 SyncStateSet集合,这个集合中存储的是一组跟上 Master 进度的 Broker 节点集合,如果 Controller 发现某个 Master Broker 下线时,会从集合中选出新的 Master Broker 并切换,Controller 可以单独部署也可以嵌在 NameServer 中部署。

SyncStateSet

        SyncStateSet 中维护了一个 Broker 副本组集合,包含当前 Master Broker 和它的 Slave Broker, 需要注意在集合内的节点都是跟上 Master 进度的节点,在节点变更时,由 Master Broker 向 Controller 控制器发起变更请求,更新 Controller 中的 SyncStateSet 数据,在选举 Master 的时候,Controller 只需从这个列表中选出一个节点成为新的 Master 即可。

        节点变更分为 Shrink 操作和 Expand 操作,需要 Master Broker 发起,它会通过定时任务以及在数据同步过程中判断是否需要进行 Shrink 或 Expand。

Shrink

        Shrink 指的是将 SyncStateSet 副本集合中与 Master 节点差距过大的副本移除,差距的判断条件如下:

1.  节点是否与 Master Broker 的连接已断,如果断开需要将该节点从 SyncStateSet 移除;

2.节点的复制进度是否过大,新增了 haMaxTimeSlaveNotCatchup 参数,Master Broker 会通过定时任务扫描每一个 Slave 节点的复制信息,里面有每个节点上一次跟上 Master 进度的时间戳 lastCaughtUpTimeMs, 如果当前时间减去这个 lastCaughtUpTimeMs 超过了 haMaxTimeSlaveNotCatchup 的值,会认为该 Slave 节点的复制进度过后;

haMaxTimeSlaveNotCatchup:表示Slave没有跟上 Master 的最大时间间隔,若在 SyncStateSet 中的 slave 超过该时间间隔会将其从 SyncStateSet 移除。默认为 15000(15s)。

Expand

        如果 Master Broker 发现某个 Slave 节点赶上了 Master 节点的进度,需要将其重新加入到 SyncStateSet 。

        需要注意以上两个操作,都需要 Master Broker 向 Controller 节点发送通知,请求更新 SyncStateSet 中的数据。

选举 Master

        不管是 Controller 独立部署,还是嵌入到 NameServer 中部署,Controller 都会监听每个 Broker 的连接,Broker 会定期向 Controller 发送心跳包,Controller 会定时扫描,如果某个 Broker 心跳包发送超时,会认为这个 Broker 已经失效,此时会判断 Broker 是否是 Master 角色,如果是 Master 角色就需要从该组的 SyncStateSet 中重新选出一个节点作为 Master。

        选举 Master 的方式比较简单,从该组的 SyncStateSet 中,挑选一个心跳包发送正常的 Slave 成为新的 Master 节点即可,并将结果通知到该组所有的 Broker, 每个Broker 也会定时向 Controller 发送请求获取主备信息。

Broker 端设计

        主从架构部署模式下,需要配置 brokerRole 和 brokerId,也就是手动分配 Master 和 Slave,在 Controller 模式下,这两个参数会失效,不需要再进行配置,角色和 ID 由 Controller 来分配。

        Controller 模式下增加了 controllerAddr 参数,Broker 在启动时,需要配置这个参数,设置每个controller 的地址:

controllerAddr:controller的地址,多个controller中间用分号隔开。例如controllerAddr = 127.0.0.1:9877;127.0.0.1:9878;127.0.0.1:9879

Broker 上线

        Broker 配置了每个 Controller 的地址,Broker 启动时,会先向 Controller 注册,并获取角色关系和 brokerId, 通过角色关系可以知道自己是 Master 还是 Slave,之后再向 NameServer 注册。

        Broker 可以通过任意一个 Co

相关文章:

Kylin Server V10 下 RocketMQ 主备自动切换模式部署

一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…...

DevOps工程技术价值流:GitLab源码管理与提交流水线实践

在当今快速迭代的软件开发环境中,DevOps(开发运维一体化)已经成为提升软件交付效率和质量的关键。而GitLab,作为一个全面的开源DevOps平台,不仅提供了强大的版本控制功能,还集成了持续集成/持续交付(CI/CD)…...

Vue 3 中实现页面特定功能控制

在开发 Vue 应用时,我们经常会遇到需要在特定页面启用或禁用某些功能的情况。本文将以 A父.vue 页面为例,探讨如何在点击汇总菜单时仅在该页面生效,而在其他页面不生效的问题。 1. 利用 Vue 3 的 provide 和 inject 实现状态传递 Vue 3 提供…...

VLC 播放的音视频数据处理流水线搭建

VLC 用 input_thread_t 对象直接或间接管理音视频播放有关的各种资源,包括 Access,Demux,Decode,Output,Filter 等,这个类型定义 (位于 vlc-3.0.16/include/vlc_input.h) 如下: struct input_thread_t {VLC_COMMON_MEMBERS };input_thread_t 是个抽象类型,VLC 中这个类…...

何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)

在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...

学习笔记043——HashMap源码学习1

文章目录 1、HashMap2、Hashtable3、TreeMap4、HashMap 底层结构4.1、什么是红黑树? 1、HashMap HashMap key 是不能重复的,value 可以重复 底层结构 key-value 进行存储,key-value 存入到 Set 中,再将 Set 装载到 HashMap pack…...

单点登录原理

允许跨域–>单点登录。 例如https://www.jd.com/ 同一个浏览器下:通过登录页面产生的cookie里的一个随机字符串的标识,在其他子域名下访问共享cookie获取标识进行单点登录,如果没有该标识则返回登录页进行登录。 在hosts文件下面做的域名…...

【随笔】AI大模型对软件开发的影响

随着 AI 技术的不断发展,AI大模型正在重塑软件开发流程,从代码自动生成到智能测试,未来,AI 大模型将会对软件开发者、企业,以及整个产业链都产生深远的影响。欢迎探讨 AI 是如何重塑软件开发的各个环节以及带来的新的流…...

JAVA中接口类和抽象类的区别

在Java中,接口(Interface)和抽象类(Abstract Class)都是实现抽象概念的方式,但它们之间存在一些关键的区别: 1. 定义和声明 抽象类: 使用abstract关键字声明。可以包含构造方法、成…...

【AI系统】昇腾 AI 架构介绍

昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼,也是 AI 计算能⼒的来源。华为,作为昇腾计算产业⽣态的⼀员,是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…...

uniapp input只输入一个字符就自动失去焦点

下面一段代码在每次输入后自动失去焦点&#xff0c;这是因为绑定的:key是动态的&#xff0c;输入改变后都需要重新刷新渲染&#xff0c;这是造成input只能输入一次就自动失去焦点的原因。 <view class"" v-for"(item, index) in phoneList" :key"…...

定时/延时任务-ScheduledThreadPoolExecutor的使用

文章目录 1. 概要2. 固定速率和固定延时2.1 固定速率2.2 固定延时 3. API 解释3.1 schedule3.2 固定延时 - scheduleWithFixedDelay3.2 固定速率 - scheduleWithFixedDelay 4. 小结 1. 概要 前三篇文章的地址&#xff1a; 定时/延时任务-自己实现一个简单的定时器定时/延时任…...

自编码器(一)

其实自编码器也可以算是自监督学习的一环&#xff0c;因 此我们可以再简单回顾一下自监督学习的框架。如图1.1所示&#xff0c;首先你有大量的没有标注的 数据&#xff0c;用这些没有标注的数据&#xff0c;你可以去训练一个模型&#xff0c;你必须设计一些不需要标注数据的 任…...

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中&#xff0c;服务网关是一个至关重要的组件。它作为系统的入口&#xff0c;负责接收客户端的请求&#xff0c;并将这些请求路由到相应的后端服务…...

40分钟学 Go 语言高并发:Go程序性能优化方法论

Go程序性能优化方法论 一、性能指标概述 指标类型关键指标重要程度优化目标CPU相关CPU使用率、线程数、上下文切换⭐⭐⭐⭐⭐降低CPU使用率&#xff0c;减少上下文切换内存相关内存使用量、GC频率、对象分配⭐⭐⭐⭐⭐减少内存分配&#xff0c;优化GC延迟指标响应时间、处理延…...

一文解析Kettle开源ETL工具!

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于数据抽取、转换和加载的软件工具&#xff0c;用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具备受用户推崇。本文就来详细说下Kettle。 一、Kettle是什么&#xff1f; Kettle 是一款开源的 ETL&#x…...

Tomcat新手成长之路:安装部署优化全解析(上)

文章目录 1.Tomcat简介2.Tomcat原理架构2.1.总体架构2.2.连接器2.2.1.具体功能2.2.2.IO模型2.2.3.逻辑处理流程2.2.4.内部处理流程 2.3.容器2.4.启动过程2.5.请求过程 3.Tomcat适用场景4.Tomcat与其他Web容器对比5.Tomcat安装和启动5.1.Java环境变量5.2.系统服务5.3.启动关闭 6…...

跟我学C++中级篇——通信的数据的传递形式

一、通信的数据传递 在开发程序中&#xff0c;无可避免的会进行数据的传递。这种传递方式有很多种&#xff0c;字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时&#xff0c;如何正确的采用更合适的方法&#xff0c;就成为了一个设计的首选的问题。 二…...

C语言 qsort及应用

qsort及应用 qsort:快速排序函数,需要引用stdlib.h文件. void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *, const void *) ); 参数: base:需要排序的数组 num:数据个数(数组长度) width:每个数据的字节数(sizeof(数据类型)) compa…...

【C语言】连接陷阱探秘(4):检查外部类型

目录 一、外部类型概述 1.1. 外部类型的重要性 1.2. 外部类型在C语言中的使用 1.3. 注意事项 二、常见的外部类型陷阱 2.1. 结构体和联合体的大小不匹配 2.1.1. 示例代码 2.1.2. 正确的做法 2.2. 枚举类型的值不匹配 2.3. 函数签名不一致 2.3.1. 函数签名不一致的问…...

打造双层环形图:基础与高级渐变效果的应用

在数据可视化领域&#xff0c;环形图因其独特的展示方式而广受欢迎。今天&#xff0c;我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先&#xff0c;我们需要了解环形图的基本构成。环形图由内外两个圆…...

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…...

【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset

一、操作步骤 1、打开终端 2、pmset 是用于管理电源设置的强大工具&#xff0c;我们将使用这个命令 &#xff08;1&#xff09;查询当前任务 pmset -g sched查看到我当前的设置是 唤醒电源开启在 工作日的每天早上8点半 上班时不用手动开机了 &#xff08;2&#xff09;删…...

【Leecode】Leecode刷题之路第62天之不同路径

题目出处 62-不同路径-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…...

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…...

helm部署golang服务

Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 中的 apt 或 yum。它使得在 Kubernetes 上部署和管理应用程序变得更加简单和高效。 安装 https://get.helm.sh/helm-v3.16.3-linux-amd64.tar.gz具体版本号可以在github上看到最新的版本号,然后替换上面链接来获取。gith…...

DreamCamera2相机预览变形的处理

最近遇到一个问题&#xff0c;相机更换了摄像头后&#xff0c;发现人像角度顺时针旋转了90度&#xff0c;待人像角度正常后&#xff0c;发现 预览时图像有挤压变形&#xff0c;最终解决。在此记录 一人像角度的修改 先放示意图 设备预览人像角度如图1所示&#xff0c;顺时针旋…...

Mysql误删表中数据与误删表的恢复方法

查看数据库是否开启binlog日志 mysql> show variables like %log_bin%; ------------------------------------------------------------------------ | Variable_name | Value | ------------------------------------…...

lapack、blas、solver库的区别和联系

LAPACK、BLAS、Solver 库 是数值计算领域的重要组成部分,它们各自的功能和设计目标有所不同,但也存在密切的联系。 1. 概述 库主要功能设计目标BLAS提供基础的线性代数操作,如向量运算、矩阵-向量乘法、矩阵-矩阵乘法等。提供高度优化的基础线性代数操作,作为更高级库的底层…...

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…...

怎么申请免费网址/国内好的seo

Javascript中总有一些所谓的细节知识会让你目瞪口呆。前段时间&#xff0c;项目组新增一个需要&#xff0c;要求系统中所有显示时间的地方支持日期格式可定制什么事日期格式可定制呢&#xff0c;在平常呢&#xff0c;我们看到的时间格式一般是“yyyy-MM-dd”形式的&#xff0c;…...

网站建设公司那家好/网络营销推广的特点

1.Android listview数据没完全加载时滑动界面越界报错。解决办法是先设置setEnabled(false);,加载完后.setEnabled(true); 2.网络访问不能放在主线程&#xff0c;会报错。 3.web端百度地图添加覆盖物&#xff0c;只有IE浏览器不显示&#xff0c;但点击F12后显示&#xff0c;删除…...

有没有做任务赚钱的网站/最新新闻热点素材

...

云南大永高速公路建设指挥部网站/沪深300指数怎么买

electron 图标制作聊天机器人越来越受欢迎。 Facebook正在致力于提供一个构建Messenger机器人的框架&#xff0c;该框架将允许企业所有者完全在Facebook的消息传递应用程序内部建立其客户支持。 订购披萨 &#xff0c;安排您的下一次就诊时间&#xff0c;或者只是想为下一次旅行…...

哪个网站可以自己做行程/百度推广费用多少钱

简介 有时候我们可能会需要限定路由访问次数这样的需求。 在laravel中又一个内置中间件可以帮我们实现这个需求 # throttle:3,1 第一个参数&#xff0c;3>1分钟内只能访问三次&#xff0c;第二个参数,1>设定为1分钟 Route::get(test,TestControllerindex)…...

苹果地图可以看街景吗/广东网站营销seo费用

var scrollTop; var strTop window.location.href;//多个页面的记忆功能&#xff0c;需要通过页面地址来分辨cookie名称 $(document).scroll(function () {   scrollTop $(document).scrollTop(); //获取滚动条位置   $.cookie(strTop,scrollTop,{ expires: 1 });生成coo…...