DDIA 分布式数据的分区与复制 - 基于 Redis、Kafka、Elasticsearch 的深入分析

news2024/11/18 3:23:09

引言

本文基于《Designing Data-Intensive Applications》一书(设计数据密集型应用,简称 DDIA),深入探讨了 RedisKafkaElasticsearch 等常用组件的分区与复制机制。通过这些案例分析,我们可以更好地理解分布式系统的基本原理和实际应用。

DDIA 复制与分区

复制

复制机制主要由领导者(leader,又称为 master/primary)和追随者(follower,又称为 slave/replica)组成。

根据领导者的数量,复制可以分为以下几种形式:

  • 单主复制:最常见的形式。
  • 多主复制:常见于多数据中心、离线设备、协同编辑等场景。
  • 无主复制:多受 Dynamo 系统启发。

根据复制时的确认机制,复制分为:

  • 同步:客户端发起请求,主库和从库都完成变更后才响应。
  • 异步:主库完成变更后立即响应,不等待从库。
  • 半同步:一主多从,某些从库同步,其他从库异步。

复制的主要挑战在于复制延迟,客户端对从库读有可能读到落后的数据。

分区

分区(partitionshard 等)是指将大型数据集划分成若干小部分。

对 key-value 数据的分区方式包括:

  • 范围分区:例如开头字母 A-F 为一组,G-N 为一组,其余字母为一组。
  • 哈希分区(hash-based):通过哈希算法将 key 打散分布到不同的分区。

分区涉及到次级索引则会更复杂,常见方法有:

  • 本地索引:也称为文档分区索引,每个分区只维护自己的次级索引。
  • 全局索引:覆盖所有分区数据。

分区的常见问题有负载偏斜(数据分布不均衡)、热点、分区再平衡等。

常用组件分析

Redis

Redis 在集群模式下,总共划分了 2^14 = 16384 个 slot 数据槽,每个节点可以灵活分配多个 slot。数据被分配到哪个 slot 中,由对 key 进行 CRC16 计算后与 16384 取模决定。这是一种典型的 hash-based 算法。

取模运算最大的缺点就是除数(这里是数据槽的个数 16384)不能轻易改变,因为一旦改变则意味着同样的 key 可能会被分配到不同的槽中,由此会带来大量的数据迁移问题,因此 Redis 的 slot 数量被设计成了固定值。

至于分区再平衡的问题,当集群的节点数量发生改变时,Redis 本身并未提供 slot 自动调整的机制,需要用户手动调整或者使用一些第三方工具自动调整。

Redis 的复制提供了主从机制,以节点为单位,从节点同步主节点的数据,复制过程默认是异步的,可以设置多个从节点,并配置以下参数:

  • min-replicas-to-write:可以同步数据的最少从节点数,满足时才允许主节点进行写操作。
  • min-replicas-max-lag:从节点允许的最大同步延迟(以秒为单位)。
  • replica-read-only:从节点只读,即从节点也可以处理读请求,但是要注意数据延迟导致的一致性问题。

Kafka

Kafka 中的节点叫 broker,分区叫 partition。分区的数量设置后只能增加不能减少。将消息分配到具体的分区的策略有:

  • 默认轮询
  • 基于消息进行 hash
  • 自定义策略

复制以 partition 为单位,可以配置一主多从(多个副本),通过 replica.lag.time.max.ms 参数配置副本同步延迟的最大时间窗口,满足条件的副本统称为 ISR(In-Sync Replicas)。

数据写入受以下影响:

  • 消息生产者 acks 参数:
    • acks 为 0 :不等待 broker 的确认,这意味着消息可能投递不成功,一般不会使用。
    • acks 为 1 :等待 leader partition 确认写入即可,不等待 follower 。
    • acks 为 all 或者 -1 :必须等待 follower 确认。
  • min.insync.replicas 参数:配合 acks=all 使用,确认写入的最少 ISR 副本数。

Kafka 的 follower partition(从分区)不提供消费能力,只用作冗余备份和故障切换。

Elasticsearch

Elasticsearch 中,数据称为 document 文档,分片统称 shard,又细分为 primary shard 主分片和 replica shard 副本分片。

