分布式数据存储系统的三要素

目录
  • 前言
  • 什么是分布式数据存储系统?
  • 分布式数据存储系统三要素
    • 顾客:生产和消费数据
    • 导购:确定数据位置
    • 货架:存储数据
  • 知识扩展:业界主流的分布式数据存储系统有哪些?
  • 总结

前言

CAP 理论指出,在分布式系统中,不能同时满足一致性、可用性和分区容错性,指导了分布式数据存储系统的设计。

随着数据量和访问量的增加,单机性能已经不能满足用户需求,分布式集群存储成为一种常用方式。把数据分布在多台存储节点上,可以为大规模应用提供大容量、高性能、高可用、 高扩展的存储服务。而分布式存储系统就是其具体实现。

分布式存储系统的关键三要素:顾客、导购与货架。

什么是分布式数据存储系统?

分布式存储系统的核心逻辑:将用户需要存储的数据根据某种规则存储到不同的机器上,当用户想要获取指定数据时,再按照规则到存储数据的机器里获取。

如下图所示,当用户(即应用程序)想要访问数据 D,分布式操作引擎通过一些映射方式,比如 Hash、一致性 Hash、数据范围分类等,将用户引导至数据 D 所属的存储节点获取数据。

获取数据的整个过程与商店购物的过程类似,顾客到商店购物时,导购会根据顾客想要购买的商品引导顾客到相应的货架,然后顾客从这 个货架上获取要购买的商品,完成购物。这里的顾客就是图中的应用程序,导购就相当于分布式操作引擎,它会按照一定的规则找到相应的货架,货架就是存储数据的不同机器节点。

这个过程就是分布式存储系统中获取数据的通用流程,顾客、导购和货架组成了分布式存储系统的三要素,分别对应着分布式领域中的数据生产者 / 消费者、数据索引和数据存储。

分布式数据存储系统三要素

顾客就是数据的生产者和消费者,顾客代表两类角色,生产者会生产数据(比如, 商店购物例子中的供货商就属于生产类顾客),将数据存储到分布式数据存储系统中,消费者是从分布式数据存储系统中获取数据进行消费(比如,商店购物例子中购买商品的用户就属于消费类顾客);导购就是数据索引,将访问数据的请求转发到数据所在的存储节点;货架就是存储设备,用于存储数据。

顾客:生产和消费数据

顾客相当于分布式存储系统中的应用程序,而数据是应用程序的原动力。根据数据的产生和使用,顾客分为生产者和消费者两种类型。生产者负责给存储系统添加数据,而消费者则可以使用系统中存储的数据。

就像是火车票存储系统,铁路局就相当于生产者类型的顾客,而乘客就相当于消费者类型的顾客。铁路局将各个线路的火车票信息发布到订票网站的后台数据库中,乘客通过订票网站访问数据库,来进行查询余票、订票、退票等操作。

生产者和消费者生产和消费的数据通常是多种多样的,不同应用场景中数据的类型、格式等都不一样。根据数据的特征,这些不同的数据通常被划分为三类:结构化数据、半结构化数据和非结构化数据:

结构化数据:指关系模型数据,其特征是数据关联较大、格式固定。火车票信息比如起点站、终点站、车次、票价等,就是一种结构化数据。结构化数据具有格式固定的特征,因此一般采用分布式关系数据库进行存储和查询。半结构化数据:指非关系模型的,有基本固定结构模式的数据,其特征是数据之间关系比较简单。比如 HTML 文档,使用标签书写内容。半结构化数据大多可以采用键值对形式来表示,比如 HTML 文档可以将标签设置为 key,标签对应的内容可以设置为 value,因此一般采用分布式键值系统进行存储和使用。非结构化数据:指没有固定模式的数据,其特征是数据之间关联不大。比如文本数据就是一种非结构化数据。这种数据可以存储到文档中,通过 ElasticSearch(一个分布式全文搜索引擎)等进行检索。

导购:确定数据位置

