浅谈Nacos注册中心集群分布式架构设计

news2024/10/5 19:16:49

前言

Nacos的压测性能是非常好的,这里是Nacos官方的压测报告。3节点(CPU 16核,内存32G)规模集群,压测容量服务数可达60W,实例注册数达110W,集群运行持续稳定,达到预期;注册/查询实例TPS达到 13000 以上,接口达到预期;

这种性能对于绝大数大中小型企业来说,已经够用了。但是假设我们有一个场景,Nacos不单单是服务于集团公司内部,而是PaaS化了,业务在世界各地开花,那所需管理的服务实例,就不是小百万,而是达到了几百万 ,甚至千万等等。那么依靠Nacos现在开源版本是很难支持这种场景的。

Nacos注册中心集群原理

分布式CAP黄金定律不再赘述。Nacos中的配置中心其实没什么CP或AP,因为配置中心的数据是存在一个Mysql中的,只有注册中心的数据需要进行集群节点之间的同步,从而涉及到是CP还是AP,如果注册的节点是临时节点,那么就是AP,如果是非临时节点,那么就是CP,默认是临时节点。

Nacos支持CP+AP模式,即Nacos可以根据配置识别为CP模式或AP模式,默认是AP模式。

  • 如果注册Nacos的client节点注册时ephemeral=true,那么Nacos集群对这个client节点的效果就是AP,采用distro协议实现
  • 而注册Nacos的client节点注册时ephemeral=false,那么Nacos集群对这个节点的效果就是CP的,采用raft协议实现 (学过zookeeper的ZAB 肯定不会陌生raft)

根据client注册时的属性,AP,CP同时混合存在,只是对不同的client节点效果不同。Nacos可以很好的解决不同场景的业务需求。

distro 、 raft 这两种分布式一致性协议,具体细节我不在这里展开篇幅讲述,因为涉及的内容真的太多了~读者可以先去提前了解一下。本文只给出一点基础结论,以便形成全文连贯。

distro

在 Distro 协议的设计思想下,每个 Distro 节点都可以接收到读写请求。所有的Distro协议的请求场景主要分为三种情况:

  • nacos每个节点是平等的都可以处理写请求,同时把数据同步到其他节点
  • 每个节点只负责部分数据,定时发送自己负责的数据的校验值到其他节点来保持数据一致性
  • 每个节点独立处理读请求,及时从本地发出响应

raft

raft 有master follower两种角色。master负责读写,follower只负责读,收到写请求会转发给master完成写。一次写操作,要经过半数follower写入成功ack应答,才能算完成一次成功的写操作。master、follower最终都拥有全量数据,达到数据一致性。

这里总结一下 ,不管是哪种协议实现,都有一个问题存在,那就是集群每个节点都拥有全量注册信息数据。那么问题就来了,

  • 上述场景中如此庞大的服务实例数目,要多大的内存才能够呢?
  • 增加新Nacos节点的时候,全量复制将是举步维艰,该如何尽快恢复集群健康以达到可以对外服务呢?
  • 以后服务实例越来越多,怎么支持快速扩容呢?

按照现有开源的Nacos设计,很难满足。所以需要二开。

笔者的一种设计思想就是分布式化设计。像elasticsearch、redis那样的分布式设计思想。

分布式注册中心架构设计

将完整的庞大的注册表信息分布式存储。存储于集群中的各个Nacos节点中。每个节点存储一部分注册表信息。节点中划分主从两种角色,进行主从复制以及主从替换,使其具备高可用特征。如下图所示,一个6个节点,三组主从架构模式组成了分布式Nacos集群。

这样设计的优点

  • 支持横向扩展
  • 提高性能,数据分布在多个node,即多台服务器上,所有的操作,都会在多台机器上并行分布式执行,提高了吞吐量和性能。

接下来我们来详细思考一下读写怎么设计?

Nacos分布式架构设计

服务进行注册时,根据当前服务实例信息,封装成instance信息

  • 客户端hash选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)。
  • coordinating node 对 instance中的服务名进行路由,将请求转发给对应的 node。
  • 实际的 node 处理请求,然后将数据同步到 salve node。
    coordinating node 如果发现 master node 和所有 salve node 都搞定之后,就返回响应结果给客户端。

  • 客户端发送请求到任意一个 node,成为 coordinate node。
  • coordinate node 对 服务名 进行哈希路由,将请求转发到对应的 node,此时可以使用 读写分离等选择在 master node以及其所有 salve node 中轮询算法选择一个,让读请求负载均衡。
  • 接收请求的 node 返回 注册表信息 给 coordinate node。
  • coordinate node 返回 注册表信息 给客户端。

新增节点

新增节点,必然会影响现有的hash路由,导致协调节点不能准确转发给拥有实际注册表的节点。所以新增节点,集群必须先经过一段短暂的时间用于将现有注册表信息归一重新划分到各个节点上。这个过程有点类似再hash。扩容再hash可以有两种方式:

  • 常规hash。在形成的扩容后,将旧hash表hash迁移到新的hash表去,直到迁移完毕,以新的hash表对外服务。
  • 渐进式hash。新旧hash同时存在,共同对外服务,同时一边数据hash迁移。直到迁移完毕,回收旧hash表。Redis hash结构就用到了这个方式。

节点崩溃

分布式集群下,节点崩溃有三种场景:

  1. 主从架构下的从节点宕机崩溃
  2. 主从架构下的主节点宕机崩溃
  3. 主从架构下的主从节点同时崩溃

