Linux开源存储全栈详解:从Ceph到容器存储(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-15 16:11:32

点击下载

作者:英特尔亚太研发有限公司

出版社:电子工业出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Linux开源存储全栈详解:从Ceph到容器存储

Linux开源存储全栈详解:从Ceph到容器存储试读:

内容简介

本书致力于帮助读者形成有关Linux开源存储世界的细致拓扑。本书从存储硬件、Linux存储栈、存储加速、存储安全、存储管理、分布式存储等各个角度与层次展开讨论,同时对处于主导地位的、较为流行的开源存储项目进行阐述,包括SPDK、ISA-L、OpenSDS、Ceph、OpenStack、容器等。本书内容基本不涉及具体源码,主要围绕各个项目的起源与发展、实现原理与框架、要解决的网络问题等展开讨论,以帮助读者对Linux开源存储技术的实现与发展形成清晰的认识。本书语言通俗易懂,能够带领读者快速走进Linux开源存储的世界并做出自己的贡献。

本书适合希望参与Linux开源存储项目开发的读者阅读,也适合互联网应用的开发者、架构师和创业者参考,尤其可作为互联网架构师的开源技术典籍。

未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

版权所有,侵权必究。

图书在版编目(CIP)数据

Linux开源存储全栈详解:从Ceph到容器存储/英特尔亚太研发有限公司编著.—北京:电子工业出版社,2019.9

ISBN 978-7-121-36979-7

Ⅰ.①L… Ⅱ.①英… Ⅲ.①Linux操作系统 Ⅳ.①TP316.85

中国版本图书馆CIP数据核字(2019)第127853号

责任编辑:孙学瑛  特约编辑:田学清

印  刷:

装  订:

出版发行:电子工业出版社

     北京市海淀区万寿路173信箱  邮编:100036

开  本:720×1000  1/16  印张:24.75  字数:476千字

版  次:2019年9月第1版

印  次:2019年9月第1次印刷

定  价:99.00元

凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。

质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。

本书咨询联系方式:010-51260888-819,faq@phei.com.cn。推荐序一

With an ever-increasing growth of data in both business and consumer uses, the need for storage of the data also continues to grow at an unprecedented pace. Intel technologies such as Intel® Optane™ SSD, and Intel® Optane™ persistent memory serve as examples of disruptive innovation, providing dramatically improved performance and entire new functionality to the storage industry.

Infrastructure software, storage, computing and network functions will serve a broad range of application platform requirements for 5G, Artificial Intelligence, Autonomous Driving, and Big Data Analytics. Open source storage software is critically important in developing and delivering innovative solutions. This book introduces open source storage technologies and techniques for software-defined storage solutions covering both hardware and software. Intel is a leading contributor of open source software and storage hardware IP and products, including contributions for open source storage software development, such as Intelligent Storage Acceleration Library (ISA-L), Storage Performance Development Kit(SPDK), and the Ceph project.

In China, open source and software-defined storage have been well adopted and applied across many different types of application scenarios. A strong ecosystem of storage software developers and solutions providers have been created and are delivering value to the market through their innovations. We hope the technologies and techniques covered in this book will be useful to the open source communities in China and the rest of the world.Sandra RiveraSenior Vice President and General ManagerNetwork Platforms GroupIntel 5G Executive Sponsor推荐序二

The evolution of storage has been dramatic. As computing has become an integral part of our daily activities, storage media has had to evolve to keep pace, moving from tape and mechanical hard disk, to solid state hard disk, NAND, and now emerging 3D XPoint technologies.

Demand is only expected to increase. The data boom created by connected devices coupled with growth areas such as Artificial Intelligence and Machine Learning bring higher expectations — greater capacity, scalability, and faster access, not to mention increased availability and reliability. These challenges have resulted in the rise of distributed storage systems and cloud-based services, to help providers meet those demands. Software plays a key role in this transformation. The emergence of software-defined storage enables more scalable and flexible solutions, as well as greater levels of management and orchestration. Offerings such as virtual machine and container persistence storage help meet a growing range of business needs.

Open source provides the foundation for modern storage systems and a platform for rapid innovation. Intel has been active in the open source software community for 20+years, and our contributions to storage technologies such as Intel® Storage Acceleration Library (ISA-L), Storage Performance Development Kit (SPDK), and the Ceph project help accelerate performance for storage virtualization platforms.

As a leader in developing storage hardware and software, Intel recognizes the importance of the Chinese ecosystem to the growth of the storage market. It is with great pride we present this book as a resource to the China storage community.Imad SousouCorporate Vice President, Intel CorporationGeneral Manager, Intel System Software Products前 言

自1991年Linux诞生,时间已经走过了近三十年。即将而立之年的Linux早已没有了初生时的稚气,它正在各个领域展示自己成熟的魅力。

以Linux为基础,各种开源生态,如网络、存储都出现了。而生态离不开形形色色的开源项目,在人人谈开源的今天,一个又一个知名的开源项目正在全球快速生长。当然,本书的主题仅限于Linux开源存储生态,面对其中一个又一个扑面而来且快速更迭的新项目、新名词,我们会有一种紧迫感,想去了解它们背后的故事,也会有一定的动力想要踏上Linux开源存储世界的旅程。而无论是否强迫,面对这样的一段旅程,我们心底浮现的最为愉悦的开场白或许应该是:“说实话,我学习的热情从来都没有低落过。Just for Fun.”正如Linus 在自己的自传Just for Fun中所希望的那样。

面对Linux开源存储这么一个庞大而又杂乱的世界,让人最为惴惴不安的问题或许便是:我该如何更快、更好地适应这个全新的世界?人工智能与机器学习领域里研究的一个很重要的问题是,“为什么我们小时候有人牵一匹马告诉我们那是马,于是之后我们看到其他的马就知道那是马了?”针对这个问题的一个结论是:我们在头脑里形成了一种生物关系的拓扑结构,我们所认知的各种生物都会放进这个拓扑结构里,而生物不断成长的过程就是形成并完善各种各样的或树形、或环形等拓扑结构的过程,并以此来认知我们所面对的各种新事物。

由此可见,或许我们认知Linux开源存储世界最快也最为自然的方式就是努力在脑海里形成它的拓扑结构,并不断细化,比如这个生态包括什么样的层次,每个层次里又有什么样的项目去实现,各个项目又实现了哪些服务及功能,这些功能又是以什么样的方式实现的,等等。对于感兴趣的项目,我们可以更为细致地去勾勒其中的脉络,就好似我们头脑里形成的有关一个城市的地图,它有哪些区,区里又有哪些标志性建筑及街道,对于熟悉的地方,我们甚至可以将它的周围放大并细化到一个微不足道的角落。

本书的组织形式

本书正是为帮助读者形成有关Linux开源存储世界的细致拓扑而组织的。

第1章主要对Linux开源存储的生态进行整体描述,包括开源存储领域研究的热点方向、相关的开源基金会等。

第2章从存储硬件的角度介绍了存储技术的发展历史,包括存储介质的进化、存储协议的更新等。

第3章作为整个Linux开源存储世界的基础,描述了Linux存储栈(Linux Storage Stack),对I/O在Linux内核里的处理流程及所涉及的主要模块进行介绍。

第4~9章的内容分别从存储加速、存储安全、存储管理与软件定义存储、分布式存储与Ceph、OpenStack存储、容器存储等角度与层次对处于主导地位的、较为流行的项目进行介绍,以帮助读者对相应项目形成比较细致的拓扑。

第4章讲解了存储领域的加速技术,包括FPGA、QAT、NVDIMM等硬件加速技术,以及ISA-L、SPDK等开源的软件加速方案。

第5章从可用性、可靠性、数据完整性、访问控制、加密与解密等方面讨论了存储安全问题。

第6章介绍存储管理与软件定义存储方面的主要开源项目,包括OpenSDS、Libvirt等。

第7章讨论分布式存储并详细介绍了目前流行的开源分布式存储项目Ceph的设计与实现。

第8章与第9章分别对OpenStack与Kubernetes两种主要云平台中的存储支持进行讨论。

感谢

作为英特尔的开源技术中心,参与各个Linux开源存储项目的开发与推广是再自然不过的事情了。除了为各个开源项目的完善与稳定贡献更多的思考和代码,我们还希望通过这本书让更多的人更快地融入Linux开源存储世界的大家庭。

如果没有Sandra Rivera(英特尔高级副总裁兼网络平台事业部总经理)、Imad Sousou(英特尔公司副总裁兼系统软件产品部总经理)、Mark Skarpness(英特尔系统软件产品部副总裁兼数据中心系统软件总经理)、Timmy Labatte(英特尔网络平台事业部副总裁兼软件工程总经理)、练丽萍(英特尔系统软件产品部网络与存储研发总监)、冯晓焰(英特尔系统软件产品部安卓系统工程研发总监)、周林(英特尔网络平台事业部中国区软件开发总监)、梁冰(英特尔系统软件产品部市场总监)、王庆(英特尔系统软件产品部网络与存储研发经理)的支持,这本书不可能完成,谨在此感谢他们在本书编写过程中给予的关怀与帮助。

感谢本书编辑孙学瑛老师,从选题到最后的定稿,在整个过程中,都给予我们无私的帮助和指导。

感谢参与各章内容编写的各位同事,他们是李晓燕、程盈心、马建朋、尚德浩、胡伟、刘春梅、任桥伟、杨子夜、曹刚、刘长鹏、刘孝冬、惠春阳、万群、闫亮、周雁波、徐雯昀。为了本书的顺利完成,他们付出了很多努力。

感谢所有对Linux开源存储技术抱有兴趣或从事各个Linux开源存储项目工作的人,没有你们提供的源码与大量技术资料,本书便会成为无源之水。第1章 Linux开源存储

至落笔之际,Linux已经成长了27年,从一个实验性质的操作系统成为一个支持多种体系架构的通用操作系统,被广泛部署在数据中心、公有云、私有云的服务器上。

在由Linux支撑的众多开源软件中,与存储相关的软件占据了很大的比例,主要包括如下部分。

· 内核自带的服务模块,如iSCSI Target、NVMe-oF Target。

· 各种内核支持的文件系统,如ext2/3/4、Btrfs、XFS等。

· 基于Linux开发的分布式存储系统,如Ceph、GlusterFS、Sheepdog等。

· 基于Linux的开源云计算管理软件,如OpenStack。

总的来说,在Linux上部署及开发存储软件,尤其是开源存储软件,已是大势所趋。1.1 Linux和开源存储

计算机系统是图灵机的高效实现,即根据输入数据的规则得到输出数据。现在的计算机系统由CPU、内存、总线、外设(如网络设备、存储设备)等组成,其中,存储是非常重要的一部分。系统的启动需要存储,操作系统在启动的时候需要从存储系统中(无论是本地存储还是远端存储)加载相应的镜像数据;在CPU和内存中进行数据计算的时候,需要把数据进行相应的存储,如放入本地或远端存储系统。

为了更好地说明存储的重要性,先回顾一下经典的存储级别图,如图1-1所示。数据在计算机系统中的存储级别自上而下地划分为4大块:CPU、CPU缓存、易失内存、非易失内存。图1-1 存储级别

在图1-1中,由上到下表现为数据存储级别由高到低,数据访问速度由快到慢,延迟时间由短到长。CPU的计算速度越来越快,但是也达到了一定的瓶颈;计算机工艺(基于硅晶体)可以达到7nm和10nm的级别,但是再往更低突破也不太理想,于是转向了多核化发展;CPU对应的缓存级别,从L1到L2再到更多级别的缓存,扩大了缓存的大小,能让更多的数据位于缓存中,从而更好地降低了延迟。

易失内存主要是指内存,分为SRAM(Static Random Access Memory)和DRAM(Dynamic Random Access Memory),主要以双内联存储器模块(Dual In-line Memory Module,DIMM)接口为主。当然目前也有支持双内联存储器模块接口的非易失内存,如英特尔的Apache Pass(AEP)。

非易失内存种类繁多,可以基于PCIe、SATA(Serial Advanced Technology Attachment)、SAS(Serial Attached SCSI)、AHCI(Advanced Host Controller Interface)等各种协议。根据介质和工作原理,非易失内存可以分为机械硬盘(Harddisk)、固态硬盘(Sdid State Drive,SSD)及磁带(Tape)。其中,固态硬盘根据颗粒和介质可以分为NAND和3D XPoint等。

总的来说,在整个数据的计算层次中,与存储相关的硬件是非常重要的、不可忽略的一部分。这反过来也影响了存储软件的设计和开发,并提高了开发存储软件的门槛。为此,在很长一段时间内,基于存储的开源软件虽然不少,但是基本以商用收费软件,即闭源软件为主。1.1.1 为什么需要开源存储

在之前,我们并不需要开源存储软件来构建相应的解决方案。当时闭源的商用存储软件就可以满足用户的需求,只是价格比较昂贵。

1.基于商用/闭源存储软件的时代

在Linux没有流行的时候,并没有太多操作系统可供选择。例如,微软的Windows、Sun的Solaris、运行在IBM大型机上的操作系统,以及流行的UNIX等。基于这样的现实,存储系统大多构建在闭源的操作系统上,自然没有太大的动力去推出开源存储软件。

另外一个客观的事实是,存储软件的第一个版本基本都是闭源的。而开源存储软件出现的原因是某些公司觉得应该把这样的技术公之于众或回馈社会,或者迫于其他类似开源软件的先声夺人。另外形成开源社区也需要时间,10~20年之前,没有太多的开源存储项目,自然谈不上使用开源存储软件来进行实际的部署。另外,还有以下几点原因也在客观上限制了存储系统的发展。

1)存储设备的发展

开源存储软件之前未得到发展的一个主要原因是受限于存储设备。从存储设备的发展历史来看,每GB存储空间的成本一直在降低。直到2000年左右,存储设备的发展仍不太迅速。从用户角度来看,当时的存储设备容量太小、价格太贵、速度太慢,这在很大程度上制约了存储应用的发展。

2)存储的整体需求不高

存储设备的发展制约了存储的需求,反过来,没有需求,存储设备的发展速度也会变慢,这两者既是相互制约,也是相互促进的。例如,在2000年左右,存储需求不太明显,互联网行业虚假繁荣,直至泡沫破裂,当时崛起的一些IT公司从市值很高的神坛跌落。例如,EMC(昌安信)公司的市值曾达到2000多亿美金,但泡沫破裂后,其股票一路下跌,直到2015年被戴尔公司以670亿美金收购,也没有恢复元气。以EMC为例是为了说明在互联网发展初期,其实存储公司的发展前景并不是特别明朗的,尤其在市场整体股价下跌的时候,因为没有大量数据的存储需求,所以可能跌得更厉害。

在那个时代,存储数据主要以结构化数据为主,如数据库、有索引的文件、档案等。对致力于企业级存储的EMC来讲,虽然有很多高端的金融客户等,但是这些客户对存储设备的需求量还是非常有限的。在互联网发展初期,一方面,还没有太多的结构化数据,主要是用于搜索的非结构化数据,如图片等。那些占据大量存储的视频、音频文件在当时并不流行,所以对于存储的需求还是以企业为主的,以支持个人用户为导向的存储系统并没有太大的市场,当然这也与当时网络不发达有关。另一方面,当时各种产生大量存储需求的设备,如个人使用的智能相机,还没有流行起来。

3)开发存储产品的高门槛

评估一个存储系统,一般有以下指标。

· 性能指标:业界有相关的存储性能委员会(Storage Performance Council,SPC)发布相应的测试规范(Benchmark)和测试工作集(Workload)。典型的测试工作集包括SPC-1(主要评估存储系统面向事务性业务的性能)、SPC-2(评估不同业务类型,大规模连续数据访问的存储系统的性能,如大量文件并发性访问、视频点播业务等)、SPC-3(提供应用层的模拟,如存储管理、内容管理、信息生命周期等性能)。

· 可靠性标准:如数据的可用性、完整性、安全性,在不同领域有不同的标准。

· 功能性标准:如是否符合业界定义的规范,不同的国家有不同的标准。想要获得更详细的信息,可以参考主流供应商提供的存储产品进行相关的对照,如EMC、华为、NetApp提供的产品。

· 能耗标准:主要用于评估存储系统在不同负载情况下的功耗,显然在相同负载的情况下,功耗消耗越低越有竞争力。因为这个标准涉及运维的代价,因此,数据中心的运行者对这个指标比较关心。

这些存储系统的评估标准是在不断演化的。总的来说,想要打造一款具有竞争力的存储产品并不是一件容易的事情。作为一个合格的存储提供厂商,即使是一个创业小公司,也是竭尽全力地想要通过一些标准组织委员会提供的性能、可靠性等不同的测试的,从而在交付用户之前,能够及早发现各种问题,并加以修正。如果想做到盈利,公司提供的相应的产品就要有竞争力,如产品性能、性价比、存储安全性等方面的优势,只有这样才能在竞争激烈的市场中占据一席之地。由此可知,开发存储产品的门槛很高。

