分布式系统之数据存储&分布概览

 

零、数据分类

  1、非结构化数据:文本,图片,音频,视频等。这类数据一般称为Blob(Binary Large Object, 二进制大对象)。

  2、结构化数据:可用表结构表示,具有相应的模式(Schema:如属性,数据类型和数据间的联系),模式和内容分开,需预先定义。一般存储在关系型数据库中。

  3、半结构化数据:介于结构化和非结构化数据直接。具有自描述性,模式和内容混在一起,如HTML。

一、分布式存储系统

  1、分布式文件系统:存储文本,图片,音视频等非结构化数据。如google的GFS/colossus和开源的hdfs。

  2、分布式键值系统:存储简单的半结构化数据。NoSql的分布式扩展,只提供基于key的增删改查(CRUD)功能。如Amazon的Dynamo。

  3、分布式表格系统:存储复杂的半结构化数据。相较于分布式kv系统,他还支持基于key的范围查找。但相对于关系型数据库,他不支持复杂的操作,如多表关联,嵌套查询。典型的系统如google的bigtable和开源的hbase。

  4、分布式数据库:存储结构化数据。分布式的关系型数据库。提供SQL关系查询语言。如:google的spanner和开源的hive。

二、单机存储引擎

  存储系统提供的基本功能包括:增删改查(CRUD)。不同的存储方案根据业务不同侧重点不同,导致存储系统的性能和功能具有一定的差异。

目前主要的单机存储引擎有:

  1、哈希存储:hash的CRUD是最快的。但缺点是不支持顺序扫描。bitcask是一个基于hash表结构的存储系统。他将写操作(包括删除标识)追加到文件尾。并定期合并新老文件&记录。

  2、B树:笔者曾经思考过既支持随机读取又支持范围查找的系统。个人结论是B树就是为此而生。查找时间复杂度为logd(n)(d为每个节点的出度)。Mysql的InnoDB的引擎和OS的文件系统使用的就是B+树。(为什么选择使用B树的变种B+树,读者有兴趣可以去探究下。提示:磁盘读取)

  3、LSM树(Log Structured Merge Tree):由B+数改进而来。其思想为:将增量写操作保存在内存中,超过阈值时刷入磁盘,从而减少随机写磁盘操作。读操作则需要合并磁盘数据和内存中的写操作。通过Memtable/SSTable实现,实现细节在此不做深入探究。比较适合写操作较多的业务场景。HBase中的列簇的数据存储方式采用的即是LSM树。

三、分布式系统的数据分布

  上面讲的仅仅是单机的存储引擎,在分布式系统上,最基本的一个问题就是如何对数据分片。主要有两种数据分布方式:

  1、哈希分布:比较适用于键值系统。和单机的hash存储一样,缺点是不支持顺序扫描。哈希的选取比较重要:

    a) 若随机散列,可能同个用户的多条记录落在不同的节点中,同时操作一个用户的多条记录将比较困难。

    b) 按用户散列时,当用户数据分布不均时,可能导致数据倾斜。单节点压力将会较大。

      而传统的哈希算法还有一个较严重的问题是:当有节点失效或者需要新增节点时(非成倍增加),所有的节点数据都要重新分布,造成大量的数据迁移。解决这个问题的方法是采用大家耳熟能详的"一致性哈希"。具体笔者下一节进行细节描述。

  2、顺序分布:适用于分布式表格系统/分布式关系数据库。优点不言而喻:支持范围扫描。类似于B+树,总控服务器负责数据的分布,维护着类似B+树的一套索引结构,根(root)表维护着元(meta)数据表的位置信息, 元(meta)数据表维护着用户(user)的真实数据表的位置信息。user表随着增删的操作,需要根据表的大小变化进行拆分和合并操作,并将表的变化操作记录于元(meta)数据表。

--------------------------END----------------------------------

时间: 2024-12-29 07:38:14

分布式系统之数据存储&分布概览的相关文章

客户端(浏览器端)数据存储技术概览

客户端(浏览器端)存储数据有诸多益处,最主要的一点是能快速访问(网页)数据.目前常见的浏览器端数据存储方法有:Cookies,Local Storage,Session Storage,IndexedDB. Cookies Cookies 是一种在文档内存储字符串数据最典型的方式.一般而言,cookies 会由服务端发送给客户端,客户端存储下来,然后在随后让请求中再发回给服务端.这可以用于诸如管理用户会话,追踪用户信息等事情. 此外,客户端也用使用 cookies 存储数据.因而,cookies

带着问题学习分布式系统之数据分片

在前文中,提出了分布式系统(尤其是分布式存储系统)需要解决的两个最主要的问题,即数据分片和数据冗余,下面这个图片(来源)形象生动的解释了其概念和区别: 其中数据即A.B属于数据分片,原始数据被拆分成两个正交子集分布在两个节点上.而数据集C属于数据冗余,同一份完整的数据在两个节点都有存储.当然,在实际的分布式系统中,数据分片和数据冗余一般都是共存的. 本文主要讨论数据分片的三个问题: (1)如何做数据分片,即如何将数据映射到节点 (2)数据分片的特征值,即按照数据中的哪一个属性(字段)来分片 (3

Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考

Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考 在计算机世界中经常需要与数据打交道,这也是我们戏称CURD工程师的原因之一.写了两年代码,接触了不少存储系统,Redis.MySQL.Kafka.Elasticsearch-慢慢地发现背后的一些公共的设计思想总是那么似曾相识,再深究一下,就会发现一些隐藏在这些系统背后的数学理论. 生活中产生的大量数据需要交由计算机来处理,根据处理方式的不同分为OLTP和OLAP两大类应

Redis数据存储解决方案

1.背景1.1 Redis简介 官方网站:http://redis.io/,Redis是REmote DIctionary Server的缩写. Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主持.它跟 memcached 类似,不过数据可以持久化,而且支持的数据类型很丰富.它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点.从而

Atitit  数据存储的分组聚合 groupby的实现attilax总结

Atitit  数据存储的分组聚合 groupby的实现attilax总结 1. 聚合操作1 1.1. a.标量聚合 流聚合1 1.2. b.哈希聚合2 1.3. 所有的最优计划的选择都是基于现有统计信息来评估3 1.4. 参考资料3 1. 聚合操作 聚合也是我们在写T-SQL语句的时候经常遇到的,我们来分析一下一些常用的聚合操作运算符的特性和可优化项. 1.1. a.标量聚合 流聚合 标量聚合是一种常用的数据聚合方式,比如我们写的语句中利用的以下聚合函数:MAX().MIN().AVG().C

wp8.1 Study10:APP数据存储

一.理论 1.App的各种数据在WP哪里的? 下图很好介绍了这个问题.有InstalltionFolder, knownFolder, SD Card... 2.一个App的数据存储概览 主要分两大部分,InstallationFolder和App Data Folder 3.Windows.Storage.ApplicationData  和  Windows.Security.Credentials简述 其中利用Windows.Storage.ApplicationData,我们可以获得3种

Spark的数据存储

Spark数据存储的核心是弹性分布式数据集(RDD). RDD可以被抽象地理解为一个大的数组(Array),但是这个数组是分布在集群上的. 逻辑上RDD的每个分区叫一个Partition. 在Spark的执行过程中,RDD经历一个个的Transfomation算子之后,最后通过Action算子进行触发操作. 逻辑上每经历一次变换,就会将RDD转换为一个新的RDD,RDD之间通过Lineage产生依赖关系,这个关系在容错中有很重要的作用. 变换的输入和输出都是RDD.RDD会被划分成很多的分区分布

用HAWQ轻松取代传统数据仓库(七) —— 存储分布

在HAWQ中创建一个表时,应该预先对数据如何分布.表的存储选项.数据导入导出方式和其它HAWQ特性做出选择,这些都将对数据库性能有极大影响.理解有效选项 的含义以及如何在数据库中使用它们,将有助于做出正确的选择. 一.数据存储模型        create table的with子句用于设置表的存储选项.例如: db1=# create table t1 (a int) with db1-# (appendonly=true, db1(# blocksize=8192, db1(# orient

开源跨平台数据格式化框架概览

说到数据格式化框架,就不得不提到 Google 的 Protocol Buffers,Facebook 的 Thrift,还有 Apache Hadoop 推出的 Avro.Microsoft 最近开源的 Bond 也是一种用于数据格式化的可扩展框架,其适用的应用场景包括服务间通信.大数据存储和处理等. 为什么会有这么多关于数据格式处理的框架?它们都在解决什么问题呢?我们先来观察一下典型的服务间通信的结构. 通常,在设计服务间通信时,我们所要面对的基本问题有: 如何传输数据? 使用什么协议通信?