第一种场景,没有影响,基于高可用机制,不管宕机多少个从节点,还有主节点可以提供服务。
第二场景,有一点点影响,因为基于主节点可写,在从节点重新选主晋升主节点前,服务不可写。直到从从节点晋升主节点后,集群恢复正常。主从替换时间很小,所以影响有一点点。
第三种场景,这种情况要分两种情况来说:

  1. 对于集群自身来说,影响较大,这意味着hash路由到这一组node 节点不可读写,丧失服务能力。
  2. 对于基于注册中心的应用来说,因为nacos客户端维护了注册表缓存,意味着理想情况下,依旧可以保持应用正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModStartBlog v6.3.0 任务调度重构,UEditor 升级

系统介绍 ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键…

跨设备链路聚合 M-LAG

M-LAG(Multichassis Link Aggregation Group)即跨设备链路聚合组,是一种实现跨设备链路聚合的机制,如下图所示,将SwitchA和SwitchB通过peer-link链路连接并以同一个状态和Switch进行链路聚合协商,从而把链路…

学校介绍静态HTML网页设计作品 DIV布局学校官网模板代码 DW大学网站制作成品下载 HTML5期末大作业

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

iOS app上架app store流程详解​

前提条件​ 在有效期内的苹果开发者账号(类型为个人或者公司账号)。还有一种情况,就是你的Apple ID被添加到公司开发者账号团队里面,这样也是可以的,但是需要叫管理员给你开通相应的账号权限,如下截图&…

[附源码]Python计算机毕业设计Django在线图书销售系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

Vue | 有关Vue2路由知识点的一些总结,以及Vue3路由做出了哪些调整?

目录 Vue2: 1. 路由: 2. 路由规则: 3. 实现切换(active-class可配置高亮样式) 4. 指定展示位置 5. 路由的query参数 6. params传参: 7. 多级路由 8. 路由的props配置 9. 的replace属性 10. 编…

Android databinding之BindingMethod与BindingMethods介绍与使用(五)

一、介绍 前面几篇文章已介绍了很多data binding的用法,今天我将会介绍一个新的方法绑定BindingMethod的用法。 BindingMethod,从名字可以看出是绑定方法的,绑定的一般都是和布局有关,通过绑定来提高布局可扩展性。 二、使用 Bin…

把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10

就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑。这是一款无与伦比、超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的语言生成能力。 好吧&#xff…

资产扫描神器ARL增强改造

拉取项目首先从GitHub克隆到服务器上。git clone https://github.com/ki9mu/ARL-plus-docker/修改配置文件因为ARL在配置文件里设置了黑名单,有时候项目为GOV或者EDU之类的时候无法进行扫描,所以在这里修改一下配置文件就可以解除限制。cd ARL-plus-dock…

Spring Boot3.0 GA系列全新版本-全新体验-学习案例1

SpringBoot3.0 GA 2022-11-24这是伟大的一天,Spring Boot进入了3.0时代,并会叩开JDK全面升级的浪潮 文章目录SpringBoot3.0 GA技术支持一、新建第一个mode?1.1、打开IDEA,新建项目1.2、选择 版本 和 依赖1.3、查看项目结构1.4、配…

vscode配置remote ssh

1. 安装插件 设置界面 右键最左边tab栏: 主体: vscode 插件: Remote SSH Linux主体: vscode-server 插件: C/C, CMake, CMake Tools, CodeLLDB, Rainbow Brackets, vscode-proto3, SVN 虚拟化主体: multipass linux发行版(比如ubuntu) 补充: multipass实例本地端口…

【C++ unordered_set set 和 unordered_map 和 map】

文章目录前言简单介绍哈希表,哈希结构什么时候用哈希表unordered_map操作likou第一题 两数之和unordered_set 基础操作unordered_set 实现总结前言 今天重新打开力扣,看到以前的签到题两数之和,以前的方法是双指针暴力解法,偶然看…

asp.net校园二手物品交易网站

目录 摘 要 Ⅰ Abstract Ⅱ 第一章 概述 1 1.1网站的开发背景 1 1.1.1学生二手物品交易置换网站的开发背景 1 1.1.2学生二手物品交易活动的现状 1 1.2 学生二手物品交易置换网站的研究方向和内容 2 1.2.1研究方向 2 1.2.2研究内容 2 1.3 学生二手物品交易置换网站的设计目标 2…

transformer中QKV的通俗理解(剩女与备胎的故事)

用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制(上)在线激情讲解transformer&Attention注意力机制(上&…

SpringCloud全系列知识(5)——微服务的部署(Docker)

微服务的部署(Docker) 一 初识Docker 1.项目部署问题 大型项目组件较多,运行环境较为复杂,部署和维护困难依赖关系复杂,容易出现兼容性问题开发,测试,生产环境有差异 2.解决依赖的兼容问题 …

[附源码]Python计算机毕业设计Django疫情期间小学生作业线上管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

差分方程解的稳定性

Heine定理 存在的充要条件是: 取定义域内的任意数列,有 差分的定义 考虑离散型变量 一阶差分为: 二阶差分为: 线性差分方程的解 非齐次差分方程的解 满足初始条件的n阶非齐次线性差分方程 的解是存在且唯一的 非齐次线性差分方程的通解结构:齐次差分方程的解 线性相关与…

提升规则自治能力与原生分析能力、支持视频流接入处理

11 月, eKuiper 团队转入 1.8.0 版本的开发周期之中,目前已完成了一部分实用的新功能:添加了视频流 source,将边缘流式处理能力扩展到视频流领域,可以处理摄像头的视频流或者网络中的直播视频流;发布了通用…

[附源码]Python计算机毕业设计Django智能家电商城

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

苹果iOS 16.2/iPadOS 16.2 RC版发布:隔空投送10分钟限制全球上线

今日,苹果向用户推送了iOS 16.2/iPadOS 16.2 RC候选版更新,内部版本号为20C65。 本次更新主要包括以下改进和错误修复: 一、隔空投送10分钟限制在全球上线,原本的“所有人”选项改为“所有人,10分钟”,超过…