在互联网还没有蓬勃发展的时候,一些开源存储软件显然不能满足相应的需求。

2.风向的转变

近几年,随着CPU、内存等硬件技术的快速发展,以及互联网的高速发展和数据的爆炸式增长等,传统的商业存储软件已经难以满足人们的应用需求了。为此,Google开发了Google文件系统(Google File System,GFS),以满足搜索引擎的后端存储(Backend Storage)需求;Amazon推出了EBS(Elastic Block Store),以满足提供EC2(Elastic Computing Cloud)服务的虚拟机的持久化存储需求。为了满足人们对开源分布式存储的需求,学术界诞生的Ceph在社区管理的缓慢推动下,形成了一套可实际部署的开源存储软件,被广泛部署在各个领域。

从商用/闭源存储系统到开源的存储系统,这个变化是令人欣喜的,仔细分析其中的原因,主要有以下几点。

1)商用存储软件功能的局限性

在数据爆发式增长的时候,一些存储系统,如单机,已经不能满足存储需求了。当数据的容量从TB到PB甚至继续增长的时候,这些商用/闭源存储系统由于可扩展性的缺失,已经不能适用于某些数据持续增长的应用场景。我们知道,扩容无非是两种形式,即Scale-up(针对单机)和Scale-out(针对分布式存储)。因此,扩容成了一件棘手的事情。在开始的时候,单机扩容还可以解决问题,但是其容量终究是有上限的。

2)商用存储系统的价格昂贵

有些企业销售的高端存储系统价格非常昂贵,一台机器可能卖到几十万美元甚至几百万美元。这些系统虽然在性能评估等各个方面非常有优势,但是昂贵的价格让很多人望而却步,只有一些大公司,如银行、证券公司,才可能配备这样的系统。在市场和行业没有对比的情况下,售卖这些存储系统带来的盈利是非常可观的。

另外,企业在给客户售卖闭源存储系统的时候,也会搭配相应的售后服务。从系统稳定性和良好的售后服务来看,这些存储系统可以说是无可挑剔的,但生产成本始终是不可忽略的一个因素。在开源存储不断崛起的时代,这些存储系统慢慢转变成云存储服务,这对这些昂贵的存储系统的销售将是一个挑战。虽然某些特殊领域对存储系统还有一些需求,但是不可否认的是,这个需求量在不断下滑,市场在进一步萎缩。

3)开源生态圈的蓬勃发展

开源软件越来越流行,生态圈发展越来越好,主要是因为互联网企业在广泛使用开源软件,包括开源存储软件,并且向社区提交补丁,以改善代码质量,这样就形成了一个良性循环。互联网企业对于开源软件的使用或验证(所谓的Dogfood测试)极大地提高了开源软件的影响力,让用户意识到由社区维护的开源软件一样可以作为商用软件来使用。

4)互联网企业的身体力行

很多互联网企业最初在运营的时候并没有把自己定位为高科技公司。Amazon最初是一家电子商务公司,它很大一部分收入来自书籍的售卖,后来慢慢转型为一家提供云计算、云存储等服务的高科技公司,虽然电子商务仍是其业务的一部分,但是也许已经不再是支持其高速发展、股价一路上涨的重要部分了。

存储方面,Amazon一开始搭载了存储巨头,如戴尔、EMC、IBM等公司的存储产品或软件,目前可能依然在使用,但已经不是其后端存储业务的核心了。为了适应自身发展的需求,Amazon在存储方面做了自己的开发工作,例如,Amazon的基础架构即服务(Infrastructure as a Service,IaaS)最早采用了Xen虚拟化的架构,为虚拟机的后端存储开发了EBS和S3(Simple Storage Store);针对电子商务业务,Amazon开发了基于键值的NoSQL数据库——Dynamo,满足了自身业务的需求。1.1.2 Linux开源存储技术原理和解决方案

前面提到开源存储软件已经成为趋势,在Linux下构建开源存储的服务也顺理成章地成了大势所趋。最近,Linux在服务器端蓬勃发展,代替Windows、FreeBSD等操作系统成为了业界的主流,因此,在Linux下开发开源存储软件及进行相关的运维已经成为一件非常平常的事情。

在讨论Linux开源存储软件之前,我们先来回顾一下在Linux上部署的比较流行的网站服务。该网站服务的关键组件称为LAMP,其中,L为Linux操作系统;A为Apache网页服务器;M为MariaDB或MySQL数据库系统;P为PHP、Perl或Python用于网页后台编程的脚本语言。这些软件并不是一开始就是网站服务的组合的,而因为是开源软件,并且比较廉价和普遍,自然而然地就有人把这些软件组合起来,并提出了将这个组合用于网站服务可行的解决方案,接着就成了流行的组合方案,并被默认是安装Linux系统的标准套件。随着时代的变化,LAMP演变成了LNMP,其中N为nginx。

