【分布式存储】聊一下分布式存储中分片机制

news2024/11/23 6:55:12

为什么需要分片

在服务端领域,主要特点是支撑7*24小时不间断的服务,而最终对各种行为会生产对应的数据,比如用户登陆/注册,发起订单交易、支付、身份验证,短信验证等情况都需要存储起来,其中包括各种各样的数据,而采用格式的存储中间件进行保存数据,可以有效的进行数据查询和存储,比如MySQL支持关系型数据的存储,Redis支持NoSQL,ES支持快速查询等。但是如果只是单实例的话,其实存储的数据是有上限的,即使将一台机器从PC->小型机->大型机,所能存储的数据还是有上限的。所以分片或者分区的本质是为了解决单机存储和性能瓶颈带来的问题,让分布式系统的计算和存储能力可以线性扩展。而数据复制解决的是数据的高可用。
好了既然说明白为什么需要数据分片,那么有哪些形式的数据分片呢?

水平分片/ 垂直分片 / 混合分片

其实目前业界比较主流的分片主要就是水平、垂直、混合三种模式。

水平分片

水平分片是将数据按照水平进行切分数据,比如原来有1000W数据,但是采用水平分片后,可以切分出3个表,第一个表存储前3000W数据,第二个表存储3000W-6000W数据,第三个表存储最后4000W数据。这样就可以实现将单机的存储进行分摊到不同的实例上。
在这里插入图片描述

垂直分片

相对于水平分片来说,垂直分片其实按照列进行切分,比如一个用户表,按照用户id 年龄、性别、体重等进行切分,这种方式按照不同的数据纬度记性切分和保存。但是在数据查询的时候是非常困难,如果设计多个表之间的查询,所以就需要开发出一个数据代理中间件来解决这个问题,而对于中小型公司来说,是不需要垂直分片。在初期,会使用读写分离的数据镜像方式,而后期会采用分库分表的方式。而分库分表的方式大多数也都是采用水平分片的方式。所以说这种方式了解即可。
在这里插入图片描述

混合分片

混合分片其实就是垂直和水平两种结合,一种是垂直在水平,另一种是先水平在垂直。
在这里插入图片描述

水平分片算法

1.范围分片

水平划分其实就是按照数据的一个范围进行划分,比如说存储中国所有人的身份证信息,就是按照省市区级别,分别存储到对应的户籍所在地。这样的方式比较好管理,也方便查询。但是缺点就是数据分布不会平均,比如北京的密度和山西的密度就不是一个数量级。一个是直辖市2000多W的人口,一个是省级3000多W的人口。
优点:可以按照范围快速查找数据。
缺点:数据分布不均匀,数据的存储和访问不均匀。

2.哈希分片

Hash分片其实比较简单,比如用身份证的或者手机号进行数据取余数,比如100个数据库,那么余数是几,就存储到第几号数据库中,这样数据比较分散,但是范围查询不支持,因为只能通过关键字key进行查询。
优点:数据分布存储和查询比较均匀。
缺点:不支持范围查询。其实哈希分片这里还有一个隐藏的问题,如果存储的节点是不固定的话,可能存在删除或者添加节点的情况,那么就会导致整体数据的key需要重新计算。而这个计算和存储是非常耗费性能和资源。那么如何解决的呢?使用一致性哈希

如何选择呢?其实不管是范围分片还是哈希分片,都需要建立的所在业务数据了解的前提下进行选择。如果了解具体业务数据可以根据具体情况决定,但是不了解的话,推荐还是使用哈希分片进行存储,这样不论是数据分布还是访问都不会出现热度不均匀的情况。

3.一致性哈希分片

首先声明下 一致性哈希所解决的问题是用来解决分布式存储中哈希分区删除或者增加节点导致数据大规模移动的问题,是一种特殊的哈希分片算法。在各种存储中间件中,也会出现节点的下线和上线,所以为保证数据可以均匀的落在每个节点上,在发生节点删除和增加的时候,不会出现大规模数据访问和迁移的情况。就需要引入一致性哈希。

