Ceph
ceph简介
Ceph 是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph 项目最早起源于Sage 就读博士期间的工作(最早的成果于2004 年发表),并随后贡献给开源社区。 在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用
常用操作
1、ceph组件说明
OSDs:对象存储守护进程,负责数据存储、复制、恢复、平衡数据,并通过检查其他osd进程获取心跳,为ceph-mon提供信息
MONITOR:维护集群状态的映射,包括mon映射,manager映射,OSD映射和CRUSH映射。负责管理osd和客户端之间的身份验证
MDSs:Ceph文件系统存储元数据,Ceph的元数据服务器允许POSIX文件系统的用户来执行基本的命令(例如ls,find)占用资源比较少
MGR:负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager还依靠python的模块来管理和发布Ceph集群信息,例如通过Ceph Dashboard和 REST API
RGWs:Ceph对象存储网关,它是一个用于与Ceph存储集群交互的HTTP服务器。由于它提供了与OpenStack Swift和Amazon S3兼容的接口,因此Ceph对象网关具有自己的用户管理。Ceph对象网关可以将数据存储在用于存储来自Ceph文件系统客户端或Ceph块设备客户端的数据的相同Ceph存储集群中。
2、ceph集群状态查看
ceph -s
输出如下
ceph -s
cluster:
id: 99138b56-113d-4347-8857-7bbb92ced5d1
health: HEALTH_OK
# 集群信息:集群uuid与状态
services:
mon: 1 daemons, quorum s3-172-130-17-169
# mon: 个数 主机
mgr: s3-172-130-17-169(active)
# mgr: 主机
osd: 6 osds: 6 up, 6 in
# osd: 节点总数 up数 in数
rgw: 1 daemon active
# rgw: 服务个数
# 已安装的服务信息
data:
pools: 16 pools, 12032 pgs
# pool总数 pg总数
objects: 3.11M objects, 86.4GiB
# 对象总数 对象占用空间
usage: 213GiB used, 1.40TiB / 1.61TiB avail
# 数据使用量 可用量/总量
pgs: 12032 active+clean
# pg状态
# 数据信息
3、查看集群使用情况
ceph df
输出如下
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
1.61TiB 1.40TiB 213GiB 12.97
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
.rgw.root 1 3.40KiB 0 673GiB 16
china.rgw.buckets.data 2 86.4GiB 11.38 673GiB 3113441
china.rgw.buckets.extra 3 0B 0 673GiB 0
china.rgw.buckets.index 4 0B 0 673GiB 115
china.rgw.buckets.non-ec 5 0B 0 673GiB 0
china.rgw.control 6 0B 0 673GiB 8
china.rgw.data.root 7 0B 0 673GiB 0
china.rgw.gc 8 0B 0 673GiB 0
china.rgw.intent-log 9 0B 0 673GiB 0
china.rgw.log 10 149B 0 673GiB 1204
china.rgw.meta 11 2.70KiB 0 673GiB 14
china.rgw.usage 12 0B 0 673GiB 0
china.rgw.users.email 13 0B 0 673GiB 0
china.rgw.users.keys 14 0B 0 673GiB 0
china.rgw.users.swift 15 0B 0 673GiB 0
china.rgw.users.uid 16 0B 0 673GiB 0
输出的 GLOBAL 段展示了数据所占用集群存储空间的概要。
- SIZE: 集群的总容量。
- AVAIL: 集群的可用空间总量。
- RAW USED:已用存储空间总量。
- % RAW USED:已用存储空间比率。用此值对比 full ratio 和 near full ratio 来确保不会用尽集群空间。
输出的 POOLS 段展示了存储池列表及各存储池的大致使用率。本段没有反映出副本、克隆和快照的占用情况。例如,如果你把 1MB 的数据存储为对象,理论使用率将是 1MB ,但考虑到副本
数、克隆数、和快照数,实际使用量可能是 2MB 或更多
4、查看osd状态
osd crush map查看到
ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-3 0 root SSD
-2 0 root HDD
-1 5.17859 root default
-19 0 host ceph
-22 0 host ceph20
-9 1.72620 host openstack-con01
2 ssd 1.72620 osd.2 up 1.00000 1.00000
-11 1.72620 host openstack-con02
1 ssd 1.72620 osd.1 up 1.00000 1.00000
-7 1.72620 host openstack-con03
0 ssd 1.72620 osd.0 up 1.00000 1.00000
Ceph 会打印 CRUSH 树,包括 host 的名称、它上面的 OSD 例程、状态及权重
ceph osd dump
epoch 2266
# OSD Crush MAP版本
fsid 9f32ba0e-e05a-4c88-9bcc-d4321a159f93
created 2022-02-20 14:27:17.115359
modified 2022-05-19 09:36:01.378662
flags sortbitwise,recovery_deletes,purged_snapdirs
# 集群FLAGS
crush_version 16
full_ratio 0.95
# 当OSD数据使用率达到95%,ceph会将OSD标记为full
backfillfull_ratio 0.9
# 当OSD数据使用率达到90%,集群会将该OSD的数据backfill到其他OSD
nearfull_ratio 0.85
# 当OSD数据使用率达到85%,ceph会将OSD标记为nearfull
require_min_compat_client jewel
min_compat_client jewel
# 客户端兼容最低版本
require_osd_release luminous
# osd版本
pool 7 'images' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 last_change 42 flags hashpspool stripe_width 0 application rbd
pool 8 'volumes' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 8192 pgp_num 8192 last_change 2266 flags hashpspool stripe_width 0 application rbd
removed_snaps [1~3f,41~1b,5e~9,68~6,6f~16,86~1,88~1,8a~1,8e~c,9c~4,a2~4,a7~1,a9~10]
pool 9 'vms' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 1024 pgp_num 1024 last_change 340 flags hashpspool stripe_width 0 application rbd
removed_snaps [1~3]
pool 10 'portrait' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 299 flags hashpspool stripe_width 0 application rbd
removed_snaps [1~3]
pool 11 'backups' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 last_change 50 flags hashpspool stripe_width 0 application rbd
pool 12 'tstack_k8s' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 1024 pgp_num 1024 last_change 67 flags hashpspool stripe_width 0 application rbd
removed_snaps [1~3]
pool 13 'lbackup' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 1024 pgp_num 1024 last_change 56 flags hashpspool stripe_width 0
pool 14 'k8s' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 511 flags hashpspool stripe_width 0 application rbd
removed_snaps [1~3]
pool 129 '.rgw.root' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 875 flags hashpspool stripe_width 0 application rgw
pool 130 'default.rgw.control' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 878 flags hashpspool stripe_width 0 application rgw
pool 131 'default.rgw.meta' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 880 flags hashpspool stripe_width 0 application rgw
pool 132 'default.rgw.log' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 882 flags hashpspool stripe_width 0 application rgw
pool 133 'tstack-zone.rgw.control' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 887 flags hashpspool stripe_width 0 application rgw
pool 134 'tstack-zone.rgw.meta' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 889 flags hashpspool stripe_width 0 application rgw
pool 135 'tstack-zone.rgw.log' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 891 flags hashpspool stripe_width 0 application rgw
pool 136 'tstack-zone.rgw.buckets.index' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 256 pgp_num 256 last_change 2247 owner 18446744073709551615 flags hashpspool stripe_width 0 application rgw
max_osd 5
# 分别为poolid,poolname,副本数,最小可读写副本数,crush_rule id....
osd.0 up in weight 1 up_from 1707 up_thru 2246 down_at 1688 last_clean_interval [1484,1688) 192.168.10.13:6800/128305 10.10.10.3:6800/128305 10.10.10.3:6801/128305 192.168.10.13:6801/128305 exists,up 372f5341-5d2c-4b00-8604-868a58cff3c0
osd.1 up in weight 1 up_from 1702 up_thru 2246 down_at 1662 last_clean_interval [1432,1663) 192.168.10.12:6800/518674 10.10.10.2:6800/518674 10.10.10.2:6801/518674 192.168.10.12:6801/518674 exists,up 568514bc-e9e0-497d-83d4-8315fd70f020
osd.2 up in weight 1 up_from 1694 up_thru 2246 down_at 1693 last_clean_interval [1667,1693) 192.168.10.11:6800/2087766 10.10.10.1:6800/4087766 10.10.10.1:6801/4087766 192.168.10.11:6801/4087766 exists,up 993b40a8-ccdd-4ada-ba01-41256299d9e7
5、集群服务启停命令
systemctl status/start/stop/restart ceph
列出所有节点上的所有的ceph服务
systemctl status ceph\*.service ceph\*.target
6、手动删除osd
想要缩减集群大小或者替换硬件,可在运行时删除osd,在ceph中,一个osd通常是一台主机上的一个ceph-osd守护进程,它运行在一个硬盘之上,如果一台主机有多个数据盘,需要逐一删除对应的ceph-osd,通常,操作前注意观察集群的状态
警告:删除osd时不要让集群达到full ratio值,删除osd可能导致集群超过full ratio值
- 停止需要剔除的osd进程,让其他的osd知道这个osd不提供服务,停止osd后,状态变为down
-
ssh {osd-host}
systemctl stop ceph-osd@{osd-num}
-
-
将 OSD 标记为 out 状态,这个一步是告诉 mon,这个 OSD 已经不能服务了,需要在其他的OSD上进行数据的均衡和恢复,注意,执行完这一步后需要等集群恢复到HEALTH_OK状态,在进行下一步操作
-
ceph osd out {osd-num}
-
- 删除 CRUSH Map 中的对应 OSD 条目,它就不再接收数据了,该步骤会触发数据的重新分布,等待数据重新分布结束,整个集群会恢复到HEALTH_OK状态。
- ceph osd crush remove {name}
- 删除 OSD 认证密钥
- ceph auth del osd.{osd-num}
- 删除OSD
- ceph osd rm {osd-num}
- # for example
- ceph osd rm 1
- 卸载OSD的挂载点
- umount /var/lib/ceph/osd/ceph-{osd-num}
- 从osd crush map删除主机
- ceph osd crush remove ${HOSTNAME}
7、操作Pool
列出集群存储池
ceph osd lspools
列出资源池的详细信息
ceph osd pool ls detail
查询资源池副本数、默认是3副本
ceph osd pool get <POOL_NAME> size
修改资源池副本数为2副本
ceph osd pool set <POOL_NAME> size 2
8、更换OSD数据盘
场景:当ceph集群中有个OSD盘换了需要换盘,换盘之后该盘上没有挂载osd,需要将新盘加入集群
影响:增加或删除OSD会引起数据重新均衡,在均衡过程中会占用磁盘大量IO,如果集群比较大,磁盘性能 比较差时,数据均衡可能会影响业务,建议在业务低峰期操作
实施过程:
- 设置运维标志位
- ceph osd set noout
- 记录原来的OSD的DATA与JOURNAL对应关系
-
- ssh登录到需要替换OSD的服务器
-
- 通过OSD找到 JOURNAL 与 DATA 的对应关系
-
ls -l /var/lib/ceph/osd/ceph-${OSDID}/journal # 输出如下,journal为后面分区的软连接 /var/lib/ceph/osd/ceph-2/journal -> /dev/disk/by-partuuid/5062e503-dcef-4061-b35d-96be1 816b8aa # 找到软链接的分区对应的盘符 ls -l /dev/disk/by-partuuid/5062e503-dcef-4061-b35d-96be1816b8aa # 输出如下 则表示 sdf2为OSD2的journal磁盘 /dev/disk/by-partuuid/5062e503-dcef-4061-b35d-96be1816b8aa -> ../../sdf2
- 删除原来OSD(需要osd处于down的状态,未处于down,可手动停止osd服务)
- systemctl stop ceph-osd@${OSDID}
- ceph osd out $OSDID
- ceph auth del osd.$OSDID
- ceph osd crush rm osd.$OSDID
- ceph osd rm osd.$OSDID
- 将新盘加入ceph集群
-
ssh远程登录该节点
-
新建日志分区,大小为25G(或者使用原来的,建议使用原来的)例如:
-
# 例如日志盘为 /dev/nvme0n1
parted -s /dev/nvme0n1 mkpart primary 100G 125G - 进行osd部署
-
# 例如该OSD的日志分区为 /dev/nvme0n1p1
# 如使用原来的此处则为前面记录的盘符
JOURNAL=/dev/nvme0n1p1
# 例如该OSD的DATA磁盘为 /dev/sdh
OSD=/dev/sdh
# 例如该OSD节点的主机名为 ceph-osd01
HOSTNAME=ceph-osd01
# 将该OSD相关的磁盘、分区的属主属组修改为 ceph:ceph
chown -R ceph:ceph $JOURNAL
chown -R ceph:ceph $OSD
# 部署
# 需注意,Ceph版本为L(luminous)版或N(Nautilus)版则prepare时需要加 --filestore 参数
# 例如 ceph-disk prepare $OSD $JOURNAL --filestore
ceph-disk prepare $OSD $JOURNAL
ceph-disk activate $OSD1 - 修改 OSD 启动文件中的属主属组,OSD在服务器重启后即使磁盘权限被还原也能自启动也不会因为权限问题而无法启动
-

浙公网安备 33010602011771号