分布式之如何突破raft集群写数据性能瓶颈

news2025/7/12 9:15:45

写在前面

在分布式之Raft共识算法分析 一文中我们分析了当前比较常用的raft共识算法,通过raft算法我们可以很容易搭建集群并选举leader,然后由leader负责数据的写操作,这样也可以很容易的解决数据一致性的问题,但是只由leader来处理写操作,无疑就会让我们的系统退化为单机,系统性能也就可想而知了,本文就一起来看下如何解决这个问题。

1:万能的加一层

架构问题,一般都可以通过加一层来解决,那么我们这里的问题自然也是可以的,通过加一层代理,然后通过哈希算法来访问多个集群,就很容易的解决了集群单leader处理数据写请求的性能问题,此时架构可能如下图:

在这里插入图片描述

之后我们只需要在proxy执行简单的哈希就能定位由哪个集群来处理请求了,这样就达到了数据请求负载均衡的效果,如下图:

在这里插入图片描述

上图kye-01经过哈希就由集群A来处理了。之后,当需要增加系统的处理能力时只需要增加新的集群就可以了,假定我们增加了集群D,此时因为集群总个数变了,所以key哈希的结果部分也会改变,所以,在正式对外开始提供服务之前,我们需要迁移数据,现在假定我们有1000万的key,则要迁移的数据大概在75%,这个数据的迁移量还是有些大的,且如果集群数越大,这个数值也会越高,所以很明显,简单的哈希在这里是不适用的,此时我们可以考虑使用一致性哈希 来解决,首先我们将集群ABC映射到哈希环上,如下:

在这里插入图片描述

接着假设我们有key-1,key-2,key-3,则映射关系如下:

在这里插入图片描述

此时假定集群C不可用,则我们只需要迁移集群B和集群C之间的数据到集群A就可以了,如下:

在这里插入图片描述

此时如果数据分配均匀的话,则迁移的数据量大概在33%左右,相比于普通哈希算法75%的数据迁移量,还要小得多了,并且当集群的个数越多时,这个值会越小,当有10个左右节点,一千万个key时,这个值大概在6%左右,所以一致性哈希算法实现负载均衡的容错性还是比较强的。当然这建立在数据分布均匀的前提下,当数据分布不均匀,即冷热不均时,也依然有问题,为了解决这个,我们需要引入虚拟节点的概念,来让节点均匀的分布在哈希环上,比如node-A,可以有虚拟节点node-A-1,node-A-2,node-A-3等,当映射到node-A-1时,再次映射到实际的节点node-A就行了,增加虚拟节点后可能如下图:

在这里插入图片描述

2:问题

2.1:增加虚拟节点为什么能够解决冷热不均

利用哈希算法的随机性,当虚拟节点足够多时,会均匀分布到哈希环上,从而解决冷热不均问题。

写在后面

小结

本文看了如何通过一层代理的方式来解决raft集群单leader写数据带来的写数据性能瓶颈问题,并分析了如何使用哈希,一致性哈希配合代理来完成数据访问的负载均衡。希望本文能够帮助到你,如果你有什么问题,就留言告诉我吧,咱们一起讨论!

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

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

相关文章

C# 表达式树

lambda作为实现表达式树的一种方式&#xff0c;在开始学习表达式树之前&#xff0c;需要对lambda进行一些了解 表达式lambda&#xff0c;定义&#xff1a; (input-parameters) > expression 语句lambda&#xff0c;定义&#xff1a; (input-parameters) > { <sequen…

简单一招教你给大量视频添加srt字幕

很多小伙伴们在剪辑视频的同时需要给视频的画面中添加上srt字幕&#xff0c;那在有很多视频都要添加字幕的时候&#xff0c;就非常的费时&#xff0c;今天小编就给大家分享一个可以批量给大量视频添加srt字幕的简单方法&#xff0c;有需要的小伙伴可以进来看看具体步骤哦&#…

highlight.js高亮npm安装常见问题

目录 安装 highlight.js 安装 vue-highlightjs 安装highlightjs/vue-plugin main.js配置 最近在写低代码&#xff0c;有需求类似编辑器功能&#xff0c;实现代码高亮&#xff0c;然后用到了highlight.js&#xff0c;就整理一下。 官网链接直达 highlight.js 中文文档 安装 h…

calico-kube-controllers 启动失败处理

故障描述calico-kube-controllers 异常&#xff0c;不断重启日志信息如下2023-02-21 01:26:47.085 [INFO][1] main.go 92: Loaded configuration from environment config&config.Config{LogLevel:"info", WorkloadEndpointWorkers:1, ProfileWorkers:1, PolicyW…

java在Excel中添加png图片作为页眉(已解决)

1.背景 Excel在打印的时候需要附带水印打出&#xff0c;水印需要在下载Excel文件时就设置好 需要在打印的时候打印出水印&#xff0c;使用添加背景添加的水印在打印的时候不会出现&#xff0c;只有设置页眉&#xff0c;并将页眉设置为一长与打印纸张一样大小的图片&#xff0c…

Objective-C 字符串拼接函数 多个不同类型的参数拼接到一个字符串 类似于Java中 String.format()方法的原生API

总目录 iOS开发笔记目录 从一无所知到入门 文章目录需求ScreenshotCodeOutput需求 我有多个参数(类型也许不同)&#xff0c;需要拼接到一个字符串中。 在Java中有String.format()方法可以做到一次性格式转换。 在Objective-C中呢&#xff1f;也有具有类似功能的API&#xff1a…

从0探索NLP——导航帖

从0探索NLP——导航帖 人工智能是一个定义宽泛、知识组成复杂的领域&#xff0c;而NLP是人工智能领域中的一类任务&#xff0c;他在哪呢&#xff1f;Emmmmm~不能说都有涉猎只能说全都都沾点&#xff1a; 每次想要针对NLP的某一点进行讲解时&#xff0c;不讲那写细枝末节&…

【Git】Git下载安装与使用(一)

目录 1. 前言 1.1 什么是Git 1.2 使用Git能做什么 2. Git概述 2.1 Git简介 2.2 Git下载与安装 3. Git代码托管服务 3.1 常用的Git代码托管服务 3.2 码云代码托管服务 1. 前言 1.1 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码…

多线程知识点

多线程 基本知识 创建线程的常用三种方式&#xff1a; 继承Thread类实现Runnable接口实现Callable接口&#xff08;JDK1.5>&#xff09; public class ThreadTest extends Thread {Overridepublic void run() {System.out.println(this.getName() "..开始.."…

国内动漫绘画培训班盘点

动漫培训机构哪家好&#xff1f;动漫培训班是一种有效的提升动漫水平的方式&#xff0c;可以帮助学生提高绘画技巧和技能&#xff0c;更好地表达自己的艺术想法。 一&#xff1a;动漫培训班排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古风插…

C语言进阶(二)—— 指针强化

1. 指针是一种数据类型1.1 指针变量指针是一种数据类型&#xff0c;占用内存空间&#xff0c;用来保存内存地址。void test01(){int* p1 0x1234;int*** p2 0x1111;printf("p1 size:%d\n",sizeof(p1));printf("p2 size:%d\n",sizeof(p2));//指针是变量&am…

Python实现贝叶斯优化器(Bayes_opt)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是基…

Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑

目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0…

【100个 Unity实用技能】☀️ | Unity 通过自定义菜单将资源一键导出

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

ESP32设备驱动-内置电容触摸传感器

内置电容触摸传感器 文章目录 内置电容触摸传感器1、电容触摸传感器介绍2、软件准备3、硬件准备4、代码实现本文将详细介绍如何使用ESP32的内置电容式传感器。 1、电容触摸传感器介绍 ESP32 具有可用作触摸按钮的电容式传感器。 这些是引脚排列上著名的TOUCH引脚。 在开发板的…

vs2019+opencv450+opencv contrib450+cmake3.25.2安装流程

目的 为了研究利用sift、orb、surf等算法进行视觉特征检测&#xff0c;第一次配置折腾了四五天。 电脑环境 win10 opencv4.5.0 opencv contrib 4.5.0 cmake3.25.2 报错 问题1 OpenCV(3.4.3) Error: The function/feature is not implemented (This algorithm is patented…

基于QUIC 协议的HTTP/3

HTTP/2 存在一些比较严重的与 TCP 协议相关的缺陷&#xff0c;但由于 TCP 协议僵化&#xff0c;我们几乎不可能通过修改 TCP 协议自身来解决这些问题&#xff0c;那么解决问题的思路是绕过 TCP 协议&#xff0c;发明一个 TCP 和 UDP 之外的新的传输协议。但是这也面临着和修改 …

Dart 表达式以及语法糖汇总

前言 Dart语言中有许多语法糖或者说lambda表达式&#xff0c;语法和代码量是简洁了许多&#xff0c;但给想要入门的我添加了许多困扰&#xff0c;我经常看官方API或者第三方文档API的时候&#xff0c;在示例中大量的使用了类似的语法糖&#xff0c;让代码的可读性大大下降&…

内部知识管理应该怎么做?

许多公司都知道需要有一个面向客户的知识库&#xff0c;以加强客户服务&#xff0c;提供更好的客户体验。 但是很多企业没有意识到的是&#xff0c;拥有一个内部知识库软件对于员工改善沟通和促进知识共享的重要性。 协作是组织成功的关键部分&#xff0c;通过明确的远景和使命…

微服务之Ribbon负载均衡

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…