LNMP流行的原因有两点:一是软件廉价或容易获取,如打包在常见的Linux系统发行版本中,如Fedora、Ubuntu、CentOS、Redhat;二是软件的高效性。这也是为什么那些开源软件都要按照各个Linux发行版做成相应的包,只要打包在这些发行版中,就能被广泛接受。所以对应Linux的开源存储软件,需要满足如下要求。

1)软件集成在Linux发行版本中

如果该软件只有开源版本,并没有集成在主流的Linux发行版本中,那么就会对软件的易用性带来很大挑战。如果只能下载源代码安装,对于软件运维人员来讲,这是不太友好的。因为很多软件对于其他软件或系统有一定的依赖性,如果直接从源码安装软件,那么这个版本可能未必和当前的操作系统(包括内核版本)及其他依赖软件相匹配,因此在运行的时候,可能会发生一些未知的问题。所以,一个成熟的开源软件需要和主流的Linux发行版本集成,确保每当发布一个新的发行版本,都会有最佳适配的版本。

2)软件有活跃的社区

存储软件服务的运营商或企业在采用开源软件的时候,都希望该软件有活跃的社区,原因主要有以下几个:①该软件持续开发和迭代,有活跃的开发者工作在这个软件上;②该软件对于Linux系统的支持友好,要不断更新相关代码以适配Linux系统;③软件的开发要遵循相应的标准,对使用开源软件的用户是福音。

现在主流的开源分布式系统解决方案是Ceph,其原因是Ceph社区非常活跃。而其他的开源解决方案,如Sheepdog则基本上处于停滞状态,因用户少而导致社区不活跃,目前主要由日本的NTT公司在维护该社区,很难看到一个良好发展的前景。

3)软件的特性满足应用的需求

很多开源软件都有很大的局限性,不能很好地满足应用的需求。例如,在大请求场景下,不能满足延时需求;软件只支持单机版本,支持的存储容量有限制;软件支持分布式版本,但是扩容有限制。要满足这些需求,就需要存储软件的用户或运维人员充分了解软件的特性和配置,并且进行相关的压力测试,如测试这些配置是否有效,面对一些给出的极限情况的值是否能达到使用手册的标准。

如果应用的需求超过了该软件的支持范围,那么只有两种选择:一是放弃该软件,寻求新的软件;二是组织相关的研发人员,改造已有的软件,或者提交需求到软件开发社区寻求相应的帮助。对于比较流行的软件,用户一般都会选择第二种,该软件就会根据用户的反馈及提交的补丁被不断改进,进入良性循环。1.2 Linux开源存储系统方案介绍

本节我们将介绍存储技术的原理和实现,以及Linux开源存储的解决方案,包括Linux系统单节点的存储技术和方案(包括本地文件系统)、分布式存储系统解决方案、软件定义的存储管理软件等。1.2.1 Linux单节点存储方案

首先介绍Linux单节点存储方案,包括本地的文件系统,以及通过各种网络,比如以太网、光纤通道(Fibre Channel,FC)能够导出的服务。

1.Linux本地文件系统

在Linux操作系统中,对于应用程序来讲,所有设备都是以“文件”的形式使用的。例如,对于网络程序,打开一个socket,其实返回的是一个文件描述符。如果不关注网络,只从一个应用程序的角度来看文件系统,则Linux内核文件系统实现如图1-2所示。图1-2 Linux内核文件系统实现

· 应用程序通过系统调用访问文件(无论是块设备文件,还是各种文件系统中的文件)。可以通过open系统调用,也可以通过memory map的方式调用来打开文件。

· Linux内核收到系统调用的软中断,通过参数检查后,会调用虚拟文件系统(Virtual File System,VFS),虚拟文件系统会根据信息把相应的处理交给具体的文件系统,如ext2/3/4等文件系统,接着相应的文件I/O命令会转化成bio命令进入通用的块设备层,把针对文件的基于offset的读/写转化成基于逻辑区块地址(Logical Block Address,LBA)的读/写,并最终翻译成每个设备对应的可识别的地址,通过Linux的设备驱动对物理设备,如硬盘驱动器(Harddisk Drive,HDD)或固态硬盘进行相关的读/写。

· 用户态文件系统的管理。Linux文件系统的实现都是在内核进行的,但是用户态也有一些管理机制可以对块设备文件进行相应的管理。例如,使用parted命令进行分区管理,使用mkfs工具进行文件系统的管理,使用逻辑卷管理器(Logical Volume Manager,LVM)命令把一个或多个磁盘的分区进行逻辑上的集合,然后对磁盘上的空间进行动态管理。

简言之,对于Linux操作系统中基于内核文件系统的支持,其实可以分为两大块:一是内核中虚拟文件系统、具体文件系统、内核通用块设备及各个I/O子系统的支持;二是Linux用户态与文件系统相关的管理系统,以及应用程序可以用的系统调用或库文件(Glibc)的支持。