核心原理
一致性哈希的原理比较好理解,使用一个哈希函数,构建出一个虚拟环,每个节点都存储在环上。比如Node0、Node1、Node2等。按照顺时针的方向,比如key1存储在Node0上,key2存储在Node2上。
在这里插入图片描述
当出现Node3节点宕机下线时,原本存储在Node3中的数据会按照顺时针的方向落在Node1上,所以即使出现节点的下线和增加节点的情况,也只会影响一部分的节点。但是当出现节点数比较少的时候,那么都会集中趋向于其中几台机器。这样时候并不能很好的数据分布均匀。
基于虚拟节点的一致性哈希算法
其实就是在整个环中将节点的副本构建多个,平均去分担其中的流量,比如Node0 拷贝出2个,分别是Node 0 1 2。那么即使出现下线,也会比较均匀的分布式其中环中的节点上。可以很好的实现数据存储负载的均衡性。
在这里插入图片描述

实际应用

本篇主要介绍了数据存储的分片机制中的几种常见机制,垂直分片、水平分片、混合形式,但是一般常用的方式是采用垂直分片,垂直分片中范围分片、哈希分片,但是哈希分片存在节点的删除和增加导致数据的重新hash,所以进一步进入了一致性哈希,以及基于虚拟界定的一致性哈希算法。
在具体的实际应用中,mysql、redis、Kafka其实都有对应的分片机制,redis中为保证可以存储更多的数据,使用了切片集群的方式。通过使用不同的slot存储数据。具体可以参考 redis切片集群的原理,而kafka中为了保证消息写入Broker的存储高性能,也采用分片机制存储数据。比如将一个消息ABC,会进行存储到不同的broker节点上,保证数据的高性能。Kafka topic分区机制原理,当然了,其实其他的存储中间件也肯定有相关的机制,这个后边学到别的在进行统一汇总。

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

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

相关文章

浏览器工作原理分析与首屏加载

正文 1. 页面加载时间线 我们先来一个老生常谈的面试题:从输入 URL 到页面加载完成的过程中都发生了什么事情? 这个面试题本身也是一个开放题,不同方向的工程师侧重也不一样。大抵的过程可以简化为: st>start: 输入URL e>…

WPS表格处理

wps表格中公式出来的内容如何转为纯文本 选中公式算出的结果区域,复制,在原区域上右键,选择性粘贴为数值,就转成文本了,当然公式也就消除了。 wps表格如何设置整列公式? 1、先来看看下面这个例子需做出商…

图像分割算法

文章目录 前言1. 基于区域的分割方法1.1 区域生长算法1.2 区域分裂合并算法1.3 分水岭算法1.3.1 分水岭算法原理1.3.2 opencv-python中分水岭算法的应用 2. 基于图的分割方法2.1 Grabcut图像分割 源码仓库地址 前言 图像分割是指将图像分成若干互不重叠的子区域,使…

如何卸载MySQL数据库以及删除所有有关信息

目录 前言 第一步 卸载mysql程序 第二步 删除安装目录的mysql项目 第三步 删除MySQL的相关注册表 第四步 删除C盘下的 C:\ProgramData\MySQL所有的文件 第五步 删除 C:\Documents and Settings\All Users\Application Data\MySQL 下的文件夹 第六步 重启电脑 尾语 前言…

使用crictl pull时报错:“unknown service runtime.v1alpha2.ImageService”

如有错误,敬请谅解! 此文章仅为本人学习笔记,仅供参考,如有冒犯,请联系作者删除!! 引言: crictl 是 kubernetes cri-tools 的一部分,是专门为 kubernetes 使用 …

【详解】String、StringBuffer、StringBuilder的基本用法及区别

一、String 1.常用的输入方式 Scanner in new Scanner(System.in); //输入方法一 String s1 in.next(); //in.next(): 读到空格就停止扫描(输入)。//输入方法二 String s2 in.nextLine(); //in.nextLine():读到回车就停止扫描…

Avalon 学习系列 (一) —— 初步入门

