icon1

1.1 Ceph概述

1.Ceph简介

从2004年提交第一行代码开始到现在,Ceph已经是一个有着十年之久的分布式存储系统软件,目前Ceph已经发展为开源存储界的当红明星,当然这与它的设计思想以及OpenStack的推动有关。

“Ceph is a unified, distributed storage system designed for excellent performance, reliability and scalability.”这句话说出了Ceph的特性,它是可靠的、可扩展的、统一的、分布式的存储系统。Ceph可以同时提供对象存储RADOSGW(Reliable、Autonomic、Distributed、Object Storage Gateway)、块存储RBD(Rados Block Device)、文件系统存储Ceph FS(Ceph Filesystem)3种功能,以此来满足不同的应用需求。

Ceph消除了对系统单一中心节点的依赖,从而实现了真正的无中心结构的设计思想,这也是其他分布式存储系统所不能比的。通过后续章节内容的介绍,你可以看到,Ceph几乎所有优秀特性的实现,都与其核心设计思想有关。

OpenStack是目前最为流行的开源云平台软件。Ceph的飞速发展离不开OpenStack的带动。目前而言,Ceph已经成为OpenStack的标配开源存储方案之一,其实际应用主要涉及块存储和对象存储,并且开始向文件系统领域扩展。这一部分的相关情况,在后续章节中也将进行介绍。

2.Ceph的发展

Ceph是加州大学Santa Cruz分校的Sage Weil(DreamHost的联合创始人)专为博士论文设计的新一代自由软件分布式文件系统。

2004年,Ceph项目开始,提交了第一行代码。

2006年,OSDI学术会议上,Sage发表了介绍Ceph的论文,并在该篇论文的末尾提供了Ceph项目的下载链接。

2010年,Linus Torvalds将Ceph Client合并到内核2.6.34中,使Linux与Ceph磨合度更高。

2012年,拥抱OpenStack,进入Cinder项目,成为重要的存储驱动。

2014年,Ceph正赶上OpenStack大热,受到各大厂商的“待见”,吸引来自不同厂商越来越多的开发者加入,Intel、SanDisk等公司都参与其中,同时Inktank公司被Red Hat公司1.75亿美元收购。

2015年,Red Hat宣布成立Ceph顾问委员会,成员包括Canonical、CERN、Cisco、Fujitsu、Intel、SanDisk和SUSE。Ceph顾问委员会将负责Ceph软件定义存储项目的广泛议题,目标是使Ceph成为云存储系统。

2016年,OpenStack社区调查报告公布,Ceph仍为存储首选,这已经是Ceph第5次位居调查的首位了。

3.Ceph应用场景

Ceph可以提供对象存储、块设备存储和文件系统服务,其对象存储可以对接网盘(owncloud)应用业务等;其块设备存储可以对接(IaaS),当前主流的IaaS云平台软件,例如OpenStack、CloudStack、Zstack、Eucalyptus等以及KVM等,本书后续章节中将介绍OpenStack、CloudStack、Zstack和KVM的对接;其文件系统文件尚不成熟,官方不建议在生产环境下使用。

4.Ceph生态系统

Ceph作为开源项目,其遵循LGPL协议,使用C++语言开发,目前Ceph已经成为最广泛的全球开源软件定义存储项目,拥有得到众多IT厂商支持的协同开发模式。目前Ceph社区有超过40个公司的上百名开发者持续贡献代码,平均每星期的代码commits超过150个,每个版本通常在2000个commits左右,代码增减行数在10万行以上。在过去的几个版本发布中,贡献者的数量和参与公司明显增加,如图1-1所示。

图1-1 部分厂商和软件

5.Ceph用户群

Ceph成为了开源存储的当红明星,国内外已经拥有众多用户群体,下面简单说一下Ceph的用户群。

(1)国外用户群

1)CERN:CERN IT部门在2013年年中开始就运行了一个单一集群超过10000个VM和100000个CPU Cores的云平台,主要用来做物理数据分析。这个集群后端Ceph包括3PB的原始容量,在云平台中作为1000多个Cinder卷和1500多个Glance镜像的存储池。在2015年开始测试单一30 PB的块存储RBD集群。

2)DreamHost:DreamHost从2012年开始运行基于Ceph RADOSGW的大规模对象存储集群,单一集群在3PB以下,大约由不到10机房集群组成,直接为客户提供对象存储服务。