当然在用户态也有一些用户态文件系统的实现,但是一般这样的系统性能不是太高,因为文件系统最终是建立在实际的物理存储设备上的,且这些物理设备的驱动是在内核态实现的。那么即使文件系统放在用户态,I/O的读和写也还是需要放到内核态去完成的。除非相应的设备驱动也被放到用户态,形成一套完整的用户态I/O栈的解决方案,就可以降低I/O栈的深度,另外采用一些无锁化的并行机制,就可以提高I/O的性能。例如,由英特尔开源的SPDK(Storage Performance Development Kit)软件库,就可以利用用户态的NVMe SSD(Non-Volatile Memory express)驱动,从而加速那些使用NVMe SSD的应用,如iSCSI Target或NVMe-oF Target等。

2.Linux远程存储服务

除了本地文件系统,Linux发行版本还自带工具,用于提供基于以太网、光纤通道的远程存储服务,包括块设备服务、文件系统服务,甚至是基于对象接口的服务。当然也有一些提供其他存储服务的开源软件。

1)块设备服务

Linux常用的块设备服务主要基于iSCSI(Internet Small Computer System Interface)和NVMe over Fabrics。

iSCSI协议是SCSI(Small Computer System Interface)协议在以太网上的扩展,一台机器通过iSCSI协议即可通过传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol,TCP/IP)为其他客户提供共享的存储设备。通过iSCSI协议被访问的设备称为Target,而访问Target的客户(Client)端称为Initiator。目前Linux主流的iSCSI Target软件是基于Kernel的Linux-IO,在用户态可以使用targetcli工具进行管理。当然还有其他开源的iSCSI Target,如STGT、SCST等。iSCSI常用的iSCSI Initiator工具包括iscsiadm命令和libiscsi、open-iscsi等软件开发包。

NVMe over Fabrics则是NVMe协议在Fabrics上的延伸,主要的设计目的是让客户端能够更高效地访问远端的服务器上的NVMe盘。相对iSCSI协议,NVMe over Fabrics则完全是为高效访问基于NVMe协议的快速存储设备设计的,往往和带有RDMA(Remote Direct Memory Access)功能的以太网卡,或者光纤通道、Infiniband一起工作。

2)文件存储服务

基于不同的协议,在Linux中可以提供很多文件粒度的服务。例如,基于网络文件系统(Network File System,NFS)协议的服务,服务器端可以直接加载支持网络文件系统协议的daemon。网络文件系统协议最早是由Sun公司在1984年开发的,目前已经发展到了NFSv4。

另外还有基于CIFS(Common Internet File System)的samba服务,使用这个服务可以向Windows客户端共享文件。这样Windows客户端可以把一个网络地址挂载成本地一块磁盘。例如,一个地址为192.168.1.8的Linux服务器导出一个名为XYZ的目录,实际指向/home/XYZ,那么客户端就可以使用\\192.168.1.8\XYZ,但是需要通过samba服务器的用户验证。

此外,Linux还有其他文件服务,如基于文件传输协议(File Transfer Protocol,FTP)的服务,这里不再赘述。另外在Linux系统中,如果用户熟悉SSH(Secure Shell)的一些命令,可以使用scp命令在不同Linux客户端进行文件的复制,或使用wget命令进行文件的下载。这是普通用户常用的功能,但需要服务器端的支持,不过这些服务器端程序的实现一般都比较简单。1.2.2 存储服务的分类

按照接口,存储服务可以分为3类:块存储服务、文件存储服务,以及对象存储服务。

1)块存储服务

对于块存储服务来说,操作的对象是一块“裸盘”,访问的方式是打开这块“裸盘”,通过逻辑区块地址对其进行读/写操作。对Linux本机访问来说,可以理解为将一块“盘”映射给主机使用。例如,可以通过磁盘阵列(Redundant Array of Independent Disks,RAID)等方式划分出多个逻辑盘,并将这些逻辑盘映射给主机使用。操作系统会识别这些磁盘,也会屏蔽底层物理盘和逻辑盘的划分细节,将整个磁盘看作一个裸设备来使用。在使用上,磁盘通过分区、格式化挂载之后则可以直接使用。

2)文件存储服务

文件存储服务,即提供以文件为基础、与文件系统相关的服务,如目录的浏览等。在客户端看到的就是层次结构的目录,目录里面有相应的数据,包括下级目录或文件等。对于Linux而言,基本文件的操作要遵循可移植操作系统接口(Portable Operating System Interface of UNIX,POSIX)文件系统的应用程序编程接口(Application Programming Interface,API)。其中,比较经典的就是Linux单机系统下的文件系统。如果是共享文件服务,则有一系列的协议,如网络文件系统等。

3)对象存储服务

相比块存储和文件存储,对象存储更简洁。对象存储采用扁平化的形式管理数据,没有目录的层次结构,并且对象的操作主要以put、get、delete为主。所以在对象存储中,不支持类似read、write的随机读/写操作,一个文件“put”到对象存储之后,在读取时只能“get”整个文件,如果要修改,必须重新“put”一个新的对象到对象存储里。

此外,在对象存储中,元数据(Metadata)会被独立出来作为元数据服务器,主要负责存储对象的属性,其他则是负责存储数据的分布式服务器,一般称为OSD(Object Storage Device)。用户访问数据时,通常会通过客户端发送请求到元数据服务器,元数据服务器负责反馈对象存储所在的服务器ID,用户通过ID直接访问对应的OSD,并存取数据。

因为在对象存储中没有目录的概念,所以文件存储与对象存储的本质区别就是有无层次结构。通常文件包含了元数据及内容构成,元数据用来存储该文件的除内容之外的属性数据,如文件的大小、存储位置索引等。例如,在常规的文件系统中,数据内容按照块大小会被分散到磁盘中,元数据中记录了各个数据内容的索引位置,在访问文件数据时,需要不断查找元数据来定位到每一个数据页,所以其读/写性能相对较低。

