Ceph 存储由几个不同的守护进程组成,这些守护进程彼此之间是相互独立的,每一个组件提供特定的功能。
RADOS(Reliable Autonomic Distributed Object Store 可靠、自动,分布式对象存储) 是ceph存储组件的基础。ceph 将一切都以对象的方式存储,RADOS就负责存储这些对象,而不考虑他们的数据类型。RADOS层组件确保数据的一致性,和可靠性。包括数据的复制,故障检测和恢复,数据在节点之间的迁移和再平衡。RADOS由大量的存储设备和节点集群组成。RADOS采用C++开发。
RDB(Reliable Block Device) 提供了一个标准的块设备接口,对外提供块存储,它可以被映射,格式化,像其他磁盘一样挂载到服务器。常用于虚拟化场景下创建volume,云硬盘等。目前red Hat已经将RBD的驱动集成到KVM/QEMU中。
RADOS是ceph 存储系统的核心,也称为ceph存储集群。ceph的所有优秀的特性都是由RADOS提供的,包括分布式对象存储,高可用性,自我修复和自我管理等。
RADOS 组件架构图:
RADOS 包含两个核心组件:Ceph Monitor 和Ceph OSD。
Ceph Monitor 是负责监视整个集群的运行状态的, 为了实现高可用性,通常配置为一个小型的集群(一般是3个节点,集群通常是有一个leader和两个slave,当leader故障后集群通过选举产生新的leader,来保障系统的高可用性。)。
Monitor中的信息都是集群成员中的守护程序来提供的,包含了各个节点之间的状态,集群的配置信息。主要用于管理Cluster Map,Cluster Map是整个RADOS系统的关键数据结构,类似元数据信息。Mon中的Cluster Map 包含 Mon Map、OSD Map、PG Map、MDS Map和CRUSH等。
ceph mon dump
ceph osd dump
ceph pg dump
ceph osd crush dump
Ceph Monitor集群维护着各类Map数据,它本身并不提供客户端数据的存储服务,客户端和其他集群节点会定期的检查并更新Monintor维护的Map,在客户端进行读写数据时,都会请求Monitor提供Map数据,之后直接与OSD进行数据操作。
Ceph Monitor是一个轻量级的守护进程,通常情况下不需要消耗大量资源,通常会需要几个GB的磁盘空间来存放日志。
OSD是Ceph 存储的重要组件。OSD将数据以对象的方式存储到集群中各个节点的磁盘上,完成数据存储的绝大部分工作是由OSD 守护进程来实现的。
Ceph 集群中通常包含有多个OSD,对于任何读写操作,客户端从Ceph Monitor获取Cluster Map之后,客户端将直接与OSD进行I/O操作,而不再需要Monitor干预。这使得数据读写过程更加迅速,不需要其他额外层级的数据处理来增加开销。
OSD通常有多个相同的副本,每个数据对象都有一个主副本和若干个从副本,这些副本默认情况下分布在不同的节点上,当主副本出现故障时(磁盘故障或者节点故障),Ceph OSD Deamon 会选取一个从副本提升为主副本,同时,会产生以一个新的副本,这样就保证了数据的可靠性。
Ceph OSD 操作必须 在一个有效的Linux 分区上,文件系统可以是BTRFS,XFS或EXT4,推荐选择XFS。
journal 缓冲区
Ceph 在写入数据时,会先将数据写入一个单独的换成存储区域,再写到备用存储。该缓冲区域被称为journal,这个缓冲区可以在相同或单独磁盘作为OSD,或者不同的SSD磁盘上。默认情况下每隔5秒日志会向备用存储刷新数据,常见的日志大小是10G,但是分区越大越好。
当为journal提供一个高速缓存的SSD磁盘时,会显著提高CEPH 写入数据的性能。每个SSD磁盘最多给4个到5个OSD做日志,一旦超过这个限制将会出现性能瓶颈。
CRUSH算法是Ceph 读写文件的核心,下图展示了使用CRUSH算法实现的数据读写和再平衡的流程:
Pool是一个逻辑分区,包含了多个PG,同时,每一个Pool都是交叉分布在多个主机节点上的。
存储池(POOL)是管理PG的逻辑分区,pool可以通过创建需要的副本数来保障数据的高可用性,在新的版本中,默认的副本数是3.
除此之外,我们可以还可以同使用SSD硬盘来创建faster池,使用pool来进行快照功能,还可以为访问pool的用户分配权限。
ceph osd pool create {pool-name} {pg-number} {pgp-number} [replicated] [crush-ruleset-name] [expected-num-objects]
ceph osd pool create test-pool 9 # 创建一个名为test-pool的池,包含的gp数量为9
ceph osd lspools
rados lspools
ceph osd dump | grep -i pool # 查看副本以及详细信息
ceph osd pool set test-pool size 3 # 设置副本数目为3
ceph osd dump | grep -i pool # 查看副本数目详情
ceph osd pool rename test-pool pool-1 # 当前名称 目标名称
ceph osd lspools # 查看命名已经修改
rados -p pool-1 put obj-1 /etc/hosts # 像池中添加对象obj-1和 文件 /etc/hosts
rados -p pool-1 ls # 查看池中的对象
# 给pool-1 池创建快照,命名为snapshot01
rados mksnap snapshot01 -p pool-1
# 插卡快照信息
rados lssnap -p pool-1
# 删除pool-1存储池中obj-test对象
rados -p pool-1 rm obj-test
# 查看对象的快照信息
# rados -p pool-1 listsnaps obj-test
obj-test:
cloneid snaps size overlap
1 1 5 []
# 恢复快照,指定存储池,对象名称,快照名
rados rollback -p pool-1 obj-test snapshot01
ceph osd pool get pool-1 size
ceph osd pool get pool-1 {value}
ceph osd pool set pool-1 size 3
ceph osd pool delete pool-1 pool-1 --yes-i-really-really-mean-it
这里通过示例,展示ceph 管理数据的方式。
创建一个存储池pool-1:
ceph osd pool create pool-1 8 8 # 创建存储池 pool-1,指定pg 和pgp的数量为 8
查看pool的ID:
[root@local-node-1 ~]# ceph osd lspools
1 .rgw.root
2 default.rgw.control
3 default.rgw.meta
4 default.rgw.log
8 pool-1
查看pg分配所属的OSD:
[root@local-node-1 ~]# ceph pg dump|grep ^8|awk '{print $1 "\t" $17}'
dumped all
8.7 [0,2,1]
8.6 [2,1,0]
8.5 [2,1,0]
8.4 [1,2,0]
8.3 [2,0,1]
8.2 [2,0,1]
8.1 [0,2,1]
8.0 [0,1,2]
表明 0-7的pg都存为了3副本,分到不同的副本中。
我们将hosts文件加入存储(这里已经添加pool):
[root@local-node-1 ~]# rados -p pool-1 put obj1 /etc/hosts
[root@local-node-1 ~]# rados -p pool-1 ls
obj1
查看对象obj1和OSD的映射关系:
[root@local-node-1 ~]# ceph osd map pool-1 obj1
osdmap e72 pool 'pool-1' (8) object 'obj1' -> pg 8.6cf8deff (8.7) -> up ([0,2,1], p0) acting ([0,2,1], p0)
上述输出的含义:
默认情况下,存放相同PG的副本会分布在不同的物理节点上。
默认设置下,当集群中有节点出现故障时,Ceph 会将故障节点的OSD标记为down,如果在300s内未恢复,集群就开始进行恢复状态。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。