数据默认根据文档 id(也可以配置为文档中的其它值)取哈希,然后与主分片数取模,最后确认文档归属的分片。

只要看到取模运算,就知道分区数不能轻易扩展,没错,ES 里的主分片数是不能修改的。

复制以 shard 为单位,可以配置多个副本分片。副本分片与主分片的数据同步是异步的,可以通过 wait_for_active_shards 参数设置数据写入时需要确认的分片数。副本分片可以处理读请求。

倒排索引

ES 会对文档进行分词后构建倒排索引,此时就涉及到了 DDIA 中描述的分区与次级索引,前文提到有两种构建次级索引的方式:本地索引和全局索引。

ES 使用的是本地索引的方式,即每个 shard 分片内部构建自己的倒排索引。这就引发了另外的问题,当数据分布不均匀时,由于每个分片使用自身的而不是全局的 Term/Document 频率进行相关度打分,因此可能会造成打分偏差,从而影响最终搜索结果的相关性,这种情况就是默认的 search_typequery_then_fetch。而另一种搜索类型 dfs_query_then_fetch 则是先查询每个分片,汇总得到全局的 Term/Document 频率再进行打分,精确度是提高了,但是性能极差,一般也很少使用。

为了解决上述问题,大多会为了性能而容忍偏差,但是通过配置 routing 参数将同样的请求路由到同样的节点(保证同一个用户查询结果一致就行)。

总结

本文通过对 RedisKafkaElasticsearch 三个常用组件的分析,展示了分布式系统中分区和复制机制的设计与实现。

可以看到哈希分区是常见的选择。基于性能和复杂度的权衡,单主异步复制往往是默认配置,但为了提供更高的数据一致性,这些组件也会提供多从复制确认的方案。

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

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

相关文章

python-竞赛技巧(赛氪OJ)

[题目描述] 在 ACM 竞赛中,当遇到有两个队伍(人) 解出相同的题目数量的时候,我们需要通过他们解决问题的总时间进行排序。 一共有 N 条时间被以时( Hours ), 分( Minutes ),秒( Seconds )的形式记录。 你必…

​北斗终端:无人驾驶领域的导航新星

一、北斗终端在无人驾驶领域的应用 北斗终端,作为我国自主研发的北斗卫星导航系统的重要组成部分,其在无人驾驶领域中的应用正逐步显现其独特魅力。北斗系统的高精度、高可靠性和良好的抗干扰性能,为无人驾驶车辆提供了精确的定位和导航服务…

生信圆桌x 生信人论坛:生物信息学爱好者的交流与学习社区

介绍 生信人论坛是一个专为生物信息学(生信)领域的研究人员、学生和爱好者创建的在线社区。在这里,用户可以分享他们的研究经验、讨论最新的生信技术和工具,并向同行请教各种生信分析问题。生信人论坛不仅是一个知识分享的平台&a…

云朵备份:微信的云备份工具

什么是 云朵备份 ? 云朵备份 是一个微信云备份程序,使用云朵备份可以将微信数据备份到服务器,通过浏览器访问数据,你可以像正常使用微信一样浏览数据和搜索数据(参考微信网页版),除了不能发消息…

3d网格补洞算法

1.RBF径向基函数法 原文链接:https://blog.csdn.net/feengg/article/details/80849516 算法流程:   1.检测孔洞边界   三角网格由一系列顶点 V V V ,以及这些顶点所构成的三角面片 F F F所组成,由三角面片可以得到网格的边 E E E。通常一条边连接两个三角面片,这种边…

Spring横向渗透

这篇文章给师傅们分享下,前段时间的一个渗透测试的一个项目,开始也是先通过各种的手段和手法利用一些工具啊包括空间引擎等站点对该目标公司进行一个渗透测试。前面找的突破口很少,不太好搞,但是后面找到了spring全家桶的相关漏洞…

基于图神经网络的EEG分类

摘要 图神经网络(GNN)越来越多地用于情绪识别、运动想象以及神经疾病等任务的脑电信号(EEG)分类。人们已经提出了一系列方法来设计基于GNN的分类器。因此,有必要对这些方法进行系统回顾和分类。本文对已发表的文献进行了详尽地检索,并总结了几种用于比较…

