「阅读」数据密集型系统设计 第六章 分区

2024-08-25 01:28

本文主要是介绍「阅读」数据密集型系统设计 第六章 分区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 6.1 介绍
  • 6.2 如何实现分区?
    • 6.2.1 键值数据分区
    • 6.2.2 分区和次级索引
      • 次级索引的分区问题
      • 方案一:基于文档的分区-本地索引
      • 方案二:基于关键词的分区-全局索引
    • 6.2.3 分区再平衡问题 && 解决方案
      • 问题介绍
      • 策略一:hash && Mod N(不推荐)
      • 策略二:固定数量分区
      • 策略三:动态分区
      • 策略四:按照节点比例分区

6.1 介绍

  1. 什么是分区?
    分区是通过特定列的值将数据划分为逻辑独立的部分,每个分区是一个数据子集。
    常见的可以用于分区的维度:时间、地理位置、类别等
  2. 分区的好处?
    1. 提高查询性能:只扫描某个表而不是整张表
    2. 提高管理和维护数据的能力:数据通过某个维度进行组织。
  3. 为什么有分区技术?
    分区技术的初衷:针对海量数据场景,提高获取/更新数据的性能
    分区技术和可伸缩性契合。

6.2 如何实现分区?

6.2.1 键值数据分区

目标

将数据和查询负载均匀分布到各个节点中。

方案一:随机分配
随机分配可以保证负载均衡,但是当读取一个特定值时,无法知道该值在那个分区,只能遍历全表。

方案二:根据键的范围分区
定义:每个分区定义一个最小值和最大值。
优点:

  1. 查询时可以找到迅速找到分区
    缺点:
  2. 数据分布无法保证均匀,可能会导致某个(些)分区成为“热点”

方案三:散列(hash)分区–一致性哈希算法
优点:

  1. 可以公平的分配键,负载比较均衡
    缺点:
  2. 范围查询性能没有提升

6.2.2 分区和次级索引

次级索引的分区问题

当前数据库,例如 mysql、oracle 中,分区键中必须是主键的一部分,因此主键是可以快速定位到分区的。

但是次级索引列和分区键可能是两个不同的列,通过次级索引列的每次操作,就需要对所有数据进行操作。
参考资料:mysql 分区键为什么必须是主键的一部分

方案一:基于文档的分区-本地索引

在这里插入图片描述

这种索引优点:

  • 每个分区完全独立,只需要处理当前分区中的信息

缺点

  • 不会将某种特定的 key 放在一起(color 所有数据),导致搜索时必须全表扫描

应用的数据库如 MongoDB、Elasticsearch 等。

方案二:基于关键词的分区-全局索引

在这里插入图片描述

构建一个覆盖所有分区数据的全局索引。全局索引也不可以放在一个节点上,需要进行分区。

优点:

  • 读取效率更高

缺点:

  • 写入速度慢 && 复杂
  • 需要跨分区的事务

6.2.3 分区再平衡问题 && 解决方案

问题介绍

随时间推移,数据库以下情况都需要数据 && 请求从一个节点转移到另一个节点种,将负载从一个节点转移到另一个节点的过程称为再平衡

  • 查询吞吐量增加
  • 数据集大小增加
  • 机器故障

再平衡目标:

  • 负载应该公平
  • 再平衡进行中,服务可用
  • 节点间移动的数据应该尽量少

策略一:hash && Mod N(不推荐)

策略执行:先对 key 进行 hash,对结果通过 mod n 分区。

节点数量 n 增加时,大量原有数据必须迁移,成本过大。

策略二:固定数量分区

分区数量 > 节点数量,每个节点分配多个分区。

![[Pasted image 20240824224624.png]]

优点:

  • 分区在节点种移动
  • 分区总数不变
    缺点:
  • 无法很好的评估分区数量

策略三:动态分区

采用关键字区间分区的数据库,如果边界设置有问题,可能导致数据倾斜到一个分区中。

  • 按键的范围进行分区的数据库(如HBase和RethinkDB)会动态创建分区。
  • 当分区增长到超过配置的大小时(在HBase上,默认值是10GB),会被分成两个分区,每个分区约占一半的数据。
  • 与之相反,如果大量数据被删除并且分区缩小到某个阈值以下,则可以将其与相邻分区合并。此过程与B树顶层发生的过程类似。
    优点:
  • 分区数量适应总数据量
    缺点:
  • 空数据库从 1 个分区开始,导致所有写入必须单个节点处理,其他节点空闲。

策略四:按照节点比例分区

动态分区和固定数量的分区,分区数量都与节点数量无关。
Cassandra和Ketama使用的第三种方法是使分区数与节点数成正比:每个节点有固定数量的分区。

  • 当节点数不变,分区大小与数据集大小成比例增长;
  • 当节点数改变,分区大小将变小。

操作方式:

  • 当一个新节点加入集群时,它随机选择固定数量的现有分区进行拆分,然后占有这些拆分分区中每个分区的一半,同时将每个分区的另一半留在原地。
  • 随机化可能会产生不公平的分割,但是平均在更大数量的分区上时,新节点最终从现有节点获得公平的负载份额。
  • 随机选择分区边界要求使用基于散列的分区(可以从散列函数产生的数字范围中挑选边界)。实际上,这种方法最符合一致性哈希的原始定义。

这篇关于「阅读」数据密集型系统设计 第六章 分区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104169

相关文章

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro