分布式系统的数据结构

常用的数据结构包括:数组,队列,堆栈,链表,树(平衡二叉树,B树,Trie树,堆),哈希表,图,后缀数组,等等。其中,堆,图结构,Trie树及后缀数组解决特定问题,其它数据结构解决通用的查找,更新,删除操作。

查找,更新和删除操作一般是O(1),O(logN)或者O(N),通用的数据结果大致可分为如下三种:

1, 极端型;某些操作的算法复杂度为O(1),另外一些算法复杂度为O(N),比如有序链表查找复杂度为O(N),更新和删除为O(1);

2, 平衡型:主要操作的复杂度为O(logN),比如平衡二叉树及各种变种,B树的查找,更新和删除操作的复杂度都为O(logN);

3, 取巧型:主要指哈希表,最差情况下的算法复杂度虽然很高,但是只要hash函数计算hash值比较随机,插入、更新和删除操作都可以在常数时间内完成,当然,有所得必有所失,哈希数据结构牺牲的是范围查询功能;

虽然数据结构很多,然后当数据量变大时,比如达到百万级别或者千万级别时,工程实践中常见的数据结构一般有两种:Hash表与平衡树,平衡树主要使用B树,这时因为B树同时适应磁盘和内存。Hash数据结构实现简单,高效,可以高效地执行根据主键的插入、删除以及查找操作,当然,相比B树,Hash数据结构也有一些弊端,比如不支持范围查询,不支持对整个数据数据执行瞬时的快照操作。分布式存储系统从本质上就是实现分布式Hash表或者分布式B+树。

普通的Key-Value系统可以认为是一个分布式Hash表。Hash算法有两种,模N(N为机器数)Hash或者一致性Hash。其中,模N哈希的主要问题在于机器上下线时机器数变化导致所有的数据都需要重新分布,而一致性Hash用来解决这个问题。先将数据通过Hash算法分成若干个桶,每台工作机服务这些桶中的数据。由于采用Hash算法数据分布天然比较均匀,不需要考虑多个桶之间的数据动态调整,大大降低了系统设计的复杂度。假如采用一致性Hash分桶,每个桶内使用Log-Structured Hash Table存储数据,系统的数据结构如下:

1, Hash空间组织成一个环,环上相邻节点包含的数据构成一个桶;比如Hash空间为A, B, C,那么有(A, B], (B, C], 以及(C, A]三个桶;

2, 每个桶内的数据结构为Log-Structured Hash Table;当然,可根据需要修改每个桶的单机数据结构;

3, 桶是负载均衡和任务调度的基本单元;

4, 每个桶存放3个副本;

类似Bigtable这种同时支持随机读取和顺序扫描的系统实现了分布式B+树数据结构。B+树按照顺序将数据划分为一个一个的桶(对应Bigtable的子表),顺序划分可能分布不均匀,需要动态调整,这就是为什么Bigtable这样的系统往往有复杂的子表分裂和合并操作。Bigtable采用两级的B+树结构组织,每个子表相当于B+树的一个叶子节点。数据结构如下:

1, 每个表按照主键(row key)组成一个B+树,主键是binary string;

2, 一个叶子节点包含表的一个前开后闭的主键范围(prev_end_key, end_key];

3, 每个叶子节点内部按照更小的主键范围划分为多个块(block)并内建块索引(block index);

4, 每个块的大小通常在8KB~64KB之间并内建行索引;

5, 数据压缩以块为单位,压缩算法由用户指定;

6, 叶子节点可能合并或者分裂;

7, 叶子节点是负载均衡和任务调度的基本单元;

8, 叶子节点存放3个副本;

总之,大多数分布式存储系统要么实现一个分布式Hash表,要么实现分布式B+树,对应的存储引擎分别为前面博文中提到的随机读取存储引擎和Merge-dump存储引擎。分布式Hash存储系统由于只支持随机读取,一般用选择相对较好的磁盘,分布式B+树存储系统同时支持随机读取和顺序扫描,当用来支持使用模式主要为顺序扫描的应用时,可以选择相对较差的磁盘,比如SATA盘。

另外,我们都知道,关系型数据库系统的存储引擎基本都是一颗B树结构,然而在NOSQL系统中存储引擎可能是Log-Structured Hash Table或者Merge-dump存储引擎,很重要的一个原因是NOSQL系统的存储引擎只需要存储分布式Hash表的一个桶或者分布式B+树的一个叶子,而每个桶或者每个叶子服务的数据量往往也只有百MB级别。

时间: 2024-07-30 10:05:22

分布式系统的数据结构的相关文章

一篇文读懂缓存在大型分布式系统中的最佳应用