总的来说,对象存储是为了克服块存储与文件存储的缺点,并发挥它们各自的优点而出现的。块存储的优点是读/写速度快,缺点是不太适合共享;文件存储的优点是利于共享,缺点是读/写速度慢。所以结合它们各自的优点出现了对象存储,对象存储不仅读/写速度快,而且适用于分布式系统中,利于共享。1.2.3 数据压缩

随着计算能力的不断提升,当代社会正在产生越来越巨量的数据,数据压缩也被应用在生活的方方面面,如在网上打开的图片、视频、音频等都是经过压缩的。

压缩可以分为无损压缩和有损压缩。无损压缩可以通过压缩文件完全恢复原始文件;而有损压缩则会丢失一部分信息。对于文本、可执行程序的压缩是无损压缩的典型应用场景,因为任何一点信息的缺失都是不被允许的。有损压缩在图片、音频、视频方面被广泛应用,因为人们对于损失的部分信息并不敏感。有损并不意味着信息是被随机丢弃的,而是选择丢弃对恢复影响最小的部分。有损压缩既提高了效率,又保证了接受度。

这里主要讨论无损压缩。压缩的意义在于,使压缩文件在存储时占用的体积更小,传输时使用的带宽(Bandwidth)更少,传输速度更快。

1.数据压缩基础

压缩的本质是用更小的数据量表示更多的数据。无损压缩通常通过对数据中的冗余信息的处理来减小数据体积,因此是可逆的。无损压缩可实现的基础是真实世界的数据存在大量冗余,而通过对数据进行编码,就能尽量减少这种冗余。在香农提出的信息论中,他借用物理中度量无序性和混乱度的熵(Entropy)来表示系统中各个状态概率分布的程度,即系统不确定性的量度。分布越随机,概率越平均,熵越大。用公式表示为

其中,P(A)表示A信号发生的概率。通过该公式也可以看出概率分布越平均,熵就越大。

香农还定义了自信息量:

自信息量代表了信息中含有的比特数,粗略地讲就是对S这个信息编码所需要的比特数。从这个定义中可以看出,更高的概率意味着更小的信息量。信息熵就可以看作是自信息量对概率加权的求和,也就是信息编码的平均比特数,因此,更大的信息熵就表示需要更多的编码比特数,也就表示信号的分布更平均。实际上熵可以看作信息编码的最小编码率,即压缩的极限编码率。接下来,我们会讨论两种应用广泛的编码方式。

1)霍夫曼编码

霍夫曼编码是由美国计算机科学家大卫·霍夫曼(David Albert Huffman)于1952年攻读博士期间发明的,是一种用于无损数据压缩的熵编码。熵编码,是指对出现的每个不同符号,创建分配一个唯一的前缀码。前缀码是一种可变长度码,并且每个码字都具有前置性,即每个码字都不会被其他码字作为前置部分。

霍夫曼编码的原理是,为出现频率更高的字符分配更短的编码。通过这种方式,可以减少平均自信息量,使编码长度趋于信息熵。目前广泛使用的压缩算法(Compression Algorithm)都是使用霍夫曼编码作为编码方式的,如文件压缩格式gzip、PKZIP,以及图片压缩格式PNG、JPEG等。

2)算术编码

算术编码是一种应用在无损数据压缩领域的熵编码。和其他熵编码不同的是,算术编码可以把整条信息编码成一个一定精度的小数q(0.0≤q<1.0),如霍夫曼编码为一条信息中每个字符至少分配一个符号。

算术编码的基本原理是根据信源发射不同符号的概率,对区间[0,1]进行划分,区间宽度代表各符号出现的概率。通过下边的例子,可以有更清楚的理解。假设某个信源发射信号a、a、a的概123率分别为P(a)=0.7、P(a)=0.1、P(a)=0.2,这个信源发送123的信息是a、a、a,使用算术编码的编码过程如图1-3所示。那么a、1231a、a这个信息就可以用[0.5460, 0.5600]这个区间中的任何一个23数字来表示。图1-3 使用算数编码的编码过程

算术编码是到目前为止编码效率最高的一种统计熵编码方式,比著名的霍夫曼编码效率高10%左右。但由于其编码的复杂性、实现技术的限制及专利权的限制,并不像霍夫曼编码那样应用广泛。算术编码有两点优于霍夫曼编码:①符号更紧凑;②编码和符号的统计模型是分离的,可以和任何一种概率模型协同工作。

算术编码是一种高效清除字符串中冗余信息的算法,可以按分数比特位逼近信源熵,突破了霍夫曼编码只能按整数比特位逼近信源熵的限制。但是算术编码的实现有一个缺陷就是很难在具有固定精度的计算机上完成无限精度的浮点运算。对于有限精度的计算机系统,最终区间会收敛到一个点,无法再细分。因此,需要解决无限序列和有限精度之间的矛盾,通过对区间进行动态调整来保证区间不会收敛到一个点,同时这种调整又不能使编码和解码引入歧义。因此,带有区间调整算法的算术编码和基于整数的算术编码就被提了出来,这两种编码都是通过对缩减后的区间进行重新映射。非对称数字系统(Asymmetric Numeral System,ANS)就使用了这种思想,并且在Facebook的Zstandard 压缩库中已经做了代码实现。

