《大规模分布式存储系统:原理解析与架构实战》读书笔记(1)

第一章 概述

1.1 分布式存储的概念:

分布式存储系统是大量普通
PC
服务器通过
Internet
互联,对外作为一个整体提供存储服务。

分布式存储系统有如下特征:可扩展,低成本,高性能,易用。

分布式存储系统的挑战主要在于数据、 态信息的持  ,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性。分布式存储涉及的技术主要来自两个领
域:分布式系统以及数据库。

1.2分类

分布式存储面 的数据需求比较复杂,大致可以分为三类:非结构化数据,结构化数据,半结构化数据

(1)分布式文件系统

互联网应用需要存储大量的图片 、照片 、  等非结构化数据对象,这类数据以对象的形式组织  ,对象之间没有关联,这样的数据一般为Blob (Binary
Large Object, 二进制大对象)数据。分布式文件系统用于存储
Blob
对象,典型的系统有
Facebook Haystack
以及 Taobao File System(TFS)。

(2)分布式键值系统

分布式键值系统用于存储关系简单的半结构化数据,它只提供基于主键的
CRUD
(Create/Read/Update/Delete)功能,即据主键创建、读取、更新或者删除一键值记录。典型的系统有Amazon
Dynamo以及Taobao Tair。

(3)分布式表格系统

分布式表格系统用于存储关系较为复杂的半结构化数据,与分布式键值系统相比, 分布式表格系统不仅仅支持简单的
CRUD
操作,而且支持扫描某个主键范围 。分布式表格系统以表格为单位组织数据,每个表格包括很多行,通过主键标识一行,支持根据主键的
CRUD
功能以及范围查找功能。典型的系统包括
Google Bigtable
以及
Megastore,Microsoft Azure Table Storage,Amazon
DynamoDB等。

(4)分布式数据库

分布式数据库一 是从单机关系数据库扩展而来,用于存储结构化数据。分布式数据库采用二维表格组织数据,根据SQL
关系查询语言,支持多表关联, 嵌套子查询等复杂操作,并提供数据库事务以及并发控制。典型的系统包括
MySQL
数据库分 (MySQL Sharding)集 ,Amazon
RDS 以及
Microsoft SQL Azure。

第二章 单机存储系统

单机存储引擎就是哈希表、B树等数据结构在机械磁盘、SSD
等持久化介质上的实现。单机存储系统是单机存储引擎的一种封装,对外提供文件、键值、表格或者关系模型。

2.1硬件基础

cpu架构

经典的多
CPU架构为对称多处理结构(SMP),即在一个计算机上汇集了一组处理器,它们之间对称工作,
无主次或从属 关系,共享相同的物理内存及总线。

SMP架构的主要特点是共享,系统中所有资源(CPU、内存、I/O等)都是共享的,
由于多
CPU 对前端总线的竞 ,SMP
的扩展能力非常有限。为了提高可扩展性,现在的主流服务器架构一般为
NUMA(非一致存储访问)架构。

IO总线

北桥芯片通过前端总线(FSB)与CPU相连,内存模块以及PCI-E设备(如高端
的 SSD
设备
Fusion-IO) 接在北桥上。

网络拓扑

下图为传统的数据中心网络  ,思科过去一直提倡这样的拓扑,分为三层,最下面是接入层,中间是汇聚层,上面是核心层。

存储层次架构

从分布式系统的 度 ,整个集群中所有服务器上的存储介质(内存、机械硬盘,
SSD)构成一个整体,其他服务器上的存储介质与本机存储介质一样都是可访问的,区别仅仅在于需要额外的网络传输及网络协议栈等访问开销。

2.2单机存储引擎