本文大纲: 缓存概述 CDN缓存 反向代理缓存 分布式缓存 本地缓存 缓存架构示例 缓存常见问题        一.缓存概述       缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问.   1.缓存的原理   将数据写入/读取速度更快的存储(设备): 将数据缓存到离应用最近的位置: 将数据缓存到离用户最近的位置.   2.缓存分类   在分布式系统中,缓存的应用非常广泛,从部署角度有以下几个方面的缓存应用.   CDN缓存: 反向代

《分布式系统:概念与设计》一1.5 挑战

1.5 挑战 1.2节的例子试图说明分布式系统的范围,并提出在设计中出现的问题.在许多系统中,遇到了重大的挑战并且已经得到解决.随着分布式系统的应用范围和规模的扩展,可能会遇到相同的和其他的挑战.本节我们描述主要的挑战. 1.5.1 异构性 互联网使得用户能在大量异构计算机和网络上访问服务和运行应用程序.下面这些均存在异构性(即存在多样性和差别): 网络: 计算机硬件: 操作系统: 编程语言: 由不同开发者完成的软件实现. 虽然互联网由多种不同种类的网络组成(见图1-3),但因为所有连接到互联网

分布式系统,你真的了解吗?

我们邀请腾讯互娱研发部高级工程师韩伟,分享他所理解的分布式系统.由于内容较多,将分三篇进行讲述,本期第一篇先来看看他眼中的分布式系统究竟是什么吧. 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序员解决服务器端问题的时候,必须要考虑如何使用多台服务器,为同一种互联网应用提供服务,这就是所谓"分布式系统"的来源

HDFS追本溯源:租约,读写过程的容错处理及NN的主要数据结构

1.      Lease 的机制: hdfs支持write-once-read-many,也就是说不支持并行写,那么对读写的互斥同步就是靠Lease实现的.Lease说白了就是一个有时间约束的锁.客户端写文件时需要先申请一个Lease,对应到namenode中的LeaseManager,客户端的client name就作为一个lease的holder,即租约持有者.LeaseManager维护了文件的path与lease的对应关系,还有clientname->lease的对应关系.LeaseM

浅析分布式系统

WeTest导读 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念.  承载量是分布式系统存在的原因  当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序

一篇文读懂分布式系统本质:高吞吐、高可用、可扩展

承载量是分布式系统存在的原因当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙.当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了.因此,在互联网程序员解决服务器端问题的时候,必须要考虑如何使用多台服务器,为同一种互联网应用提供服务,这就是所谓"分布式系统"的来源.   然而,大量用户访问同一个互联网业务,所造成的问题并不简单.从表面上看,要能满足很多用户来自互联网的请求,最基本的需求就是所谓性能需求:用户反应

Zookeeper核心工作机制(zookeeper特性、zookeeper数据结构、节点类型)

10.1 zookeeper特性 1.Zookeeper:一个leader,多个follower组成的集群. 2.全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的 3.分布式读写,更新请求转发,由leader实施 4.更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行 5.数据更新原子性,一次数据更新要么成功(半数以上节点成功),要么失败 6.实时性,在一定时间范围内,client能读到最新数据   10.2 zoo

《分布式系统:概念与设计》一2.3.1 体系结构元素

2.3.1 体系结构元素 为了理解一个分布式系统的基础构建块,有必要考虑下面四个关键问题: 在分布式系统中进行通信的实体是什么? 它们如何通信,特别是使用什么通信范型? 它们在整个体系结构中扮演什么(可能改变的)角色,承担什么责任? 它们怎样被映射到物理分布式基础设施上(它们被放置在哪里)? 通信实体 上述前两个问题是理解分布式系统的关键:什么是通信和这些实体如何相互通信为分布式系统开发者定义了一个丰富的设计空间.它对从面向系统和面向问题的角度解决第一个问题是有帮助的. 从系统的观点,回答通常是

飞天5K实战经验:大规模分布式系统运维实践

2013年,云梯1实现空间优化与跨机房集群扩展,云梯2单集群规模从1500台升级到5000台,同时跨集群扩展的5K项目顺利取得阶段性成果,阿里成为第一个独立研发拥有这类大规模通用计算平台的公司.当时,云梯1.云梯2,再加上已上线的生产集群,阿里整体集群规模已超过万台.迄今为止,全球范围内,只有少数几家公司拥有如此规模的自主知识产权的集群.我们非常幸运,能够运维和管理如此大规模的生产集群.但短时间大规模快速膨胀的现状,确实也为运维工作带来了巨大的挑战.面对这些挑战,我们不仅迅速实现了自动化运维,还