3)Yahoo Flick:Yahoo Flick自2013年开始逐渐试用Ceph对象存储替换原有的商业存储,目前大约由10机房构成,每个机房在1PB~2PB,存储了大约2500亿个对象。

4)大学用户:奥地利的因斯布鲁克大学、法国的洛林大学等。

(2)国内用户群

1)以OpenStack为核心的云厂商:例如UnitedStack、Awcloud等国内云计算厂商。

2)Ceph产品厂商:SanDisk、XSKY、H3C、杉岩数据、SUSE和Bigtera等Ceph厂商。

3)互联网企业:腾讯、京东、新浪微博、乐视、完美世界、平安科技、联想、唯品会、福彩网和魅族等国内互联网企业。

6.社区项目开发迭代

目前Ceph社区采用每半年一个版本发布的方式来进行特性和功能的开发,每个版本发布需要经历设计、开发、新功能冻结,持续若干个版本的Bug修复周期后正式发布下一个稳定版本。其发布方式跟OpenStack差不多,也是每半年发布一个新版本。

Ceph会维护多个稳定版本来保证持续的Bug修复,以此来保证用户的存储安全,同时社区会有一个发布稳定版本的团队来维护已发布的版本,每个涉及之前版本的Bug都会被该团队移植回稳定版本,并且经过完整QA测试后发布下一个稳定版本。

代码提交都需要经过单元测试,模块维护者审核,并通过QA测试子集后才能合并到主线。社区维护一个较大规模的测试集群来保证代码质量,丰富的测试案例和错误注入机制保证了项目的稳定可靠。

7.Ceph版本

Ceph正处于持续开发中并且迅速提升。2012年7月3日,Sage发布了Ceph第一个LTS版本:Argonaut。从那时起,陆续又发布了9个新版本。Ceph版本被分为LTS(长期稳定版)以及开发版本,Ceph每隔一段时间就会发布一个长期稳定版。Ceph版本具体信息见表1-1。欲了解更多信息,请访问https://Ceph.com/category/releases/

表1-1 Ceph版本信息

1.2 Ceph的功能组件

Ceph提供了RADOS、OSD、MON、LIBRADOS、RBD、RGW和Ceph FS等功能组件,但其底层仍然使用RADOS存储来支撑上层的那些组件,如图1-2所示。

图1-2 Ceph功能组件的整体架构

下面分为两部分来讲述Ceph的功能组件。

(1)Ceph核心组件

在Ceph存储中,包含了几个重要的核心组件,分别是Ceph OSD、Ceph Monitor和Ceph MDS。一个Ceph的存储集群至少需要一个Ceph Monitor和至少两个Ceph的OSD。运行Ceph文件系统的客户端时,Ceph的元数据服务器(MDS)是必不可少的。下面来详细介绍一下各个核心组件。

❑Ceph OSD:全称是Object Storage Device,主要功能包括存储数据,处理数据的复制、恢复、回补、平衡数据分布,并将一些相关数据提供给Ceph Monitor,例如Ceph OSD心跳等。一个Ceph的存储集群,至少需要两个Ceph OSD来实现active +clean健康状态和有效的保存数据的双副本(默认情况下是双副本,可以调整)。注意:每一个Disk、分区都可以成为一个OSD。

❑Ceph Monitor:Ceph的监控器,主要功能是维护整个集群健康状态,提供一致性的决策,包含了Monitor map、OSD map、PG(Placement Group)map和CRUSH map。

❑Ceph MDS:全称是Ceph Metadata Server,主要保存的是Ceph文件系统(File System)的元数据(metadata)。温馨提示:Ceph的块存储和Ceph的对象存储都不需要Ceph MDS。Ceph MDS为基于POSIX文件系统的用户提供了一些基础命令,例如ls、find等命令。

(2)Ceph功能特性

Ceph可以同时提供对象存储RADOSGW(Reliable、Autonomic、Distributed、Object Storage Gateway)、块存储RBD(Rados Block Device)、文件系统存储Ceph FS(Ceph File System)3种功能,由此产生了对应的实际场景,本节简单介绍如下。

RADOSGW功能特性基于LIBRADOS之上,提供当前流行的RESTful协议的网关,并且兼容S3和Swift接口,作为对象存储,可以对接网盘类应用以及HLS流媒体应用等。

RBD(Rados Block Device)功能特性也是基于LIBRADOS之上,通过LIBRBD创建一个块设备,通过QEMU/KVM附加到VM上,作为传统的块设备来用。目前OpenStack、CloudStack等都是采用这种方式来为VM提供块设备,同时也支持快照、COW(Copy On Write)等功能。