导购是分布式存储系统必不可少的要素,如果没有导购, 顾客就需要逐个货架去寻找自己想要的商品。如果去订票网站订火车票,按照自己的需求点击查询车票后,系统会逐个扫描分布式存储系统中每台机器的数据,寻找你想要购买的火车票。如果系统中存储的数据不多,响应时间也不会太长,毕竟计算机的速度还是很快的;但如果数据分布在几千台甚至上万台机器中,系统逐个机器扫描后再给你响应,严重影响购票体验。

因此在分布式存储系统中,必须有相应的数据导购,否则系统响应会很慢,效率很低。为解决这个问题,数据分片技术就走入了分布式存储系统中。

数据分片技术:指分布式存储系统按照一定的规则将数据存储到相对应的存储节点中,或者到相对应的存储节点中获取想要的数据,优点:

降低单个存储节点的存储和访问压力;通过规定好的规则快速找到数据所在的存储节点,从而大大降低搜索延迟,提高用户体验。

当铁路局发布各个线路的火车票信息时,会按照一定规则存储到相应的机器中, 比如北京到上海的火车票存储到机器 A 中,西安到重庆的火车票存储到机器 B 中。当乘客查询火车票时,系统就可以根据查询条件迅速定位到相对应的存储机器,然后将数据返回给用户,响应时间就大大缩短了。如图所示,当查询北京 - 上海的火车票相关信息时,可以与机器 A 进行数据交互。

例子中按照数据起点、终点的方式划分数据,将数据分为几部分存储到不同的机器节点中,就是数据分片技术的一种。当查询数据时,系统可以根据查询条件迅速找到对应的存储节点,从而实现快速响应。 还有其他很多数据分片的方案。比如,按照数据范围,采用哈希映射、一致性哈希环等对数据划分。

针对数据范围的数据分片方案:按照某种规则划分数据范围,然后将在这个范围内的数据归属到一个集合中。这就好比数学中通常讲的整数区间,比如 1~1000 的整数,[1,100] 的整数属于一个子集、[101,1000] 的整数属于另一个子集。

对于前面讲的火车票的案例,按照数据范围分片的话,可以将属于某条线的所有火车票数据划分到一个子集或分区进行存储,比如机器 A 存储京广线的火车票数据,机器 B 存储京沪线的火车票数据。数据范围的方案是按照范围或区间进行存储或查询。

如图所示,当用户查询北京 - 上海的火车票相关信息时,首先判断查询条件属于哪个范围,由于北京 - 上海的火车线路属于京沪线,因此系统按照规则将查询请求转到存取京沪线火车票数据的机器 B,然后由机器 B 进行处理并给用户返回响应结果。

为了提高分布式系统的可用性与可靠性,除了通过数据分片减少单个节点的压力外,数据复制也是一个非常重要的方法。数据复制是将数据进行备份,以使得多个节点存储该数据

数据复制和数据分片技术的区别:

数据 A 被拆分为两部分存储在两个节点 Node1 和 Node2 上,属于数据分片;数据 B 同一份完整的数据在两个节点中均有存储,就属于数据复制。

在实际的分布式存储系统中,数据分片和数据复制通常是共存的:

数据通过分片方式存储到不同的节点上,以减少单节点的性能瓶颈问题;而数据的存储通常用主备方式保证可靠性,对每个节点上存储的分片数据,采用主备方式存储,以保证数据的可靠性。主备节点上数据的一致,是通过数据复制技术实现的。

Kafka 集群消息存储架构图,消息数据以 Partition(分区)进行存储,一个 Topic(主题)可以由多个 Partition 进行存储,Partition 可以分布到多个 Broker 中;同时,Kafka 还提供了 Partition 副本机制(对分区存储的信息进行备份,比如 Broker 1 中的 Topic-1 Partion-0 是对 Broker 0 上的 Topic-1 Partition-0 进行的备份),从而保证了消息存储的可靠性。

货架:存储数据

货架是用来存储数据的,因为数据是由顾客产生和消费的,因此货架存储的数据类型与顾客产生和消费的数据类型是一致的,即包括结构化数据、半结构化数据和非结构化数据。

针对这三种不同的数据类型,存储“货架”划分为三种:

分布式数据库:通过表格来存储结构化数据,方便查找。常用的分布式数据库有 MySQL Sharding、Microsoft SQL Azure、Google Spanner、Alibaba OceanBase 等。分布式键值系统:通过键值对来存储半结构化数据。常用的分布式键值系统有 Redis、 Memcache 等,可用作缓存系统。分布式存储系统:通过文件、块、对象等来存储非结构化数据。常见的分布式存储系统 有 Ceph、GFS、HDFS、Swift 等。

对存储介质的选择,本质是选择将数据存储在磁盘还是内存(缓存) 上:

磁盘存储量大,但 IO 开销大,访问速度较低,常用于存储不经常使用的数据。比如,电商系统中,排名比较靠后或购买量比较少、甚至无人购买的商品信息,通常就存储在磁盘上。内存容量小,访问速度快,因此常用于存储需要经常访问的数据。比如,电商系统中, 购买量比较多或排名比较靠前的商品信息,通常就存储在内存中。

知识扩展:业界主流的分布式数据存储系统有哪些?

货架针对结构化数据、半结构化数据和非结构化数据,分别对应不同的“货架”,即分布式数据库、分布式键值系统和分布式文件系统进行存储。

主流的分布式数据库,主要包括 MySQL Sharding、SQL Azure、 Spanner、OceanBase 等。

主流的分布式存储系统,主要包括 Ceph、GFS、HDFS 和 Swift 等。

总结

分布式数据存储系统的三要素,即顾客、导购和货架,对应到分布式领域的术语就是数据生产者 / 消费者、数据索引和数据存储。

顾客包括产生数据的顾客和消费数据的顾客两类;导购是数据索引引擎,包括数据存储时确定数据位置,以及获取数据时确定数据所在位置;货架负责数据存储,包括磁盘、缓存等存储介质等。

不同应用场景中,顾客产生的数据类型、格式等通常都不一样。根据数据的特征,这些不同的数据可以被划分为三类:结构化数据、半结构化数据和非结构化数据。与之相对应的,货架也就是数据存储系统,也包括三类:分布式数据库、分布式键值系统和分布式文件系统。