存储引擎是存储系统的发动机, 直接决定了存储系统能够提供的性能和功能。存储系统的基本功能包括 :增、删 、读、改 ,其中,读取操作又分为随机读取和顺序扫描。 希存储引擎是 希表的持久化实现,支持增、删 、改 ,以及随机读取操作,但不支持顺序扫描,对应的存储系统为键值存储系统;B树 存储引擎是
B树的持久化实现,不仅支持单条记录的增、删 、读、改操作,还支持顺序扫描,对应的存储系统是关系数据库。当然,键值系统也可以通过
B树存储引擎实现 ;LSM存储引擎和B树存储引擎一样,支持增、删
、改 、随机读取以及顺序扫描。它通过批量转储技术规避磁盘随机写入问题,广泛应用于互联网的后台存储系统,例如Google Bigtable、Google
LevelDB以及Facebook开源的Cassandra
系统。(1)哈希存储引擎

Bitcask
是一个基于哈希表结构的键值存储系统,它仅支持追加操作,即所有的写操作只追加而不修改老的数据。在
Bitcask系统中,每个文件有一定的大小限制,当文件增加到相应的大小时,就会产生一个新的文件,老的文件只读不写。

数据结构:Bitcask
数据文件中的数据是一条一条的写入操作,每一条记录的数据项分别为主键)、内容、主键长度、value
度、时间戳以及
crc较验值。

定期合并:Bitcask
系统中的记录删除或者更新后,原来的记录成为垃圾数据。如果这些数据一直保存下去,文件会无限膨胀下去,为了解这个问题,Bitcask
需要定期行合并操作以实现回收。所谓合并操作,即将所有老数据文件中的数据扫描一遍并生成新的数据文件,这里的合并其实就是对同一个
key
的多个操作以只保留最新一个的原则进行删除,每次合并后,新生成的数据文件就不再有余数据了。

快速恢复:Bitcask
系统中的哈希索引存储在内存中,如果不做额外的工作,服务器断电重启重建哈希表需要扫描一遍数据文件,如果数据文件很大,这是一个非常耗时的过程。Bitcask
通过索引文件来提高重建哈希表的速度。

(2)B树存储引擎

B树存储引擎不仅支持随机读取,还支持范围扫描。关系数据库中通过索引访问数据,在Mysql
InnoDB中,有一个称为 聚集索引的特殊索引,行的数据存于其中,  组成
B+
树数据结构。

数据结构:MySQL InnoDB
按照页面来组织数据,每个页面对应
B+
的一个节点。其中, 子节点保存每行的完整数据,非 子节点保存索引信息。数据在每个节点中有序存储,数据库查询时需要从根节点开始二分查找到叶子节点,每次读取一个节点,如果对应的页面不在内存中,需要从磁盘中读取并缓存起来。

缓冲区管理:

LRU:LRU算法淘汰最长时间没有读或者写过的块。这种方法要求缓冲区管理器按照页面最后一次被访问的时间组成一个链表,每次淘汰链表尾部的页面。

LIRS:LIRS算法将缓冲池分为两级,数据首先进入第一级,如果数据在较
的时间内被访问两次或者以上,则成为热点数据进入第二级,每一级内部还是采用LRU 替换算法。

(3)LSM树存储引擎:将对数据的修改增量保持在内存中, 到指定的大小限制后将这些修改操作批量写入磁盘,读取时需要合并磁盘中的历史数据和内存中最近的修改操作。LSM
树的优势在于有效地规避了磁盘随机写入问题,但读取时可能需要访问较多的磁盘文件。

数据结构:LevelDB存储引擎主要包括:内存中的MemTable和不可变
MemTable(Immutable MemTable,也
为Frozen MemTable,即 结MemTable)以
及磁盘上的几种主要文件 :当前(Current)文件、清单(Manifest)文件、操作日
(Commit Log,也 为提交日 )文件以及SSTable文件。当应用写入一
记录 时,LevelDB
会首先将修改操作写入到操作日志文件,成功后再将修改操作应用到
MemTable,这样就完成了写入操作。

合并:LevelDB

Compaction
操作分为两种:minor compaction

major compaction。

2.3数据模型

存储系统的数据模型主要包括三类 :文件、关系以及随着
NoSQL
技术流行起来的键值模型。传统的文件系统和关系数据库系统分别采用文件和关系模型。关系模型描述能力强,产业链完整,是存储系统的业界标准。