Ceph FS(Ceph File System)功能特性是基于RADOS来实现分布式的文件系统,引入了MDS(Metadata Server),主要为兼容POSIX文件系统提供元数据。一般都是当做文件系统来挂载。

后面章节会对这几种特性以及对应的实际场景做详细的介绍和分析。

1.3 Ceph架构和设计思想

1.Ceph架构

Ceph底层核心是RADOS。Ceph架构图如图1-3所示。

图1-3 Ceph架构图

❑RADOS:RADOS具备自我修复等特性,提供了一个可靠、自动、智能的分布式存储。

❑LIBRADOS:LIBRADOS库允许应用程序直接访问,支持C/C++、Java和Python等语言。

❑RADOSGW:RADOSGW是一套基于当前流行的RESTful协议的网关,并且兼容S3和Swift。

❑RBD:RBD通过Linux内核(Kernel)客户端和QEMU/KVM驱动,来提供一个完全分布式的块设备。

❑Ceph FS:Ceph FS通过Linux内核(Kernel)客户端结合FUSE,来提供一个兼容POSIX的文件系统。

具体的RADOS细节以及RADOS的灵魂CRUSH(Controlled Replication Under Scalable Hashing,可扩展哈希算法的可控复制)算法,这两个知识点会在后面的第2、3章详细介绍和分析。

2.Ceph设计思想

Ceph是一个典型的起源于学术研究课题的开源项目。虽然学术研究生涯对于Sage而言只是其光辉事迹的短短一篇,但毕竟还是有几篇学术论文可供参考的。可以根据Sage的几篇论文分析Ceph的设计思想。

理解Ceph的设计思想,首先还是要了解Sage设计Ceph时所针对的应用场景,换句话说,Sage当初做Ceph的初衷的什么?

事实上,Ceph最初针对的应用场景,就是大规模的、分布式的存储系统。所谓“大规模”和“分布式”,至少是能够承载PB级别的数据和成千上万的存储节点组成的存储集群。

如今云计算、大数据在中国发展得如火如荼,PB容量单位早已经进入国内企业存储采购单,DT时代即将来临。Ceph项目起源于2004年,那是一个商用处理器以单核为主流,常见硬盘容量只有几十GB的年代。当时SSD也没有大规模商用,正因如此,Ceph之前版本对SSD的支持不是很好,发挥不了SSD的性能。如今Ceph高性能面临的最大挑战正是这些历史原因,目前社区和业界正在逐步解决这些性能上的限制。

在Sage的思想中,我们首先说一下Ceph的技术特性,总体表现在集群可靠性、集群扩展性、数据安全性、接口统一性4个方面。

集群可靠性:所谓“可靠性”,首先从用户角度来说数据是第一位的,要尽可能保证数据不会丢失。其次,就是数据写入过程中的可靠性,在用户将数据写入Ceph存储系统的过程中,不会因为意外情况出现而造成数据丢失。最后,就是降低不可控物理因素的可靠性,避免因为机器断电等不可控物理因素而产生的数据丢失。

集群可扩展性:这里的“可扩展”概念是广义的,既包括系统规模和存储容量的可扩展,也包括随着系统节点数增加的聚合数据访问带宽的线性扩展。

数据安全性:所谓“数据安全性”,首先要保证由于服务器死机或者是偶然停电等自然因素的产生,数据不会丢失,并且支持数据自动恢复,自动重平衡等。总体而言,这一特性既保证了系统的高度可靠和数据绝对安全,又保证了在系统规模扩大之后,其运维难度仍能保持在一个相对较低的水平。

接口统一性:所谓“接口统一”,本书开头就说到了Ceph可以同时支持3种存储,即块存储、对象存储和文件存储。Ceph支持市面上所有流行的存储类型。

根据上述技术特性以及Sage的论文,我们来分析一下Ceph的设计思路,概述为两点:充分发挥存储本身计算能力和去除所有的中心点。

充分发挥存储设备自身的计算能力:其实就是采用廉价的设备和具有计算能力的设备(最简单的例子就是普通的服务器)作为存储系统的存储节点。Sage认为当前阶段只是将这些服务器当做功能简单的存储节点,从而产生资源过度浪费(如同虚拟化的思想一样,都是为了避免资源浪费)。而如果充分发挥节点上的计算能力,则可以实现前面提出的技术特性。这一点成为了Ceph系统设计的核心思想。

去除所有的中心点:搞IT的最忌讳的就是单点故障,如果系统中出现中心点,一方面会引入单点故障,另一方面也必然面临着当系统规模扩大时的可扩展性和性能瓶颈。除此之外,如果中心点出现在数据访问的关键路径上,也必然导致数据访问的延迟增大。虽然在大多数存储软件实践中,单点故障点和性能瓶颈的问题可以通过为中心点增加HA或备份加以缓解,但Ceph系统最终采用Crush、Hash环等方法更彻底地解决了这个问题。很显然Sage的眼光和设想还是很超前的。

1.4 Ceph快速安装

在Ceph官网上提供了两种安装方式:快速安装和手动安装。快速安装采用Ceph-Deploy工具来部署;手动安装采用官方教程一步一步来安装部署Ceph集群,过于烦琐但有助于加深印象,如同手动部署OpenStack一样。但是,建议新手和初学者采用第一种方式快速部署并且测试,下面会介绍如何使用Ceph-Deploy工具来快速部署Ceph集群。

1.4.1 Ubuntu/Debian安装

本节将介绍如何使用Ceph-Deploy工具来快速部署Ceph集群,开始之前先普及一下Ceph-Deploy工具的知识。Ceph-Deploy工具通过SSH方式连接到各节点服务器上,通过执行一系列脚本来完成Ceph集群部署。Ceph-Deploy简单易用同时也是Ceph官网推荐的默认安装工具。本节先来讲下在Ubuntu/Debian系统下如何快速安装Ceph集群。

1)配置Ceph APT源。