2.Linux下开源数据压缩软件

目前,越来越多优秀的开源数据压缩软件出现在大众的视野中,这些开源数据压缩软件不仅免费,还提供了多种数据压缩算法,并且支持多种存储格式,因此被越来越多的用户接受。下面介绍常见的开源数据压缩软件。

1)FreeArc

FreeArc是一个开源的数据压缩软件,集成了多种数据压缩算法(如gzip、Multimedia、TrueAudio、Tornado、LZMA(Lempel-Ziv-Markov chain-Algorithm)、PPMD)和过滤器(如BCJ、DICT、DELTA、REP、LZP)。另外,FreeArc会根据文件类型自动选择最优的数据压缩算法,并支持数据恢复及算法加密(如AES +Twofish + Serpent)。FreeArc是目前压缩效率较高的数据压缩软件之一。

2)7-Zip

7-Zip是一款开源数据压缩软件,其特点是使用了LZMA与LZMA2算法的7z格式,具有非常高的压缩比。另外,7-Zip为7z与ZIP提供了更加完善的AES-256加密算法。7-Zip支持多种压缩/解压缩格式,如7z、gzip、ZIP、bzip2、XZ、TAR、WIN等。同时,7-Zip也支持其他格式文件的压缩/解压缩,如ARJ、CAB、CHM、cpio、Cramfs、DEB、DMG、FAT、HFS、ISO、LZH、LZMA、MBR、MSI、NSIS、NTFS、RAR、RPM、SquashFS、UDF、VHD、WIM、XAR、Z。对于ZIP及gzip格式的文件,7-Zip能够提供的压缩比比使用PKZIP和WinZip高2%~10%。

3)Snappy

Snappy是由Google开源的压缩/解压缩软件,具有快速、稳定的特点,一直被用于Google的产品当中。它的目标不是最大限度地兼容其他压缩格式,而是提供高速的压缩速度和合理的压缩比。例如,Snappy在64位的i7处理器上,可达约250MB/sec的压缩速度、500MB/sec的解压缩速度。相对于zlib,Snappy能够提供更快的压缩速度,但同时压缩后的文件大小相对来说会增大20%~100%。1.2.4 重复数据删除

重复数据删除(DEDUPE)在存储备份系统中有很重要的应用,有利于更高效地利用存储空间。重复数据删除在维基百科上的定义为“一种可粗粒度去除冗余数据的特殊数据压缩技术”,开宗明义地解释了重复数据删除和数据压缩之间的联系。

通俗地讲,数据压缩一般通过字符串或比特级的操作来去除冗余数据,然而重复数据删除判断数据冗余的粒度较大,一般是文件级别或块级别的匹配,其目标是达到性能和去重复比例的平衡。

为何需要进行重复数据删除呢?数据的快速增长是对数据中心最大的挑战,爆炸式的数据增长会消耗巨大的存储空间,这会迫使数据提供商去购买更多的存储,然而即使这样却未必能赶上数据的增长速度。这样的现实迫使我们去考虑一些问题:产生的数据是不是都被生产系统循环使用?如果不是,是不是可以把这些数据放到廉价的存储系统中?怎么让数据备份消耗的存储更低?怎么让备份的时间更短?数据备份后,可以保存的时间有多久(物理介质原因)?备份后的数据能不能正常取出?

在实际情况中,和生产系统连接的备份系统一般每隔一段时间就会对生产系统做一次主备份,即备份生产系统中的所有内容。在两次主备份之间有很多增量式备份,且生产系统和备份系统的工作时间一般来讲是互斥的。当然如果生产系统需要持续运行,那么备份系统则需要在生产系统相对空闲的时间来工作。也就是说,备份系统的工作时间是有限制的,一般这个时间被称为备份窗口。需要被备份的数据必须在这个时间全部被迁移到备份系统中,这就对备份系统的吞吐率提出了要求。

那么怎么提高备份系统的吞吐率呢?纯粹更换硬件是一种方法。例如,10年前,主流的备份系统用的是磁带,其局限性在于吞吐率不够而且只支持顺序读/写。为满足吞吐率方面的需求,主流的备份系统的后端存储开始采用磁盘。

用于备份的数据,或者多次备份过来的数据可能是相似的,如果我们不是机械化地去备份这些数据,而是有意识地识别其中冗余的数据,然后对相同的数据只备份一份或少数几份(出于数据可靠性方面的考虑),那么这种方法不仅减少了备份系统所需要的容量,还减少了备份时对带宽的使用。举一个现实的例子,邮件系统中有很多群发邮件,其内容相同,特别是附件。试问邮件备份系统中需要将用户的相同附件都保存一份吗?答案显然是不必要的。邮件系统的例子体现出重复数据删除的作用,不过邮件系统所用的重复数据删除比较简单,主要针对的是相同的文件。

简言之,文件级别的重复数据删除有很大的局限性。最浅显的问题就是:如果文件内容只是略微有些不同,那要怎样进行数据去重呢?换句话说,文件级别的粒度太大,而粒度太小就变成了常用数据压缩技术,也不太合适。所以我们需要的是粒度适中的,如大小平均在8KB左右(经验值)。这样的重复数据删除能让空间(数据去重比率)和时间(备份性能)达到一个最佳的平衡点。

综上所述,重复数据删除一般用于备份系统中(或二级存储)。衡量一个应用重复数据删除的备份系统是不是优秀,有以下几个主要特征。

· 数据去重复率。数据去重复率越大越能减少备份系统存储方

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载