初次见到李明宇博士,大概是在3年前了,当时还是中国科学院软件所的课题组负责人。从那时起,他就已经对Swift对象存储颇有研究,并开始萌生创业的打算。
后来明宇去了深圳,并创立奥思数据(OStorage),专注于对象存储的产品化和服务。同时在这两三年时间中,我有几位专家朋友分别建立了“小而美”的初创公司,比如在Gluster圈闻名的刘爱贵博士,创办了大道云行;还有Javen吴江兄的极道科技等。
在我看来,这三位朋友的创业有一点共性吧,那就是对技术的追求不变。当去年奥思数据在北京举办发布会,我得知Swift方面新书的计划事,就和明宇约定了精选其中章节在《企业存储技术》微信公众号上连载。
在上周在北京国家会议中心举行的OpenStack Days China上,奥思数据(OStorage Inc.)发表了《基于OpenStack Swift的跨地域云存储实践》的演讲,并正式发售新书《对象存储:OpenStack Swift应用、管理与开发》。
下面列出几个在线购买链接:
电子工业出版社 http://www.phei.com.cn/module/goods/wssd_content.jsp?bookid=49416
京东 https://item.jd.com/12179368.html
当当 http://spu.dangdang.com/25066341.html
我看当当网上搜到的标价最低,所以就在本文底部的 “阅读原文” 处,加上了这个跳转链接。
附:《对象存储:OpenStack Swift应用、管理与开发》序、前言及目录
推荐序
1995年,Garth Gibson在网络附加安全磁盘研究领域首次提出将一部分通用操作从常见操作中分离出来,以提高存储产品的性能和扩展性。1996年卡内基梅隆大学实验室提出对象存储研究项目。再后来,NASD团队成员之一的Howard Gobioff在对象存储架构中引入细粒度的访问控制,允许将数据的写入和读取放到更加灵活的数据容器,也就是对象当中。
随着时间的推移,从1999年到2013年期间,对象存储的概念得以在各项目和产品中实现并迅速发展成熟起来,包括OpenStack的Swift,以及Ceph,而且不少专门致力于对象存储的厂商由此诞生。
现在,随着云计算的蓬勃发展,计算、存储和网络已经组成了云计算的三大可管理的基础要素资源。上面提到的Swift,成为时下最流行的云计算基础架构即服务开源项目OpenStack里的核心项目,也是最早与OpenStack诞生的元老项目之一。作为对象存储的一种,Swift比较适合于存放静态数据,即长期不会发生更新的数据,或者在一定时期内更新频率比较低的数据。比如说虚拟机的镜像、多媒体数据以及数据的备份等。它的前身是Rackspace Cloud Files项目,由Rackspace于2010年贡献给OpenStack,与计算项目Nova一起作为最初仅有的两个项目开启了OpenStack元年。
英特尔云计算开发团队在OpenStack早期就介入了Swift开源项目,主要是参加Erasure Code功能实现,也被社区推举过两位核心开发员。在开发过程中,我们普遍感觉到Swift项目架构清晰,逻辑层次多,各服务组件责任明确,整体可扩展性高、安全性强,但是里面涉及的概念十分多,相关的算法也比较复杂,这给普通的开发人员以及运维人员上手和掌握Swift带来了难度。
我很早就结识奥思数据创始人李明宇,当时的他还在中科院担任专项课题组负责人,带领团队负责一些云计算和大数据方面的工程项目,致力于云计算和云存储等技术的研究与推广。他也是OpenStack社区著名微信群“翻滚吧,OpenStack!”群主,多次参加并在OpenStack Summit等国际峰会上发表演讲。我也曾多次邀请他来OpenStack Meetup上分享他在对象存储领域的知识和经验,并深深为他的渊博知识和演讲技巧所折服。后来得知他离开了中科院并创办了奥思数据,专注从事基于OpenStack Swift提供企业级对象存储产品的研发。
这次,恰逢对象存储领域另一强者SwiftStack公司创始人Joe Arnold带领公司团队编著了《OpenStack Swift: Using, Administering, and Developing for Swift Object Storage》,该书自2014年10月由O’Reilly Media公司出版后在海外得到众多读者的追捧,好评如潮。为了让广大国内读者能及时阅读和欣赏到好的作品,快速掌握对象存储和OpenStack Swift,李明宇和奥思数据技术团队凭借多年专业背景、深厚技术基础和较高英语水平对原著进行了翻译。
在本书中文版即将出版之际,我浏览了该书的电子版。所谓专业的人做专业的事情,此书强强联合,融合了两家专注Swift项目的公司的集体智慧和丰富经验,相信能帮助读者更轻松理解OpenStack Swift的原理与架构,更迅速掌握应用程序设计、安装、部署、运维与性能测试。就像本书简介里说的那样,用生动翔实的语言带读者领略Swift 对象存储的魅力,使读者能像Swift的标志雨燕那样在新存储的世界里翱翔。
Dr. Shane Wang
王庆博士
英特尔开源技术中心网络和存储部门开发经理
OpenStack基金会个人独立董事
2017年3月23日于上海
译者序
在经历了多个忙碌到深夜的努力后,本书终于和国内读者见面了。本书翻译工作由李明宇组织,主要由于航、陈洪等奥思数据OStorage技术团队的工程师们合作完成,其中于航翻译了前言,第3章至第7章和第16章、第17章,陈洪翻译了第2章、第8章、第10章、第13章至第15章。
认识对象存储和Swift,要从其背景开始。Swift是做公有云服务的公司Rackspace的技术人员,受AWS S3的启发而设计的对象存储系统,其大规模、运营商级的可靠性、跨地域特性等都是从诞生就存在的基因,Swift被多个运营商和大型客户几年的实际应用,也证明了它的可靠性和数据持久性值得信赖,这对于关键数据的存储来说是至关重要的。
另一个让我们着迷的是Swift优美的设计。一致性哈希环的采用,以API服务为中心,前后端灵活分离的架构,多个区域对象同步的模式,等等,都无不体现了Swift设计的精致、灵活和强大。存储也可以做到如此智慧!我们在翻译此书的过程中,也获益良多。
Swift对象存储完美诠释了新一代IT基础架构的面向服务的理念。这也是“云”的概念的出发点。我们十分坚信对象存储是未来。在企业IT基础架构中,对象存储正在开始取代旧的存储技术,趋势不可逆转。让我们一起见证这个过程吧!
奥思数据公司基于Swift打造OStorage系列对象存储产品,如果想就Swift和对象存储与我们做相关的技术交流和沟通,可以通过[email protected]来找到我们。
奥思数据技术团队
前言
当应用程序开始直接为网络用户和移动用户提供存储服务时,现代对象存储便应运而生。无论用户使用的是笔记本电脑、平板电脑还是智能手机,越来越多的应用程序都需要直接向用户交付内容。对象存储之所以强大,是因为它用来对话的正是web自己的语言:HTTP。此外,由于对象存储更擅长存储非事务性数据,所以非常适用于归档、备份、文件共享、科学和研究数据,以及数字媒体等。
这本书涵盖了Swift对象存储项目(简称为Swift)和SwiftStack对象存储软件公司。SwiftStack提供一种友好的方式来访问、部署和管理集群。我们的目标是向你展示如何打造自己的Swift,展示SwiftStack的主要特性,并帮助你确定SwiftStack对你是否有意义。我们相信SwiftStack是一个适用于多种用途的好产品,不过也请你放心,Swift生态系统非常丰富并且在不断完善,如果SwiftStack不是一个合适的选择,你还可以选择其他的服务提供商。最后,我们想向你出售Swift对象存储产品,虽然它不一定是由SwiftStack公司出品的。
从我在应用程序中第一次使用对象存储至今已经过去了六年,我想分享一下个人的一些经验,到底如何处理急剧增长的数据量。我很幸运地成为开发团队的一员,我们的团队开发了运行在上层Amazon Web Service上的第一个广泛使用的平台即服务(PaaS)环境。这使得整个行业意识到一个基于http的对象存储系统有多么强大。就我个人而言,我已经意识到对象存储系统与传统的存储系统相比,可以提供更大的灵活性、更少的锁定、更好的控制和更低的成本。业内一些其他的组织和机构也会秉承这一观点。随着数据(但不是IT预算)呈指数级增长,几乎可以肯定地说,数据存储的挑战将一直存在,并且不断增长,这将深刻地影响每一个拥有存储需求和数据服务需求的个人或者企业。
由于我作为一线人员在大规模部署和管理对象存储系统中遭受了巨大的痛苦,所以我想写一本书来帮助他人。作为部署人员,我发现自己经常需要更多实用的信息。我还想了解这些系统是如何工作的,想了解这些系统更加全面的基本原理、为什么要这样设计,以及如何使用这些系统。目前,随着Swift已经成为一个非常重要且快速发展的存储技术,我希望这本书能够对Swift对象存储系统提供实践和理论上的一些有帮助的见解。
在进一步探讨之前,我想分享一下John Dickinson在最初的Swift开发团队工作的经验。John解释了为什么要开发Swift以及如何开发Swift,还有如何传承OpenStack的协作和创新精神,并将其用于Swift的发展。
Swift的起源——从渺小到开放
OpenStack Swift项目技术主管、SwiftStack技术主管John Dickinson的回忆。
2008年,Rackspace开发了他们的Rackspace Cloud Files云存储服务以满足客户需求,并提供给客户一个类似于亚马逊Simple Storage Service(S3)的存储服务。在一定程度上,Rackspace Cloud Files底层技术的第一次迭代开发是非常伟大的。但坦白说,我们还需要大量的时间、精力和金钱去扩展它。非结构化数据增长如此之快,我们意识到我们需要更好的解决方案。所以在2009年8月,Rackspace组织了一个团队来开发一个彻底的替代品,以替代他们最初的云存储平台。我很幸运参与了该项目团队,项目代号为“Swift”。
我们的团队一共有9个人,我们协同工作,但是我们谁都没有特定的角色。大多数情况下,我们坐在San Antonio市中心四楼的一个既小又热的房间,确定哪些是我们需要解决的困难和问题。我们试图解决如何部署Swift,网络会是什么样子,基础架构是什么样子——还有类似的一些问题。我们精诚合作,但我们也会热烈争论,以获取最好的解决方案。我们长时间地考虑一个问题直至下班回家。第二天我们还会带着解决方案回来,然后去实现它,我们会选择我们认为更好的解决方案。我们拥有很好的团队氛围,这是一个很棒的体验。奇思妙想在屋子里游荡,甚至有些想法很疯狂。但是即便被大家认为疯狂的想法有时却产生了非常好的效果。
我们在这里工作了大约一年,2010年7月,我们的成果成为了Rackspace与NASA合作的OpenStack项目的一部分,我们基于Apache 2许可证发布了Swift源代码;我们贡献了云文件Swift代码,后来它成为了OpenStack对象存储;2010年10月,发布了代号为“Austin”的Swift第一个正式版本,其中包括由美国国家航空航天局(NASA)贡献的计算编制框架。除了Rackspace之外,Swift第一个大规模商业化的应用是韩国电信和Internap,其使用Swift提供公共云存储服务(后来我认识了Joe Arnold,并最终加入SwiftStack)。Swift如今被网络公司、各种规模的企业、生命科学公司、研究机构和全球服务提供商所使用。
最后我想说,我们创建了一个伟大的云存储平台的内核,能成为开发团队的一员,我感到很自豪。更加可喜的是Swift可以发展为规模更大项目的一部分,可以走得更远。Rackspace Hosting做了一个简短的视频来介绍Swift是如何开发的,视频结尾处以这样一句话结束——撤退到漫天繁星的外太空。我们的星球大战的引用是半开玩笑半认真的。我们已经成为了日益壮大的反抗巨大的专有云力量的一部分,我们真的做到了,而且仍然觉得我们正在创建一个标准的方式来部署应用程序,并连接到云上。目前我们仍然是少数派,但我们的力量和能力也在不断增长,这在很大程度上是因为越来越多的公司和开发者正在使用OpenStack Swift并且不断地完善它。
成书缘由
在SwiftStack——我在2011年联合创办的一个公司,我们的重要理念是提供Swift对象存储与管理系统,因此我们的客户可以实现——
□ 灵活性,他们如何(在哪)部署他们的存储。
□ 自由控制自己的数据而不是被锁定在供应商那里。
□ 极其经济的私有云存储。
这些功能是软件定义存储(一个新的而且不断发展的术语)的本质(SDS)。我们认为这个词完美地展示了Swift所代表的根本性的变化。SDS的关键是可扩展性、适应性和非硬件锁定。操作人员现在只需要关心他们的存储如何扩展如何管理,用户如何存储和访问数据——进而对整个存储层驱动编程,而不用担心存储资源的部署位置,并且基于这个特点做出决定。SwiftStack很早就洞悉到了这个趋势,而且提供了SDS存储控制器来管理存储硬件。
SwiftStack致力于提供和改善Swift解决方案,因为我们相信数据存储应当能够在全球范围内自由地扩展规模,而不会受到技术上的约束、限制或锁定。以数据为中心的组织和以数据为中心的应用程序可以不受约束地增长,用户将能够在他们的行业中发现和利用新的机会并且加快创新的步伐。
这本书将传递软件定义存储的新信念。我们强调SDS,这是存储领域发生的一个根本性的改变。当然,我们将重点理解Swift对象存储项目,同时我们将简单介绍一下SwiftStack。我们不仅介绍我们的想法,同时也分享整个SwiftStack团队的经验。一些Swift的创始人和最高贡献开发者加入了我们。总之,我们已经在实际部署中积累了很多经验,我们将在这本书中与你分享。
适宜读者
OpenStack Swift是写给那些对Swift感兴趣的部署人员、运维人员和开发人员的。虽然没有必要从头到尾通读全书,但我们试图以一个清晰的逻辑顺序来分享我们的经验。
这本书试图以一种简单明了的方式解释Swift,这样任何人都可以了解Swift的基本概念和原则,当然一些技能对你使用和了解书中内容还是大有裨益的。我们假设一些读者已经熟悉了Linux管理、网络和存储。此外,基本编程技能也能够派上用场,因为一些章节涵盖了Swift API。我们提供了针对Python、Ruby PHP和Java的编程概述。
此书旨在帮助新手学习我们的经验,我们的目标是让你更快更容易地起步和成长,让你成功地进入到Swift的世界。你好,swifter!
全书内容
这本书分为三大块。第一部分(第1~4章)涵盖了Swift基础,在一定程度上,我们希望它可以适用于所有的读者,可以把它视为Swift的基础训练营。我们的目标是让你熟悉它的架构、历史、使用案例和Swift的基本操作。
第二部分(第5~8章)是面向开发人员的,旨在帮助他们充分使用他们的Swift集群。从文件系统过渡到对象伴随着巨大的变化,这些章节将会讲解如何使用一个HTTP-addressable对象存储系统。如何使用Swift、如何不使用Swift,在这一部分都会有详细的描述。
这本书剩余的内容主要是为存储运维人员、架构师和系统管理员而设计的。我们把这些内容分为三个部分——安装、规划部署和日常运维。第三部分(第9章和第10章)包含Swift安装选项。第四部分(第11~14章)提供了部署中的一些注意事项:硬件、网络和那些运维人员感兴趣的Swift的特性。最后,第五部分(第15~17章)讲述了出现问题我们该如何去解决。
关于如何阅读此书,根据你的兴趣可以参考以下几个可能的学习方案。
□ 如果你负责设计和架构一个Swift集群,读一下第一部分,然后查看第四部分。
□ 如果你是一个开发者,在阅读完第一部分之后,可以继续学习第二部分的Swift和其API。
□ 如果你是一个系统管理员或者运维人员,阅读第一部分,然后直奔第三部分,最后去阅读第四部分。
目录
第一部分 基础与架构
第1章 存储的演进 3
当今数据的存储需求 3
- - 数据的增长:艾字节(Exabytes)、骇字节(Hellabytes)以及更多 4
- - 非结构化数据的存储需求 4
没有放之四海而皆准的存储系统 5
对象存储与其他存储类型的比较 6
新的存储架构:软件定义存储(SDS) 7
软件定义存储组件 8
- - 软件定义存储的优点 9
为什么是OpenStack Swift 9
小结 10
第2章 初识Swift 11
认识SwiftStack 15
第3章 Swift数据模型和体系结构 17
Swift数据模型 17
Swift体系结构 20
服务进程(Server Processes) 22
一致性进程(Consistency Processes) 24
定位数据 26
- - 环基础:哈希函数 26
- - 环基础:一致性哈希环 28
- - 环文件:修改后的一致性哈希环 30
- - 数据分发(Distribution of Data) 32
创建和更新环 32
- - 创建和更新构造文件 32
- - 重新平衡环(Rebalancing the Rings) 33
- - 环内部结构 33
小结 34
第4章 Swift基础 35
与集群交谈:Swift API 35
发送请求 36
- - 存储URL 36
- - 身份验证 37
- - HTTP动词 37
授权和采取行动 38
获取响应 38
通信工具 39
- - 命令行界面 39
- - 自定义客户端应用程序 42
示例场景 43
小结 43
第二部分 Swift应用程序设计
第5章 Swift API概述 47
API到底是什么? 47
CAP定理 48
Swift的亮点:高可用性、冗余性和高吞吐量 49
Swift API:背景 50
- - 回顾超文本传输协议(HTTP) 50
- - 表现层状态转化(REST) 53
- - Swift、HTTP和REST 53
使用Swift API 54
- - 关于你的Swift集群 54
- - 认证 55
- - 检索数据 56
- - 存储数据 58
- - 删除数据 59
- - 更新元数据 60
小结 61
第6章 Swift客户端库 63
客户端库 63
身份验证交换 64
存储请求:基本用法 65
其他语言的客户端库 68
- - Ruby 68
- - PHP 68
- - Java 69
存储请求:高级用法 70
使用Python的其他注意事项 71
小结 71
第7章 高级API特性 73
大对象(Large Objects) 73
对象版本管理 75
对象过期 75
临时URL中间件(TempURL) 76
表单提交中间件 76
自定义元数据 77
上传和更新元数据 77
跨域资源共享(CORS) 78
Swift集群信息 79
范围请求 80
域重映射中间件 80
静态Web托管(Static Web Hosting) 81
Content-Type头 82
批量操作中间件 82
代码示例 83
- - 静态大对象 83
- - 动态大对象 84
- - 对象版本管理 85
- - TempURL(Time-Limited URLs) 86
- - 表单提交 87
- - 跨域资源共享(CORS) 88
- - 自定义元数据 89
- - Swift集群信息 90
- - 范围请求 90
- - 域重映射 91
- - 静态web托管 92
- - Content-Type 93
- - 批量上传 93
- - 批量删除 94
小结 94
第8章 部署Swift中间件 95
WSGI框架简介 95
编写WSGI 97
数据流和数据的修改 98
通过Paste来配置中间件 100
如何编写Swift中间件 102
由内而外 104
简单的例子 104
中间件中更多的工作 106
回顾与前瞻 110
小结 111
第三部分 Swift的安装
第9章 源码安装OpenStack Swift 115
下载OpenStack Swift 115
- - 依赖 116
- - 安装Swift CLI(python-Swiftclient) 116
- - 安装Swift 117
- - 复制Swift配置文件 117
配置Swift 117
- - 向Swift中添加驱动器 118
- - 存储策略 122
- - 创建环构造器文件 124
- - 向构造文件中添加磁盘 128
- - 添加硬盘 130
- - 构建环 131
配置Swift日志 132
- - 创建日志配置文件 132
- - 重启Rsyslog,开始记录Swift日志 133
配置代理服务 133
- - 设置哈希路径前缀和后缀 133
- - 开启代理服务 134
设置TempAuth验证和Swift授权 134
- - 开启memcahed 134
- - 在proxy-server.conf中添加用户 135
- - 启动服务和重启代理 135
- - 账户认证 136
验证账户访问 137
创建容器 138
上传对象 139
开启一致性进程 139
- - 配置rsync 140
- - 启动其他一致性进程 141
小结 141
第10章 安装SwiftStack 143
SwiftStack控制器和节点概述 143
- - SwiftStack控制器 143
- - SwiftStack节点 145
使用SwiftStack创建一个Swift集群 146
- - 创建一个SwiftStack控制器用户 146
- - 安装SwiftStack节点软件 147
- - 声明一个新节点 147
- - 创建集群 148
- - 获取节点 149
- - 启用SwiftStack节点 149
- - 配置SwiftStack节点 150
- - 添加Swift用户 150
- - SwiftStack中间件 151
- - 部署到集群 152
- - 通过网页控制台来创建容器和上传对象 153
小结 154
第四部分 规划Swift部署
第11章 Swift的硬件 157
节点的硬件规格 158
- - CPU 158
- - 内存 161
- - 盘 162
集群组网(Cluster Networking) 164
- - 网卡(NIC) 165
- - 对外网络(Outward-Facing Network) 165
- - 对内网络(Cluster-Facing Network) 165
- - 数据复制网络(Replication Network) 166
- - 带外管理(Out-of-Band Management) 166
- - 其他网络连接 166
小结 167
第12章 规划Swift部署 169
你的用例 169
系统设计 170
- - 多少个节点? 171
- - 节点服务分层(Tiering Node Services) 175
- - 定义集群空间 176
- - 节点命名规则 178
- - 身份验证与授权 178
组网 179
- - 对外网络 180
- - 集群内部的网络 181
示例部署 184
- - 小规模集群:几个节点 184
- - 中等规模集群:多个机架 184
- - 大规模集群:多个地域 184
小结 185
第13章 认证和授权 187
认证 187
- - 认证系统工作原理 188
- - 认证请求 190
- - 认证处理 192
- - 认证响应 194
在存储请求中使用认证令牌 196
授权 196
- - 授权案例 197
- - 授权原理 197
- - 存储请求处理 200
- - 令牌确认和授权信息查询 200
- - 授权回调和响应 201
授权和访问级别 201
账户访问控制 202
- - 只读访问(Read-Only Access) 202
- - 读写访问(Read-Write Access) 203
- - 管理员访问(Admin Access) 203
- - 账户访问控制的JSON字典 203
容器访问控制 204
- - 容器ACL示例 205
Swift认证系统 206
- - Keystone 206
- - TempAuth 206
- - SWAuth 207
SwiftStack认证系统 207
- - SwiftStack Auth 207
- - SwiftStack LDAP 208
- - SwiftStack Active Directory 208
小结 209
第14章 集群调优和性能优化 211
Swift设置 211
- - worker进程 212
- - 块大小 213
- - 设置后台进程 214
外部管理设置 218
Swift中间件 219
- - 中间件管道 219
- - 重要中间件 219
- - 最有用的中间件 222
- - 其他中间件 223
SwiftStack方法 224
小结 225
第15章 操作Swift集群 227
操作注意事项 227
- - Swift如何分发数据 228
- - 追踪环和构造器文件 228
管理容量 229
- - 我们应当避免什么 230
- - 添加容量 230
- - 现有集群:初始化节点上的环 231
- - 添加节点 234
移除容量 239
- - 移除节点 240
- - 移除盘 241
使用SwiftStack管理容量 243
- - 添加容量 244
- - 添加盘 245
- - 添加节点 246
- - 移除容量 246
- - 移除节点 246
- - 移除盘 247
监控你的集群 248
- - Swift特有指标:监控什么 248
- - 监控和日志工具 250
- - SwiftStack工具 250
使用SwiftStack进行操作 252
小结 253
第五部分 调试和检修故障
第16章 硬件故障与恢复 257
处理故障的驱动器 258
处理已满的盘 259
处理扇区和部分磁盘故障(也称为位衰减) 259
处理无法访问的节点 260
处理故障节点 261
节点故障案例研究 262
小结 263
第17章 基准测试 265
评估性能 266
性能指标、基准测试和测试 267
- - 准备你的集群以进行基准测试 268
- - 避免陷阱和错误 269
- - 基准测试目标和工具 269
- - 不要贪婪 270
- - 瓶颈 271
使用ssbench进行基准测试 273
- - 安装ssbench 273
- - 基本ssbench运行 273
- - 定义用例 274
- - ssbench如何工作 275
- - 测量基本性能 275
- - 进一步使用ssbench 276
- - 定义场景文件 277
- - ssbench-worker 280
- - 启动ssbench-worker的方法 280
使用swift-bench进行基准测试 281
- - 准备 282
- - swift-bench如何工作 282
- - 容器数量 282
- - 测试高并发(-c, -b) 283
- - 测试延迟 283
- - 对象大小(-s, -l) 284
- - 对象数(-n) 284
- - GET数(-g) 284
- - 不删除选项(-x) 284
- - 创建配置文件 285
- - swift-bench运行示例 285
- - 运行分布式swift-bench 285
- - swift-bench配置示例 286
- - 统计工具 287
小结 288
Swift后记 289
如果您对这本书的内容感兴趣,或者还没有决定是否要购买,请继续关注本公众号的连载。
注:本文只代表作者个人观点,与任何组织机构无关,如有错误和不足之处欢迎在留言中批评指正。进一步交流技术,可以加我的QQ/微信:490834312。如果您想在这个公众号上分享自己的技术干货,也欢迎联系我:)
尊重知识,转载时请保留全文,并包括本行及如下二维码。感谢您的阅读和支持!《企业存储技术》微信公众号:HL_Storage
长按二维码可直接识别关注
历史文章汇总(传送门):http://chuansong.me/account/huangliang_storage
点击下方“阅读原文”,跳转到新书购买链接(当当网)