root@localhos`t:~#  echo  deb  http://ceph.com/debian-{ceph-stable-release}/
$(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

2)添加APT源key。

root@localhost:~#  wget  –q  –O  -'https://ceph.com/git/? p=ceph.git; a=blob_
plain; f=keys/release.asc' | sudo apt-key add -

3)更新源并且安装ceph-deploy。

root@localhost:~# sudo apt-get update &&sudo apt-get install ceph-deploy -y

4)配置各个节点hosts文件。

root@localhost:~# cat /etc/hosts
192.168.1.2  node1
192.168.1.3  node2
192.168.1.4  node3

5)配置各节点SSH无密码登录,这就是本节开始时讲到的Ceph-Deploy工具要用过SSH方式连接到各节点服务器,来安装部署集群。输完ssh-keygen命令之后,在命令行会输出以下内容。

root@localhost:~# ssh-keygen
Generating public/private key pair.
Enter file in which to save the key (/ceph-client/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /ceph-client/.ssh/id_rsa.
Your public key has been saved in /ceph-client/.ssh/id_rsa.pub

6)复制key到各节点。

root@localhost:~# ssh-copy-idnode1
root@localhost:~# ssh-copy-idnode2
root@localhost:~# ssh-copy-idnode3

7)在执行ceph-deploy的过程中会生成一些配置文件,建议创建一个目录,例如my-cluster。

root@localhost:~# mkdir my-cluster
root@localhost:~# cd my-cluster

8)创建集群(Cluster),部署新的monitor节点。

root@localhost:~# ceph-deploy new {initial-monitor-node(s)}

例如:

root@localhost:~# ceph-deploy new node1

9)配置Ceph.conf配置文件,示例文件是默认的,可以根据自己情况进行相应调整和添加。具体优化情况本书后面会介绍。

[global]
fsid = 67d997c9-dc13-4edf-a35f-76fd693aa118
mon_initial_members = node1, node2
mon_host = 192.168.1.2,192.168.1.3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true
<! -----以上部分都是ceph-deploy默认生成的---->
public network = {ip-address}/{netmask}
cluster network={ip-addesss}/{netmask}
<! -----以上两个网络是新增部分,默认只是添加public network,一般生产都是定义两个网络,集
群网络和数据网络分开-------->
[osd]
……
[mon]
……

这里配置文件不再过多叙述。

10)安装Ceph到各节点。

root@localhost:~# ceph-deploy install {ceph-node}[{ceph-node} ...]

例如:

root@localhost:~# ceph-deploy install node1 node2 node3

11)获取密钥key,会在my-cluster目录下生成几个key。

root@localhost:~# ceph-deploy mon create-initial

12)初始化磁盘。

root@localhost:~# ceph-deploy disk zap {osd-server-name}:{disk-name}

例如:

root@localhost:~# ceph-deploy disk zap node1:sdb

13)准备OSD。

root@localhost:~# ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]

例如:

root@localhost:~# ceph-deploy osd prepare node1:sdb1:sdc

14)激活OSD。

root@localhost:~# ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]

例如:

root@localhost:~# ceph-deploy osd activate node1:sdb1:sdc

15)分发key。

root@localhost:~# ceph-deploy admin {admin-node} {ceph-node}

例如:

root@localhost:~# ceph-deploy admin node1 node2 node3

16)给admin key赋权限。

root@localhost:~# sudo chmod +r /etc/ceph/ceph.client.admin.keyring

17)查看集群健康状态,如果是active+clean状态就是正常的。

root@localhost:~# ceph health

提示

安装Ceph前提条件如下。

① 时间要求很高,建议在部署Ceph集群的时候提前配置好NTP服务器。

② 对网络要求一般,因为Ceph源在外国有时候会被屏蔽,解决办法多尝试机器或者代理。

1.4.2 RHEL/CentOS安装

本节主要讲一下在RHEL/CentOS系统下如何快速安装Ceph集群。

1)配置Ceph YUM源。

root@localhost:~# vim /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Cephnoarch packages
baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/? p=ceph.git; a=blob_plain; f=keys/release.asc

2)更新源并且安装ceph-deploy。

root@localhost:~# yum update &&yum install ceph-deploy -y

3)配置各个节点hosts文件。

root@localhost:~# cat /etc/hosts
192.168.1.2  node1
192.168.1.3  node2
192.168.1.4  node3

4)配置各节点SSH无密码登录,通过SSH方式连接到各节点服务器,以安装部署集群。输入ssh-keygen命令,在命令行会输出以下内容。

root@localhost:~# ssh-keygen
Generating public/private key pair.
Enter file in which to save the key (/ceph-client/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /ceph-client/.ssh/id_rsa.
Your public key has been saved in /ceph-client/.ssh/id_rsa.pub

5)拷贝key到各节点。

root@localhost:~# ssh-copy-id node1
root@localhost:~# ssh-copy-id node2
root@localhost:~# ssh-copy-id node3

6)在执行ceph-deploy的过程中会生成一些配置文件,建议创建一个目录,例如my-cluster。

root@localhost:~# mkdir my-cluster
root@localhost:~# cd my-cluster

7)创建集群(Cluster),部署新的monitor节点。

root@localhost:~# ceph-deploy new {initial-monitor-node(s)}

例如:

root@localhost:~# ceph-deploy new node1

8)配置Ceph.conf配置文件,示例文件是默认的,可以根据自己情况进行相应调整和添加。具体优化情况本书后面会介绍。

[global]
fsid = 67d997c9-dc13-4edf-a35f-76fd693aa118
mon_initial_members = node1, node2
mon_host = 192.168.1.2,192.168.1.3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true
<! -----以上部分都是ceph-deploy默认生成的---->
public network = {ip-address}/{netmask}
cluster network={ip-addesss}/{netmask}
<! -----以上两个网络是新增部分,默认只是添加public network,一般生产都是定义两个网络,集群网络和数据网络分开-------->
[osd]
……
[mon]
……

这里配置文件不再过多叙述。

9)安装Ceph到各节点。

root@localhost:~# ceph-deploy install {ceph-node}[{ceph-node} ...]

例如:

root@localhost:~# ceph-deploy install node1 node2 node3

10)获取密钥key,会在my-cluster目录下生成几个key。

root@localhost:~# ceph-deploy mon create-initial

11)初始化磁盘。

root@localhost:~# ceph-deploy disk zap {osd-server-name}:{disk-name}

例如:

root@localhost:~# ceph-deploy disk zap node1:sdb

12)准备OSD。

root@localhost:~# ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]

例如:

root@localhost:~# ceph-deploy osd prepare node1:sdb1:sdc

13)激活OSD。

root@localhost:~# ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]

例如:

root@localhost:~# ceph-deploy osd activate node1:sdb1:sdc

14)分发key。

root@localhost:~# ceph-deploy admin {admin-node} {ceph-node}

例如:

root@localhost:~# ceph-deploy admin node1 node2 node3

15)给admin key赋权限。

root@localhost:~# sudo chmod +r /etc/ceph/ceph.client.admin.keyring

16)查看集群健康状态,如果是active + clean状态就是正常的。

root@localhost:~# ceph health

1.5 本章小结

本章主要从Ceph的历史背景、发展事件、Ceph的架构组件、功能特性以及Ceph的设计思想方面介绍了Ceph,让大家对Ceph有一个全新的认识,以便后面更深入地了解Ceph。