CEPH浅析”系列之三——CEPH的设计思想
Ceph针对的目标应用场景
理解Ceph的设计思想,首先还是要了解Sage设计Ceph时所针对的目标应用场景,换言之,“做这东西的目的是啥?”
事实上,Ceph最初针对的目标应用场景,就是大规模的、分布式的存储系统。所谓“大规模”和“分布式”,是指至少能够承载PB级别的数据,并且由成千上万的存储节点组成。
在大数据口号深入人心的今天,PB已经远远不是一个激动人心的系统设计目标了。但是,应该指出,Ceph项目起源于04年。那是一个商用处理器以单核为主流,常见硬盘容量只有几十GB的年代。这和现在动辄6核12线程还要双处理器、单块硬盘3TB已经司空见惯的情况是不可同日而语的。因此,理解这个设计目标,应该考虑当时的实际情况。当然,如前所述,Ceph的设计并没有理论上限,所以PB级别并不是实际应用的容量限制。
在Sage的思想中,对于这样一个大规模的存储系统,是不能以静态的眼光来看待的。对于其动态特性,笔者概括为如下三个“变化”:
存储系统规模的变化: 这样大规模的存储系统,往往不是在建设的第一天就能预料到其最终的规模,甚至是根本就不存在最终规模这个概念的。只能是随着业务的不断开展,业务规模的不断扩大,让系统承载越来越大的数据容量。这也就意味系统的规模自然随之变化,越来越大。
存储系统中设备的变化: 对于一个由成千上万个节点构成的系统,其节点的故障与替换必然是时常出现的情况。而系统一方面要足够可靠,不能使业务受到这种频繁出现的硬件及底层软件问题的影响,同时还应该尽可能智能化,降低相关维护操作的代价。
存储系统中数据的变化: 对于一个大规模的,通常被应用于互联网应用中的存储系统,其中存储的数据的变化也很可能是高度频繁的。新的数据不断写入,已有数据被更新、移动乃至删除。这种场景需求也是设计时必须予以考虑的。
上述三个“变化”就是Ceph目标应用场景的关键特征。Ceph所具备的各种主要特性,也都是针对这些场景特征所提出的。
针对目标应用场景所提出的预期技术特性
针对上述应用场景,Ceph在设计之初的几个技术特性是:
高可靠性。 所谓“高可靠”,首先是针对存储在系统中的数据而言,也即,尽可能保证数据不会丢失。其次,也包括数据写入过程中的可靠性,也即,在用户将数据写入Ceph存储系统的过程中,不会因为意外情况的出现造成数据丢失。
高度自动化。 具体包括了数据的自动replication,自动re-balancing,自动failure detection和自动failure recovery。总体而言,这些自动化特性一方面保证了系统的高度可靠,一方面也保障了在系统规模扩大之后,其运维难度仍能保持在一个相对较低的水平。
高可扩展性。 这里的“可扩展”概念比较广义,既包括了系统规模和存储容量的可扩展,也包括了随着系统节点数增加的聚合数据访问带宽的线性扩展,还包括了基于功能丰富强大的底层API提供多种功能、支持多种应用的功能性可扩展。
针对预期技术特性所提出的设计思路
针对3.2节中介绍的预期技术特性,Sage对于Ceph的设计思路基本上可以概括为以下两点:
充分发挥存储设备自身的计算能力。 事实上,采用具有计算能力的设备(最简单的例子就是普通的服务器)作为存储系统的存储节点,这种思路即便在当时来看也并不新鲜。但是,Sage认为这些已有系统基本上都只是将这些节点作为功能简单的存储节点。而如果充分发挥节点上的计算能力,则可以实现前面提出的预期特性。这一点成为了Ceph系统设计的核心思想。
去除所有的中心点。 一旦系统中出现中心点,则一方面引入单点故障点,另一方面也必然面临当系统规模扩大时的规模和性能瓶颈。除此之外,如果中心点出现在数据访问的关键路径上,事实上也必然导致数据访问的延迟增大。而这些显然都是Sage所设想的系统中不应该出现的问题。虽然在大多数系统的工程实践中,单点故障点和性能瓶颈的问题可以通过为中心点增加备份加以缓解,但Ceph系统最终采用创新的方法更为彻底地解决了这个问题。
支撑设计思路实现的关键技术创新
无论多么新颖奇妙的设计思路,最终落地必定需要有技术实力的支撑。而这也正是Ceph最为闪亮的地方。
Ceph最为核心的技术创新就是前面所概括的八个字——“无需查表,算算就好”。一般而言,一个大规模分布式存储系统,必须要能够解决两个最基本的问题:
一是“我应该把数据写入到什么地方”。 对于一个存储系统,当用户提交需要写入的数据时,系统必须迅速决策,为数据分配一个存储位置和空间。这个决策的速度影响到数据写入延迟,而更为重要的是,其决策的合理性也影响着数据分布的均匀性。这又会进一步影响存储单元寿命、数据存储可靠性、数据访问速度等后续问题。
二是“我之前把数据写到什么地方去了”。 对于一个存储系统,高效准确的处理数据寻址问题也是基本能力之一。
针对上述两个问题,传统的分布式存储系统常用的解决方案是引入专用的服务器节点,在其中存储用于维护数据存储空间映射关系的数据结构。在用户写入/访问数据时,首先连接这一服务器进行查找操作,待决定/查到数据实际存储位置后,再连接对应节点进行后续操作。由此可见,传统的解决方案一方面容易导致单点故障和性能瓶颈,另一方面也容易导致更长的操作延迟。
针对这一问题,Ceph彻底放弃了基于查表的数据寻址方式,而改用基于计算的方式。简言之,任何一个Ceph存储系统的客户端程序,仅仅使用不定期更新的少量本地元数据,加以简单计算,就可以根据一个数据的ID决定其存储位置。对比之后可以看出,这种方式使得传统解决方案的问题一扫而空。Ceph的几乎所有优秀特性都是基于这种数据寻址方式实现的。
至此为止,Ceph的设计思想已经得到了较为全面深入的介绍。此后几篇文章将依次介绍Ceph的系统架构、工作原理与流程、主要特性等内容,并联系OpenStack,将Ceph和Swift加以对比分析。
CEPH浅析”系列之三——CEPH的设计思想的更多相关文章
- “Ceph浅析”系列之五——Ceph的工作原理及流程
本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...
- “CEPH浅析”系列之六——CEPH与OPENSTACK
在 <"Ceph浅析"系列之二--Ceph概况>中即已提到,关注Ceph的原因之一,就是OpenStack社区对于Ceph的重视.因此,本文将对Ceph在OpenSta ...
- Ceph浅析”系列之四——Ceph的结构
本文将从逻辑结构的角度对Ceph进行分析. Ceph系统的层次结构 Ceph存储系统的逻辑层次结构如下图所示[1]. Ceph系统逻辑层次结构 自下向上,可以将Ceph系统分为四个层次: (1)基础存 ...
- “Ceph浅析”系列之一——前言
开源技术专家章宇同学(@一棹凌烟)在C3沙龙分享过Ceph之后,最近来了劲头,一口气写了一系列<Ceph浅析>的博文,共8篇: "Ceph浅析"系列之一--前言 &qu ...
- “CEPH浅析”系列之八——小结
最初决定写这些文章的时候,本打算大致记录一下,几千字也就了事了.可是越写越觉得东西多,不说明白总有些不甘心,于是就越写越长,到这儿为止貌似已经有一万七千多字了.除了博士论文之外,应该是没有写过更长的东 ...
- “Ceph浅析”系列之二——Ceph概况
本文将对Ceph的基本情况进行概要介绍,以期读者能够在不涉及技术细节的情况下对Ceph建立一个初步印象. 1. 什么是Ceph? Ceph的官方网站Ceph.com上用如下这句话简明扼要地定义了Cep ...
- Storm概念学习系列之storm的设计思想
不多说,直接上干货! storm的设计思想 在 Storm 中也有对流(Stream)的抽象,流是一个不间断的.无界的连续 Tuple(Storm在建模事件流时,把流中的事件抽象为 Tuple 即元组 ...
- “Ceph浅析”系列之七——关于Ceph的若干想法
本篇文章的内容,主要是笔者在调研分析Ceph过程中产生的一些思考.因为其中的内容比较自由发散,且大多是笔者的个人见解,故此另启一文进行讨论. 关于Ceph的性能 目前为止,本系列的文章中没有涉及到Ce ...
- 3.4 spring5源码系列--循环依赖的设计思想
前面已经写了关于三篇循环依赖的文章, 这是一个总结篇 第一篇: 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖 第二篇: 3.2spring源码系列----循环依赖源 ...
随机推荐
- Network Instructions in Linux
I will gradually learn some instructions about Network in Linux. First, here are somethings about IP ...
- 2014 UESTC暑前集训动态规划专题解题报告
A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...
- java 27 - 3 反射之 通过反射获取构造方法并使用
类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限. 通过反射的方法获取构造方法并使用 ps:先忽略泛型 A.1:获取构造方法的数组: public Co ...
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- linux下内网端口转发工具:linux版lcx [实现远程内网维护]
这个工具以前使用的初衷是内网渗透,需要将内网ssh端口转发到外网服务器上.但这个工具同样适用于运维工程师进行远程内网维护. 当然这一切的前提是内网可以访问外网,检测方法当然就是直接ping 一个外网I ...
- JS获取当前页面的URL信息
设置或获取对象指定的文件名或路径. <script> alert(window.location.pathname) </script> 设置或获取整个 URL 为字符串. & ...
- Windows系统服务器IIS7.5 Asp.net支持10万请求的设置方法
问题现象 ECS Windows系统服务器基于IIS搭建的网站由于IIS默认的配置,服务器最多只能处理5000个同时请求,访问量大时很容易导致报错: Error Summary: HTTP Erro ...
- javascript中的链表结构
1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...
- github上写blog
http://www.elbow95.me/blog/My-First-Blog-Essay.html 阮一峰的: http://www.ruanyifeng.com/blog/2012/08/blo ...
- PAT 1019. 数字黑洞 (20)
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有"数字黑洞&qu ...