相关链接 Avalon github地址 Avalon 快速入门 基于 Avalon的组件库-OniUI Avalon 入门教程 Avalon CDN 简介 Avalon 是司徒正美开发和维护的一款基于虚拟 DOM 与属性劫持的迷你、 易用、 高性能 的 前端 MVVM 框架,最早发布于2012.09.15。 其拥有超优秀的兼容性&a…

Python中的模块包第三方库详解

模块&包 模块 一个.py文件就是一个模块,里面是一些函数和变量,需要的时候可以导入。 模块命名规范: 1.以英文开头,不出现中文 2.模块名不应与系统内置函数重名 包 包本身就是一个文件夹,如果文件夹内有__init__.py文件&…

浅谈iic时序

一、iic通信核心要点 在iic通信中,进行数据传输的时候,遵循在scl时钟线高的时候保持sda电平稳定,这个电平值就是要写入的值,然后,在scl时钟线拉低的时候去改变sda上的值,达到自己想要输出的值 所以说&…

如何做架构设计

1、设计很重要 我们可以看一下周边的事物,那些好的东西,他们并不会天然存在,都是被设计出来的,因此设计就是创造和改善事物的重要过程。设计的重要之处在于,最初的设计往往决定最终的结果,甚至决定着事物的…

端口扫描伪装技术实践

端口扫描伪装技术实践 1.-f(分段传输)2.-mtu(使用指定的MTU)3.-D(使用诱饵主机隐蔽扫描)4.--source-port(源端口欺骗)5.--data-length (发送报文时附加随机数据&#xff…

入职字节外包一个月,我离职了····

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

电子元器件解析02之电容(二)——电容分类与应用场景

书接上文:电子元器件解析02之电容(一)——定义与性能参数:https://blog.csdn.net/weixin_42837669/article/details/131142286 摘要 本文总结了各种不同介质电容的特性,包括陶瓷电容、电解电容、薄膜电容等;同时对一些特殊场合的电…

Hadoop Distributed System (HDFS) 写入和读取流程

一、HDFS HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB,GB以及TB,并写一次读多次的场合。而对于低延时数据访问、大量小文件、同时写和任意的文件修改,则并不是十分适合。 目前HDFS支持的使用…

HTTP协议【网络基础/应用层】

文章目录 1. 网络基础 TCP/IP2. 与HTTP密切相关的协议2.1 负责传输的 IP 协议路由选择 2.2 确保可靠性的 TCP 协议三次握手 2.3 负责域名解析的 DNS 服务2.4 各种协议和 HTTP 协议的关系 3. URL和编码问题3.1 介绍格式 3.2 编码问题 4. 初识 HTTP 协议4.1 C-S 模式4.2 通过响应…

vue中开发包、生产包、全局包的区别以及安装语法

目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包:开发包 (Development build),生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…

EVE-NG 平台搭建以及发布“Ruijieroute”“Ruijieswitch”

下载相关资源 1、锐捷模拟器镜像文件:锐捷镜像官方下载链接 2、VMware虚拟化平台:可以是VMware vSphere、也可以是VMware Workstation:VMware Workstation Pro官方下载链接 当然,我们也可以使用其他虚拟化平台:Orac…

什么,你还在用 momentJs 处理相对时间

我想&#xff0c;下面这段代码&#xff0c;你是不是在开发中常常这样使用来计算距离现在过去了多长时间&#xff1a; import moment from moment // 61k (gzipped:19.k) function Relative(props) {const timeString moment(props.date).fromNow()return <>{timeString…

Tomcat实现ThreadPoolExecutor和JDK线程池区别

1.1 tomcat线程池和juc线程池流程 jdk 线程池策略&#xff1a; 当线程池中线程数量小于 corePoolSize&#xff0c;每来一个任务&#xff0c;就会创建一个线程执行这个任务当前线程池线程数量大于等于 corePoolSize&#xff0c;则每来一个任务&#xff0c;会尝试将其添加到任务…

深入理解深度学习——注意力机制(Attention Mechanism):位置编码(Positional Encoding)

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…