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。