Ceph介绍
Ceph是一种热门的软件定义存储(SDS)技术,可以运行在几乎所有主流的 Linux 发行版(比如CentOS和Ubuntu)和其它类UNIX操作系统(典型如FreeBSD)。Ceph是一个开源项目,为块存储、文件存储和对象存储提供了统一的软件定义存储解决方案,既支持传统的块、文件存储协议,例如 SAN 和 NAS ;也支持对象存储协议,例如S3和Swift。Ceph具有如下特点:
- Ceph是一个真正的SDS解决方案,它可以从软件层面正确提供所有的企业级存储特性:低成本、可靠性、可扩展性是Ceph的主要特点。
- Ceph是一个真正的统一存储解决方案,它从单一统一软件层提供对象、块和文件存储。
- Ceph通过一个算法来动态计算存储和获取某个对象的位置,消除了中心节点(中心节点往往是性能的瓶颈)。
传统的存储系统并不具备更智能地管理元数据的方法。传统的存储系统通过维护一张集中的查找表来跟踪它们的元数据。客户端每次发出读写操作请求时,存储系统首先要查找这个巨大的元数据表,得到结果之后它才能执行客户端请求的操作。对于一个小的存储系统而言,也许不会感觉到性能问题,但对于一个大的存储集群来说,将会受制于这种方法的性能限制,进而限制系统的扩展性。
Ceph引入了一个叫CRUSH的新算法,而不是保存和操纵元数据
CRUSH 是 Controlled Replication Under Scalable Hashing 的缩写,即基于可扩展哈希的受控副本分布策略,CRUSH 算法在后台计算数据存储和读取的位置,而不是为每个客户端请求执行元数据表的查找。通过动态计算元数据,不需要管理一个集中式的元数据表。
此外,CRUSH 使得 Ceph 能够自我管理和自我治愈。当故障区域中的组件故障时,CRUSH 能够感知哪个组件故障了,并确定其对集群的影响。无须管理员的任何干预,CRUSH 就会进行自我管理和自我疗愈,为因故障而丢失的数据执行恢复操作。
Ceph架构
Ceph 的架构如下图所示:
下面,我们对图中的Ceph组件做一一介绍:
- MON 监视器:即 Ceph monitor ,通过保存一份集群状态映射(Cluster Map)来维护整个集群的健康状态,并分别为每个组件维护映射信息:OSD map、MON map、PG map、CRUSH map。所有节点都向 MON 节点汇报状态信息,并分享它们状态中的任何变化。Ceph mon 不存储数据:这是Ceph osd 的任务。
- OSD 对象存储设备:只要应用程序向 Ceph 集群发出写操作,数据就会被以对象形式存储在 OSD 中。OSD 是 Ceph集群中唯一能存储用户数据对的组件,同时用户也可以发送读命令来读取数据。通常,一个 OSD 守护进程会被捆绑到集群中的一块物理磁盘上,因此,通常情况下,Ceph集群中的物理磁盘总数,与在磁盘上运行的存储用户数据的 OSD 守护进程的数量是相同的。
- MDS 元数据服务器:MDS 只为 CephFS 文件系统跟踪文件的层次结构和存储元数据。Ceph 块设备和 RADOS GW并不需要元数据,因此也并不需要 Ceph MDS 守护进程。MDS 不直接提供数据给客户端,从而消除了系统中的故障单点。
- RADOS:RADOS 是 Ceph 存储集群的基础。在 Ceph 中,所有数据都以对象形式存储,并且无论是哪种类型,RADOS 对象存储都将负责保存这些对象。RADOS 层可以确保数据始终保持一致,为此 RADOS 层须进行数据复制、故障检测和恢复,以及数据迁移和在所有集群节点实现再平衡。
- LIBRADOS:librados 库为PHP、Ruby、Java、Python、C 和 C++ 这些编程语言提供了方便地访问 RADOS 接口的方式。同时它还为诸如 RBD、RGW 和 CephFS 这些组件提供了原生的接口。librados 还支持直接使用 RADOS 来节省HTTP开销。
- RBD RADOS块设备:RBD 提供持久块存储,它是自动精简配置并可调整大小的,并将数据分散存储在多个OSD上。RBD服务被封装成了基于 librados 的一个原生接口。
- RGW RADOS网关接口:RGW提供对象存储服务,使用 librgw 和 librados ,允许应用程序与 Ceph 对象存储建立连接。RGW 提供了与 Amazon S3 和 OpenStack Swift 兼容的 RESTful API。
- CEPH FS 文件系统:Ceph 文件系统提供了一个使用 Ceph 存储集群存储用户数据,并与 POSIX 兼容的文件系统。和 RBD、RGW 一样,CephFS也是基于 librados 封装了原生接口。
POSIX:可移植操作系统接口Portable Operating System Interface of UNIX,POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。
Ceph集群存储协议:RBD、CephFS、RGW
Ceph 块存储:RBD
数据以块的形式存储在卷里,卷会挂载到节点上,这些块形成的卷会映射到操作系统中,并被文件系统层控制。Ceph 引入了一个新的 RBD 协议,也就是 Ceph 块设备。RBD 为客户端提供了可靠、分布式、高性能的块存储。RBD 已经被 Linux 内核支持,几乎所有的 Linux 操作系统发行版都原生支持RBD。除了可靠性和性能之外,RBD也支持其他的企业级特性,如完整和增量式快照,精简的配置,写时复制式克隆以及全内存是缓存。
Ceph RBD支持的最大镜像为16EB。这些镜像可以作为磁盘映射到物理机裸机、虚拟机或者其他主机用。
Ceph 文件系统:CephFS
Ceph文件系统也就是 CephFS ,利用 Ceph 存储集群来保存用户数据。Linux 内核驱动程序支持 CephFS ,这也使得 CephFS 高度适用于各大 Linux 操作系统发行版。CephFS 将数据和元数据分开存储,为上层的应用程序提供较高的性能以及可靠性。
在 Ceph 集群内部,Ceph文件系统库(libcephfs)运行在 RADOS 库(librados)之上,后者是 Ceph 存储集群协议,由文件、块和对象存储共用。要使用 CephFS ,集群节点上最少要配置一个 Ceph 元数据服务器(MDS),客户端可以采用多种方式使用CephFS。
如果要把 Ceph 挂在成文件系统,客户端可以使用本地 Linux 内核的功能或者使用 Ceph 社区提供的ceph-fuse驱动。除此之外,客户端可以使用第三方开源程序,例如 NFS 的 ganesha 和 SMB/CIFS 的 Samba。这些程序通过libcephfs 将用户数据存入可靠的分布式Ceph存储集群。CephFS 可以用来替代 HDFS 。也是通过libcephfs组件将数据存入Ceph集群。
Ceph 对象存储:RGW
Ceph 是一个分布式对象存储系统,通过它的对象网关(object gateway),即 RADOS 网关(radosgw)提供对象存储接口。RADOS网关利用 librgw 库和 librados 这些库,允许应用程序跟 Ceph 对象存储建立连接。Ceph 通过 Restful AP I让用户的应用程序将数据存储到Ceph集群中。RADOS网关接口满足以下特点:
- 兼容Swift:为 OpenStack Swift API 提供的对象存储功能;
- 兼容S3:为 Amazon S3 API 提供的对象存储功能;
- Admin API:这也称为管理API或者原生API,应用程序可以直接使用它来获取访问存储系统的权限以管理存储系统。
为什么要有RBD、CephFs以及RGW
为什么Ceph的块设备接口不具有共享性,而Ceph的文件系统接口具有呢?
- 对于Ceph的块设备接口,文件系统的结构状态是维护在各用户机内存中的,假设Ceph块设备同时挂载到了用户机1和用户机2,当在用户机1上的文件系统中写入数据后,更新了用户机1的内存中文件系统状态,最终数据存储到了Ceph集群中,但是此时用户机2内存中的文件系统并不能得知底层Ceph集群数据已经变化而维持数据结构不变,因此用户无法从用户机2上读取用户机1上新写入的数据。
- 对于Ceph的文件系统接口,文件系统的结构状态是维护在远端Ceph集群中的,并且是集群层面的。Ceph文件系统同时挂载到了用户机1和用户机2,当往用户机1的挂载点写入数据后,远端Ceph集群中的文件系统状态结构随之更新,当从用户机2的挂载点访问数据时会去远端Ceph集群取数据,由于远端Ceph集群已更新,所以用户机2能够获取最新的数据。
Ceph有了块设备接口,在块设备上完全可以构建一个文件系统,那么Ceph为什么还需要文件系统接口呢?
- 主要是因为应用场景的不同,Ceph的块设备具有优异的读写性能,但不能多处挂载同时读写,目前主要用在OpenStack上作为虚拟磁盘,而Ceph的文件系统接口读写性能较块设备接口差,但具有优异的共享性。
- Ceph的文件系统接口弥补了Ceph的块设备接口在共享性方面的不足,Ceph的文件系统接口符合POSIX标准,用户可以像使用本地存储目录一样使用Ceph的文件系统的挂载目录。简单来说,即无需修改你的程序,就可以将程序的底层存储换成空间无限并可多处共享读写的Ceph集群文件系统。
RGW的由来?
综上,Ceph的块设备存储具有优异的存储性能但不具有共享性,而Ceph的文件系统具有共享性然而性能较块设备存储差。那么,为什么不权衡一下存储性能和共享性,整个具有共享性而存储性能好于文件系统存储的存储呢,因此对象存储就这样出现了。Ceph的对象存储接口即RGW(RADOS GATEWAY),RGW不能像文件系统的磁盘那样被操作系统直接访问,相反,它只能通过 HTTP 协议上传/下载/删除对象(文件即对象),即只能使用 API 在应用层面被访问,并且该API 接口与 RESTful S3 、Swift 兼容。
体验 Ceph 集群
有了可运行的 Ceph 集群后,我们可以用一些简单的命令来体验Ceph:
| Ceph命令 | 说明 |
|---|---|
| ceph -s 或 ceph status | 检查 Ceph 的安装状态 |
| ceph quorum_status | json_pp | 检查 Ceph monitor 仲裁状态(如:ceph mon发生了几次选举) |
| ceph mon dump | 导出 Ceph monitor 的信息 |
| ceph df | 检查集群的使用状态 |
| ceph mon stat | 检查 Ceph monitor 状态 |
| ceph osd stat | 检查 Ceph osd 状态 |
| ceph pg stat | 检查 Ceph pg(配置组)状态 |
| ceph pg dump | 列表 PG(pg的数量通常都比较庞大,可以使用 ceph pg dump | less 命令查看) |
| ceph osd lspools | 列表 Ceph存储池 |
| ceph osd tree | 检查 OSD 的 CRUSH map(描述了存储的拓扑结构) |