分布式存储系统(二) - 单机存储系统

单机存储引擎就是Hash表、B树等数据结构在机械磁盘、SSD等持久化介质上的实现。其理论来源于关系数据库。

一、硬件基础

1、CPU架构

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

上图为2个CPU组成的SMP系统,每个CPU有两个核心core,CPU与内存之间通过总线通信。每个核心有各自的L1d Cache(数据缓存)和L1i Cache(L1指令缓存),同一个CPU的多个核心共享L2以及L3缓存。

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

2、IO总线

存储系统的性能瓶颈一般在于IO。以Intel x48主板为例,它是典型的南、北桥架构。

北桥芯片通过前端总线(Front Side Bus,FSB)与CPU相连,内存模块以及PCI-E 设备挂接在北桥上。通过DMI连接(1GB/s带宽),网卡包含千兆、万兆,硬盘以及中低端固态盘挂接在南桥上。如果采用SATA2接口,那么最大的带宽为300MB/s。

3、网络拓扑

传统的数据中心网络拓扑,分为三层,Edge、Aggregation、Core。典型的接入层交换机包含48个1Gb端口以及4个10Gb上行端口,汇聚层以及核心层的交换机包含128个10Gb的端口。

传统三层结构的问题在于有可能很多接入层的交换机接到不同接入层交换机下的服务器之间的带宽小于1Gb。由于同一个接入层的服务器往往部署在一个机架内,因此,设计系统的时候需要考虑服务器是否在一个机架内,减少跨机架拷贝大量数据。Hadoop HDFS默认存储三个副本,其中2个副本放在同一个机架上,就是这个原因。

为减少系统对网络拓扑结构的依赖,Google在2008年将网络改造为扁平化拓扑结构,即三级CLOS网络

4、参数性能

常见硬件性能参数:

存储系统的性能瓶颈主要在于磁盘随机读写。设计存储引擎的时候针对磁盘的特性做很多的处理,如将随机写操作转化为顺序写,通过缓存减少磁盘随机读操作。近年来有越来越多的互联网公司基于SSD开发应用(随机读取延迟小,能够提供很高的IOPS,Input/Output Per Second)性能。

5、存储层次架构

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

存储系统的性能包括两个维度:吞吐量、访问延时。设计系统时要求能够在保证访问延时的基础上,通过最低的成本实现尽可能高的吞吐量。

二、单机存储引擎

1、哈希存储引擎

a、数据结构

以Bitcask为例,基于Hash表结构的键值存储系统。

在任意时刻,只有一个文件可写,用于数据追加,称为活跃数据文件(active data file)。已经达到大小限制的文件,称为老数据文件。

b、定期合并

Bitcask需要定期执行合并(Compaction)操作来实现垃圾回收。对于同一个Key的多个操作,只保留最新的一个,其它进行删除,以保证不会再有冗余数据。

c、快速恢复

将索引文件转储到磁盘生成的结果文件。

2、B树存储引擎

以Mysql InnoDB为例,B树存储引擎不仅支持随机读取,还支持范围扫描。

通过叶子节点来保存每行的完整数据,每次读取一个节点,对应的如果不在内存中,需从磁盘中读取并缓存起来。B+树的根节点是常驻内存当中的。而缓冲区的管理通过管理器负责将可用的内存划分成缓冲区。常见的算法有:LRU、LIRS等。

3、LSM树存储引擎

即将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘(如LevelDB)。

当应用写入一条记录时,LevelDB会首先将修改操作写入到操作日志文件中,成功后再将修改操作应用到MemTable。当MemTable占用的内存达到一个上限值后,需要将内存的数据转储到外存文件中。LevelDB会将原先的MemTable冻结称为不可变MemTable,并生成一个新的MemTable。

LevelDB的写入操作很简单,但读取的操作比较复杂,需要再内存以及各个层级文件中按照从新到老依次查找。为了加快读取速度,LevelDB内部会致性Companion操作对已有的记录进行整理压缩,从而删除一些不再有效的记录,减少数据规模和文件数量。Companion的操作分为两种:Minor Companion和Major Compaction。

-------------------------------------------

有任何建议或问题,欢迎加微信一起学习交流,欢迎从事IT,热爱IT,喜欢深挖源代码的行业大牛加入,一起探讨。

个人微信号:bboyHan

热衷:Golang、Java、Python、区块链、架构设计、数据分析等。

发布了77 篇原创文章 · 获赞 123 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/han0373/article/details/83246691