文件模型:文件系统以目录树的形式组织文件,以类
UNIX
操作系统为例, 根目录为
/,包含
/usr、/bin、/home
等子目录,每个子目录又包含其他子目录或者文件。POSIX是应用程序访问文件系统的
API
标准, 它定 了文件系统存储接 及操作集。POSIX
主要接口如下。
Open/close:打开
/
关闭 一个文件,获取文件描述 ;
Read/write:读取一个文件或者往文件中写入数据;
Opendir/closedir:打开或者关闭一个目录;Readdir:
 遍历目录。

关系模型:每个关系是一个表格,由多个元 (行)构成,而每个元 又包含多个属性( )。 关系名、属性名以及属性类型称作
关系的模式(schema)。

键值模型:大量的
NoSQL
系统采用了键值模型,每行记录由主键和 值两个部分组成,支持基于主键的如下操作:

Put:保存一个
Key-Value
对。Get:读取一个
Key-Value
对。Delete: 除一个
Key-Value
对。

Key-Value
模型过于简单,支持的应用 景有限,NoSQL
系统中使用比较广泛的模
型是表格模型。表格模型弱化了关系模型中的多表关联,支持基于单表的简单操作,典型的系统是Google Bigtable以及其开源Java实现HBase。表格模型除了支持简单的基于主键的操作,还支持范围扫描,另外,也支持基于列的操作。主要操作如下:
Insert: 入一行数据,每行包括   ;Delete:
删除一行数据;Update:更新整行或者其中的某些列的数据;
Get:读取整行或者其中某些列数据;
Scan
: 描一段范 围的数据, 根据主键确定扫描的范围 ,支持扫描部分列 ,支持按列过滤、排序、分组等。

2.4事务与并发控制

事务规范了数据库操作的  ,每个事务使得数据库从一个一致的状态原子地转移到另一个一致的状态。数据库事务具有原子性、一致性、
隔离性以及持久性即
ACID 属性,这些特性使得多个数据库事务并发执行时互不干扰  ,也不会获取到中间状态的错误结果。

事务:事务是数据库操作的基本单 ,它具有原子性、一致性、隔离性和持久性这四个基本属性。

并发控制:分为数据库锁,写时复制,多版本并发控制

2.5故障恢复:

数据库运行过程中可能会发生故障,这个时候某些事务可能执行到一半但没有提交,当系统重启时,需要能够恢复到一致的状态,即要么提交整个事务,要么回滚 。 数据库系统以及其他的分布式存储系统一般采用操作日志 (有时也称为提交日志 ,即
Commit Log)技术来实现故障恢复。操作日志分为回滚日志、重做日志以及UNDO/REDOr日志。如果记录事务修改前的状态,则为回滚日志
; 相应地,如果记录事务修改后的状态,则为重做日志。

2.6数据压缩

数据压缩分为有损压缩与无损压缩两种,有损压缩算法压缩比率高,但数据可能 ,一般用于压缩图片 、音频
 、视频   ;而无损压缩算法能够完全还原原始数据。早期的数据压缩技术就是基于编码上的优化技术,其中以
Huffman 编码最为知名,它通过统计字符出现的频率计算最优前缀编码。

时间: 2024-10-25 05:56:44

《大规模分布式存储系统:原理解析与架构实战》读书笔记(1)的相关文章

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

《Programming in Lua 3》读书笔记(二十一)

日期:2014.8.1 PartⅣ The C API 25 An Overview of the C API Lua是一种嵌入式语言.这就意味着Lua不是单独存在的,而是可以通过一系列的标准库将lua的特性嵌入至其他应用模块中. Lua以Lua interpreter(lua的解释器?)来解决了其不是独立程序,我们直到现在却又能独立使用Lua的问题.这个解释器是一个小型的程序(不超过500行代码),使用lua的标准库来实现独立解释程序,这个程序将处理与用户的交互等操作交给lua的标准库,这些库

读书笔记:《重来REWORK》