IT统一运维平台案例

功能模块图 运维平台的架构图,划分为三个主要部分:统一运维门户、报告与决策中心、运维服务调度中心。以下是对每个部分的解析: 1. 统一运维门户 这是用户的统一入口,提供了一系列运维相关的服务和功能,包括&#xf…

艾体宝干货丨Redis与MongoDB的区别

Redis(Remote Dictionary Server,远程字典服务器)和 MongoDB 是两类知名的 NoSQL数据库,其以非结构化的方式存储数据。与传统关系数据库使用表格、行和列来组织数据不同,NoSQL数据库采用了不同的数据存储模型。Redis是…

go 系列实现websocket

一、简介 websocket是个二进制协议,需要先通过Http协议进行握手,从而协商完成从Http协议向websocket协议的转换。一旦握手结束,当前的TCP连接后续将采用二进制websocket协议进行双向双工交互,自此与Http协议无关。 二、websocket…

Windows10企业版找不到微软商店以及微软商店打不开问题解决

目录 找不到微软商店解决方案重置缓存安装微软商店 Microsoft Store 无法打开问题 找不到微软商店解决方案 重置缓存 打开设置->应用和功能 找到Microsoft Store(如果没有则需要手动安装),点击高级选项,选择重置,或者管理员下命令行执行 wsreset 安装微软商店 打开 http…

大语言模型-PDF文档解析

PDF解析能够提升大语言模型系统的信息处理能力和应用范围,为用户提供更加便捷、高效、个性化的服务体验。本文介绍三种常用的pdf解析方式:Open Parse、pdfplumber、PyMuPD。 一、Open Parse Open Parse是一个能够直观地识别文档布局并有效地对其进行分…

ruoyi-app前端在缓存中添加nick_name和user_id属性值

需求 ruoyi-app原生自带只有avatar、name、roles、permissions;在显示中,我们大多数需要nick_name、user_id;当然获取方式也可以通过name去调用接口查询,但我想偷个懒。 代码 代码已经调好的,复制即用;至…

中国工商银行笔试2025届考什么?工行笔试备考|附真题库面试攻略

嘿,各位小伙伴们!我是职小豚,今天咱们就来好好聊聊中国工商银行 2025 届秋招那些事儿。 一、中国工商银行公司介绍 中国工商银行,那可是金融界的巨擘!1984 年 1 月 1 日,它横空出世,开启了辉煌…

浅谈【数据结构】树与二叉树之平衡二叉树

目录 1、平衡二叉树 2、平衡操作 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助,一起努力吧!!&#xff…

【与C++的邂逅】--- C/C++内存管理

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 与C的邂逅 C中我们总是提到管理资源,资源可以从内存中申请,前提是我们得知道C对内存管理的布局,本节我们就来学习这块…

民宿管理平台系统

你好,我是计算机专业的毕业生,专注于民宿管理平台系统的研究与开发。如果你对本系统感兴趣或有任何疑问,欢迎随时联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架 工具 ECLIPSE开发环境、Tomcat服务器 系统展示 首页 用户…

联发科双频Wi-Fi 6芯片MT7976CN全景图

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) 天玑助力联发科力压高通~探秘MTK 5G旗舰智能手机SoC芯片——MT6989(天玑9300) 联发科双频Wi-Fi 6芯片MT7976CN全景图 TPLink AX3000路由器 TPLin

论文解读Multi-Prompt Alignment for Multi-Source Unsupervised Domain Adaptation

Multi-Prompt Alignment for Multi-Source Unsupervised Domain Adaptation NeurlIPS 2023 摘要 大多数现有的无监督域适应( UDA )方法依赖于共享网络来提取领域不变特征。无论如何,当面对多个源域时,优化这样的网络涉及更新整个网络的参数&#xff0…

推动RISC-V CPU性能快速提升并向上打开更多的高价值市场

作者:Imagination Technologies 8月21-23日,2024年RISC-V中国峰会在杭州黄龙饭店举行。作为已推出多款Imagination Catapult系列RISC-V CPU半导体知识产权(IP)的提供商,以及全球领先的GPU和AI加速器IP厂商&#xff0c…