到此这篇关于分布式数据存储系统的三要素的文章就介绍到这了,更多相关分布式数据存储系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 分布式文档存储数据库之MongoDB备份与恢复的实践详解

    前文我们聊了下mongodb的访问控制以及用户创建和角色分配,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13974656.html:今天我们来了解下mongodb的备份与恢复 为什么要备份? 备份的目的是对数据做冗余的一种方式,它能够让我们在某种情况下保证最少数据的丢失:之前我们对mongodb做副本集也是对数据做冗余,但是这种在副本集上做数据冗余仅仅是针对系统故障或服务异常等一些非人为的故障发生时,保证数据服务的可用性:它不能够避免人为的误操作:为了

  • 分布式文档存储数据库之MongoDB访问控制的操作方法

    上一篇博客主要聊了下mongodb的分片机制以及分片集群的搭建,回顾请参考https://www.jb51.net/article/199845.htm:今天我们来了解下mongodb的访问控制: 什么是访问控制? 简单讲访问控制就是指,哪些用户可以访问哪些资源,对资源有哪些操作(权限):在mongodb中我们把数据库.或者集合叫做资源:也就说访问控制是用来限制某些用户对数据库或集合的操作:我们在mysql数据库中,我们通过给账号授权的方式达到控制哪些用户可以从哪些主机访问数据库,对数据库有哪些

  • 分布式数据存储系统的三要素

    目录 前言 什么是分布式数据存储系统? 分布式数据存储系统三要素 顾客:生产和消费数据 导购:确定数据位置 货架:存储数据 知识扩展:业界主流的分布式数据存储系统有哪些? 总结 前言 CAP 理论指出,在分布式系统中,不能同时满足一致性.可用性和分区容错性,指导了分布式数据存储系统的设计. 随着数据量和访问量的增加,单机性能已经不能满足用户需求,分布式集群存储成为一种常用方式.把数据分布在多台存储节点上,可以为大规模应用提供大容量.高性能.高可用. 高扩展的存储服务.而分布式存储系统就是其具体实

  • Go语言依赖管理三要素示例解析

    目录 背景 GOPATH 模式 GO Vendor模式 Go Module模式 依赖管理三要素 依赖配置 go.mod go mod命令 go get命令 快速使用go module 小结 背景 开发项目时应学会站在巨人的肩膀上,即有效利用开发组件进行或工具提升自己的研发效率 对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发 对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上 工程项目不可能基于标准库0-1编码搭建 管理依赖库 GOPATH 模式 GOPATH为环境变量 包

  • 网络测试三要素识别 验证 认证

    在这个世界上十拿九稳的事情不多,但每个网络和布线工程完工后必须经过测试是确定无疑的.没有测试,就无从知晓网络线缆实际的数据传输能力和今后网络设备投入运行后的工作状况.而且,每一个网络维护和管理人员都不愿意对自己的网络系统一无所知. 在过去的十几年时间里,因为用户的需求,布线测试的方法和能力已经随着新技术和标准的发展而发生改变.在某些方面,变化是显而易见的,而在另外一些方面,布线安装人员和最终用户很难分辨和了解这些日新月异的变化.这篇文章的目的就是在不同层面上定义和描述当前网络的测试方法以及这些方

  • Apache Shiro 使用手册(三) Shiro授权

    如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三个核心元素:权限.角色和用户. 权限 权限是Apache Shiro安全机制最核心的元素.它在应用程序中明确声明了被允许的行为和表现.一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限. 大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的资源上才是有意义的.因此,权限声明的根本思想就是建立在资源

  • Java事件机制要素及实例详解

    java事件机制中包含下述三要素: 1.事件,发生了什么事,比如用户在界面上的一个操作(手势滑动屏幕),当一个事件发生的时候,该事件用一个事件对象表示,每一个事件对象都有其对应的事件类. Java中事件一般继承自java.util.EventObject类,封装了事件源对象,以及事件的相关信息. 每一类事件有一个相应的事件监听器接口,该接口定义了接收和处理事件的抽象方法.实现该接口的类,就是监听器类.其对象可作为监听器对象向相应的组件注册.事件的类名通常为:XxxEvent ,比如下面实例中的C

  • python之sqlalchemy创建表的实例详解

    python之sqlalchemy创建表的实例详解 通过sqlalchemy创建表需要三要素:引擎,基类,元素 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String 引擎:也就是实体数据库连接 engine = create_engine('mysql+pymysql://go

  • iOS开发中音频视频播放的简单实现方法

    前言 我们在平时的iOS开发中,音视频的播放有很多种,目前系统的自带的都属于 AVFoundation 框架,更加接近于底层,所以灵活性很强,更加方便自定义 还有就是第三方音视频视频播放,特点是功能强大,实现简单,支持流媒体,下面来逐一介绍,给大家参考学习,下面来一起看看详细的介绍吧. 播放系统音效或者短音效 注意: 这里的资源长度最多30秒 资源必须在 Target --> Build Phases --> Copy Bundle Resources 引入资源文件,否则获取不到文件 if l

  • ASP.NET MVC HtmlHelper如何扩展

    一.ASP.NET 扩展方法三要素 (1).静态类 可以从下图看出,InputExtension首先是一个静态类: (2).静态方法 既然是静态类,那么其所有的方法必然都是静态方法,例如:public static MvcHtmlString CheckBox(): (3).this关键字 可以从方法名定义中看出,第一个参数都是this HtmlHelper htmlHelper,代表对HtmlHelper类的扩展: 二.通过 MVC  HtmlHelper扩展 实例简单说明扩展步骤 实例1.扩

  • java Freemarker页面静态化实例详解

    Freemarker FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等. 目前企业中:主要用 Freemarker 做静态页面或是页面展示 总结:freemarker 模版引擎,可以使用 Freemarker 模版生成 html 页面. Freemarker 语法 /*

  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jquery的ajax方法与jquery.form.js中的ajaxSubmit方法的参数,具体细节将在下一篇博客中分享. 重点: html表格三要素: action="fileUpload/fileUpload" method="post" enctype="mul

随机推荐