读书笔记:<重来REWORK> <重来Rework--更为简单有效的商业思维>这本书是看了别人的书单而购买的,初 拿到这本书翻看时,感觉有两点与平常的书不同,一是每个小节非常短,通常是一页,最多二页,二是附有大量的插图,原以为这些插图可能是用来凑页数的,但细 看一些插图,虽然都是用手工画的,但却能用形象的办法表示出一小节的观点,很象是出自做软件原型的人员之手. 这本书包含了80多个观点,特别适合指导小型软件公司的创业,感觉对我做的软件项目也有帮助. 卸负篇TAKEDOWNS 忘了“

【游戏设计模式】之四 《游戏编程模式》读书笔记:全书内容梗概总结

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53240330 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文的Github版本:QianMo/Reading-Notes/<游戏编程模式>读书笔记 这是一篇超过万字读书笔记,总结了<游戏编程模式>一书中所有章节与内容的知识梗概. 我们知道,游戏行业其实一直很缺一本系

读书笔记-2015年第1本:《暗时间》

作者所说的暗时间,其实在生活中,我自己也有领悟到,领悟的时候很感慨,然而过不了几天就把这个领悟给忘得一干二净,于是又是过着重蹈覆辙的生活.现在给我的提醒就是把领悟到的东西记录下来,每天空出一些时间静下心专门来思考这些领悟到的东西.现在有幸看到自己曾经遗忘的宝贵的生活哲理,好好思考,好好领悟. 在这本书中,作者推荐了大量有价值的学习资料以及学习方法,有时间时都可以去研究学习. 我们可以看出,作者很有学问,但也可以想一下为何如此有学问?“看上去好像很高端的样子”,实际上,也就是作者曾经在一年内看过很

【python下使用OpenCV实现计算机视觉读书笔记3】读写视频文件

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L). 简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该

《程序员的呐喊》读书笔记(下)

接着<程序员的呐喊>读书笔记(上),继续分享下篇,这次干货比较多哦,有静动态类型的优缺点.强弱类型系统的对抗.设计模式.程序员的数学.编译器的重要性以及保守派自由派的较量,一时消化不了的建议保存以便read it later. 静态类型和动态类型的优缺点 静态类型的优点下面列出了静态类型的主要优点:(1)静态类型可以在程序运行之前,依赖其与生俱来的限制来及早发现一些类型错误.(或是在插入/更新记录,解析XML文档等情况下进行检测.)(2)静态类型有更多机会(或者说更容易)优化性能.例如只要数据

代码的未来读书笔记&lt;二&gt;

代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端客户端以及静态动态这2个角度进行了对比. 这四种语言由于不同的设计方针,产生了不同的设计风格. Header 客户端 服务端 动态 Html5 Ruby 静态 Java Go 静态动态 静态:无需实际运行,仅根据程序代码就能确定结果. 动态:只有到了运行时才能确定结果.不过无论任何程序,或多或少都包含的动态的特性. 动态运行模式 运行中的程序能识别自身,并对自身进行操作.对程序自身进行操作的编

读书笔记:技术的本质-技术是什么,它是如何进化的 (布莱恩?阿瑟)

读书笔记算不算原创? - page 30 然而,作为人类,我们实际上不应该和技术如此紧密地结合,而是应该和其他什么东西融合得更为紧密,那就是自然.在最深的层次上,人的存在应该和自然,和我们最初的环境,以及最初使我们成为人的那些条件相融合. ========== - page 36 如今机器被用来生产机器了,同时它又变成了以后同类机器的父母. ========== - page 43 技术的建构不仅来自已有技术的组合,还来自于对自然现象的捕捉和征服.在 ========== - page 44 技

读书笔记:技术的本质-技术是什么,它是怎样进化的 (布莱恩?阿瑟)

读书笔记算不算原创? - page 30 然而.作为人类,我们实际上不应该和技术如此紧密地结合,而是应该和其它什么东西融合得更为紧密,那就是自然. 在最深的层次上.人的存在应该和自然,和我们最初的环境,以及最初使我们成为人的那些条件相融合. ========== - page 36 现在机器被用来生产机器了,同一时候它又变成了以后同类机器的父母. ========== - page 43 技术的建构不仅来自已有技术的组合.还来自于对自然现象的捕捉和征服.在 ========== - page 4