RBD(RADOS Block Devices)即为块存储的一种,RBD通过librbd库与OSD进行交互,RBD为KVM等虚拟技术和云服务(如Openstack和CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU使用程序与RBD进行集成,客户端基于librbd库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先启用rbd功能并进行初始化.
创建存储池,pg和pgp数量通常保持一致
## 创建pool
$ ceph osd pool create myrbd1 64 64
pool 'myrbd1' created
## 对pool启用RBD
$ ceph osd pool application enable myrbd1 rbd
enabled application 'rbd' on pool 'myrbd1'
## 初始化myrbd1 pool
$ rbd pool init -p myrbd1
rbd存储池并不能直接用于块存储,而是需要实现再其中按需创建映像(image),并把映像文件作为块设备使用,rbd命令可以用于创建,查看及删除块设备所在的映像,以及克隆映像,创建快照,将映像回滚到快照和查看快照等管理操作.
$ rbd create myimag1 --size 2G --pool myrbd1
## 由于centos7只支持layering,所以创建一个给centos7用的myimage2
$ rbd create myimag2 --size 2G --pool myrbd1 --image-feature layering
$ rbd --image myimag1 --pool myrbd1 info
rbd image 'myimag1':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 3739b001adf1
block_name_prefix: rbd_data.3739b001adf1
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Thu Sep 15 13:33:56 2022
access_timestamp: Thu Sep 15 13:33:56 2022
modify_timestamp: Thu Sep 15 13:33:56 2022
$ rbd --image myimag2 --pool myrbd1 info
rbd image 'myimag2':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 133b3586a124
block_name_prefix: rbd_data.133b3586a124
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu Sep 15 14:25:04 2022
access_timestamp: Thu Sep 15 14:25:04 2022
modify_timestamp: Thu Sep 15 14:25:04 2022
$ rbd ls --pool myrbd1
myimag1
myimag2
$ ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 12 GiB 12 GiB 84 MiB 84 MiB 0.68
TOTAL 12 GiB 12 GiB 84 MiB 84 MiB 0.68
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
device_health_metrics 1 1 0 B 1 0 B 0 3.8 GiB
mypool 2 32 0 B 0 0 B 0 3.8 GiB
myrbd1 3 64 213 B 7 48 KiB 0 3.8 GiB
centos7客户端上
## 安装centos7 源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
## 安装epel源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
## 安装ceph15.2.17源
yum install -y https://mirrors.aliyun.com/ceph/rpm-15.2.17/el7/noarch/ceph-release-1-1.el7.noarch.rpm
## 安装ceph-common
yum install ceph-common -y
ceph-deploy服务器,将ceph.conf ceph.client.admin.keyring复制给客户端
scp ceph.conf ceph.client.admin.keyring root@192.168.31.17:/etc/ceph/
centos7先确认是否可以连到ceph
[root@centos7-1 ~]# ceph -s
cluster:
id: 86c42734-37fc-4091-b543-be6ff23e5134
health: HEALTH_WARN
client is using insecure global_id reclaim
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 76m)
mgr: ceph-mgr01(active, since 2h), standbys: ceph-mgr02
osd: 14 osds: 12 up (since 116m), 12 in (since 116m)
data:
pools: 3 pools, 97 pgs
objects: 6 objects, 197 B
usage: 84 MiB used, 12 GiB / 12 GiB avail
pgs: 97 active+clean
挂载RBD
[root@centos7-1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 9.5G 0 rom
## 由于centos7不支持除layering的其他几种格式,所以这里就失败了.
[root@centos7-1 ~]# rbd -p myrbd1 map myimag1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd1/myimag1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
[root@centos7-1 ~]# rbd -p myrbd1 map myimag2
/dev/rbd0
[root@centos7-1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 9.5G 0 rom
## 这个就是映射过来的rbd
rbd0 252:0 0 2G 0 disk
格式化并挂载
[root@centos7-1 ~]# mkfs.xfs /dev/rbd0
Discarding blocks...Done.
meta-data=/dev/rbd0 isize=512 agcount=8, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@centos7-1 ~]# mkdir /data
[root@centos7-1 ~]# mount /dev/rbd0 /data
[root@centos7-1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 979M 0 979M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 9.5M 981M 1% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 13% /
/dev/sda1 xfs 1014M 138M 877M 14% /boot
tmpfs tmpfs 199M 0 199M 0% /run/user/0
/dev/rbd0 xfs 2.0G 33M 2.0G 2% /data
[root@centos7-1 ~]# cp /var/log/messages /data/
[root@centos7-1 ~]# ls /data/
messages
RGW提供REST接口,用户通过http与其进行交互,完成数据的增删改查等管理操作.
radosgw用在需要使用RESTful API接口访问ceph数据的场合,因此在使用RBD(块存储)的场合或者使用cephfs的场合可以不用启用radosgw功能.
在mgr节点安装radosgw
# apt install -y radosgw
ceph-deploy节点执行,将mgr01节点创建成radosgw节点
radosgw默认监听7480
$ ceph-deploy --overwrite-conf rgw create ceph-mgr01
$ cephadmin@ceph-mgr01:~/ceph-cluster$ sudo ps -ef |grep radosgw
ceph 10823 1 0 14:46 ? 00:00:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.ceph-mgr01 --setuser ceph --setgroup ceph
cephadm+ 11546 10691 0 14:48 pts/0 00:00:00 grep --color=auto radosgw
$ ss -ntl|grep 7480
LISTEN 0 128 0.0.0.0:7480 0.0.0.0:*
LISTEN 0 128 [::]:7480 [::]:*
cephadmin@ceph-mgr01:~/ceph-cluster$ ceph -s
cluster:
id: 86c42734-37fc-4091-b543-be6ff23e5134
health: HEALTH_WARN
client is using insecure global_id reclaim
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 112m)
mgr: ceph-mgr01(active, since 2h), standbys: ceph-mgr02
osd: 14 osds: 12 up (since 2h), 12 in (since 2h)
## 这里看到rgw已经有一个启动了
rgw: 1 daemon active (1 hosts, 1 zones)
data:
pools: 7 pools, 201 pgs
objects: 209 objects, 14 MiB
usage: 183 MiB used, 12 GiB / 12 GiB avail
pgs: 201 active+clean
ceph-fs即ceph filesystem,可以实现文件系统共享功能,客户端通过ceph协议挂载并使用ceph集群作为数据存储服务器.
ceph FS需要运行Meta Data Services(MDS)服务,其守护进程为ceph-mds,ceph-mds进程管理与cephFS上存储的文件相关的元数据,并协调对ceph存储集群的访问.
在安装节点执行
sudo apt install -y ceph-mds
在ceph-deploy部署节点执行
$ ceph-deploy mds create ceph-mgr01
$ ps -ef |grep ceph-mds
ceph 12010 1 0 15:04 ? 00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id ceph-mgr01 --setuser ceph --setgroup ceph
cephadm+ 12121 10691 0 15:06 pts/0 00:00:00 grep --color=auto ceph-mds
$ ceph mds stat
1 up:standby
$ ceph osd pool create cephfs-metadata 32 32
pool 'cephfs-metadata' created
$ ceph osd pool create cephfs-data 64 64
pool 'cephfs-data' created
$ ceph fs new mycephfs cephfs-metadata cephfs-data
new fs with metadata pool 8 and data pool 9
$ ceph fs ls
name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
$ ceph fs status mycephfs
mycephfs - 0 clients
========
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active ceph-mgr01 Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs-metadata metadata 96.0k 5006M
cephfs-data data 0 5006M
MDS version: ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable)
$ ceph mds stat
mycephfs:1 {0=ceph-mgr01=up:active}
centos7挂载
再获取到secret,将key内容复制出来
$ cat ceph.client.admin.keyring
[client.admin]
key = AQAAxiFjNoK5FRAAy8DUqFsOoCd2H0m9Q1SuIQ==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
在客户端上执行命令
## 192.168.31.81是mon服务器地址
# mount -t ceph 192.168.31.81:6789:/ /data2 -o name=admin,secret=AQAAxiFjNoK5FRAAy8DUqFsOoCd2H0m9Q1SuIQ==
[root@centos7-1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 979M 0 979M 0% /dev
tmpfs tmpfs 991M 0 991M 0% /dev/shm
tmpfs tmpfs 991M 9.5M 981M 1% /run
tmpfs tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 13% /
/dev/sda1 xfs 1014M 138M 877M 14% /boot
/dev/rbd0 xfs 2.0G 33M 2.0G 2% /data
tmpfs tmpfs 199M 0 199M 0% /run/user/0
192.168.31.81:6789:/ ceph 4.9G 0 4.9G 0% /data2
[root@centos7-1 ~]# echo "123">/data2/messages
[root@centos7-1 ~]# tail /data2/messages
123
在另一台ubuntu服务器上挂载
root@logstash:/data# mount -t ceph 192.168.31.81:6789:/ /data/u01/ -o name=admin,secret=AQAAxiFjNoK5FRAAy8DUqFsOoCd2H0m9Q1SuIQ==
root@logstash:/data# df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 932M 0 932M 0% /dev
tmpfs tmpfs 196M 1.3M 195M 1% /run
/dev/sda2 xfs 120G 10G 111G 9% /
tmpfs tmpfs 977M 0 977M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 977M 0 977M 0% /sys/fs/cgroup
/dev/loop1 squashfs 56M 56M 0 100% /snap/core18/2538
/dev/loop2 squashfs 71M 71M 0 100% /snap/lxd/21029
/dev/loop4 squashfs 62M 62M 0 100% /snap/core20/1611
/dev/loop3 squashfs 68M 68M 0 100% /snap/lxd/22753
/dev/loop5 squashfs 47M 47M 0 100% /snap/snapd/16292
tmpfs tmpfs 196M 0 196M 0% /run/user/0
/dev/loop6 squashfs 56M 56M 0 100% /snap/core18/2560
192.168.31.81:6789:/ ceph 4.9G 0 4.9G 0% /data/u01
root@logstash:/data# cat /data/u01/messages
123
| 命令 | 作用 |
|---|---|
| ceph osd pool ls | 获取存储池清单 |
| ceph osd lspools | 获取存储池清单,但清单前多一个数字 |
| ceph pg stat | 查看pg状态 |
| ceph osd pool stats mypool | 查看指定pool或所有pool状态 |
| ceph df | 查看集群状态 |
| ceph df detail | 显示集群详细信息 |
| ceph osd dump | 显示osd底层详细信息 |
| ceph osd tree | 显示osd和节点的对应关系 |
| ceph mon stat | 查看mon的状态 |
| ceph mon dump | 显示mon更详细的状态 |
## 关闭前
$ ceph osd set noout
## 启动后
$ ceph osd unset noout
添加仓库源
初始化安装基本环境
ceph-deploy install --release pacific ceph-nodex
擦除磁盘
ceph-deploy disk zap ceph-nodex /dev/sdx
添加osd
ceph-deploy osd create ceph-nodex --data /dev/sdx
把osd踢出集群
ceph osd out 1
等一段时间
停止osd.x进程
删除osd
ceph osd rm 1
当前主机的其他磁盘重复以上操作
OSD全部操作完后下线主机
副本池: replicated,定义每个对象在集群中保存为多少个副本,默认为三个副本,一主两备,实现高可用,副本池是ceph默认的存储池类型.
纠删码池(erasure code): 把各对象存储为N=K+M个块,其中K为数据块数量,M为编码块数量,因此存储池的尺寸为K+M.
即数据保存在K个数据库,并提供M个冗余提供数据高可用,那么最多能故障的块就是M个,实际的磁盘占用就是K+M块,因此相比副本池机制比较节省存储资源,一般采用8+4机制,即8个数据块+4个冗余块,那么也就是12个数据块有8个数据块保存数据,4个是用来做冗余的.即1/3的磁盘空间用作冗余,比默认的副本池更节省空间,但不能出现大于一定数据块的故障.
不是所有应用都支持纠删码池,RBD只支持副本池而radosgw则都支持.
默认创建是用副本池,如果需要创建纠删码池.
ceph osd pool create test-erasure-pool 16 16 erasure
默认K=2 M=2
将一个数据对象存储为多个副本
在客户端写入数据时,ceph使用CRUSH算法计算出与对象相应的PG ID和primary OSD根据设置的副本数,对象名称,存储池名称和集群运行图(cluster map)计算出PG的各辅助OSD,然后由OSD将数据再同步给辅助OSD
读数据:
写入数据:
副本池中读全部在主上完成,写先写主,然后向副本同步,同步完后和主确认,主收到所有副本确认后和client确认写完成.
Ceph从Firefly版开始支持纠删码,但是不推荐在生产环境使用纠删码池.
纠删码降低了数据保存所需磁盘总空间数量,但读写数据的计算成本要比副本池高,RGW可以支持纠删码,RBD不支持.
纠删码池可以降低前期TCO总拥有成本.
纠删码写:
数据将在主OSD进行编码然后分发到相应的OSDs上去.
PG = Placement Group # 归置组
PGP = Placement Group for Placement purpose # 归置组的组合,pgp相当于pg对应osd的一种排列组合关系.
归置组是用于跨越多个osd将数据存储在每个存储池中的内部数据结构.归置组在osd守护进程和ceph客户端之间生成了一个中间层,CRUSH算法负责将每个动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个OSD守护进程.从而能够支持在新的OSD设备上线时进行数据重新平衡.
相对存储池来说,PG是一个虚拟组件,它是对象映射到存储池时使用的虚拟层.
Total PG = (Total_number_of_OSD * 100) / max_replication_count
root@ceph-mgr01:~# ceph osd ls | wc -l
16
所以得出:
Total_number_of_OSD = 16
root@ceph-mgr01:~# ceph osd dump | grep repli|awk '{print $6}'|sort -n -u
3
所以Total PG = 1600 / 3 = 533
root@ceph-mgr01:~# ceph osd pool ls | wc -l
9
可以看到都是3所以
max_replication_count = 3
Total PGs = PG / pool_count
Total PGs = 533 / 9
取最近的2^N 那么就是64
如果我们pool数确定了,只是到10个
这时候创建pool,它的 Total PGs = 533 / 10 = 53 取最近2的N次幂也是64
那么创建时指定的pg和pgs就设置为64
如果ceph中pool的数不固定,就只要在初期约定一个pg值即可,pg值为2的N次幂.数据量大就使用64,128 ,256.数据量小就使用16或者32
最好的状态就是pgs: 233 active+clean,说明整个PG都是健康的
root@ceph-mgr01:~# ceph -s
cluster:
id: 86c42734-37fc-4091-b543-be6ff23e5134
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 113m)
mgr: ceph-mgr01(active, since 46h)
mds: 1/1 daemons up
osd: 16 osds: 16 up (since 112m), 16 in (since 43h)
rgw: 1 daemon active (1 hosts, 1 zones)
data:
volumes: 1/1 healthy
pools: 8 pools, 233 pgs
objects: 213 objects, 20 KiB
usage: 434 MiB used, 16 GiB / 16 GiB avail
pgs: 233 active+clean
正在同步状态,同一个PG中的OSD需要将准备数据同步一致,而Peering就是OSD同步过程中的状态.
Peering已经完成,PG正在等待所有PG实例同步Peering的结果(Inof,Log等)
干净态,PG不存在需要修复的对象,并且大小等于存储池的副本数.
就绪态或活跃态,Active表示主OSD和备OSD都处于正常工作状态.此时的PG可以正常处理客户端的读写请求,正常PG默认就是Active+Clean状态.
降级状态出现OSD标记为down以后,那么其他映射OSD的PG都会被转换到降级态.
如果OSD被修复,那么就会从Degraded转变为Peering再变为clean
如果down状态5分钟还没被修复,那么此OSD会被踢出集群,ceph会对被降级的PG启动恢复操作,直到被降级的PG重新恢复到clean状态.
恢复数据从PG内的主OSD恢复,如果是主OSD出现故障.那么就在剩余的OSD上做选举,选出新的主OSD
过期态,正常情况下,每个主osd都要周期性的向RADOS集群中的监视器mon报告作为主osd所持有的所有pg的最新统计数据,因任何原有导致某个osd无法正常向监视器发送汇报消息,或者由其他osd报告某个osd已经down的时候,则所有此osd为主pg则会立即被标记为stale状态,即他们的主osd已经不是最新数据了,如果备份osd发送down的时候,则ceph会执行修复而不会触发pg状态转换为stale状态.
PG当前副本数小于存储池定义的值,PG就会转变为undersized状态.
scrub是ceph对数据清洗状态,用来保持数据的完整性机制,ceph的osd定期启动scrub线程来扫描部分对象,通过与其他副本对比来发现是否一致,如果不一致则抛出异常提示用户手动解决.scrub以pg为单位,对每一个pg,ceph分析该pg下所有object,产生一个类似元数据信息摘要的数据结构.轻度扫描(light scrubs)和深度扫描(deep scrubs)深度扫描时状态会是scrubbing+deep
正在恢复数据或者正在迁移或者同步副本.可能是新加了一个osd节点到集群或某个osd宕机造成.
后台填充状态,backfilling是recovery的一种特殊场景,值peering完成后,当前权威日志无法对Up Set(上行集)当中的某些PG实例实时增量同步,则会通过完全拷贝当前Primary所有对象的方式进行全量同步,此过程中PG会处于backfilling.
某个需要被backfiill的pg实例,他所在osd可用空间不足,backfill流程当前挂起时PG的状态.通过删数据或者加磁盘解决.
通过ceph osd pool的子命令及参数实现,比如create/ls/rename/rm等
ceph osd pool create poolname pg pgp
root@ceph-mgr01:~# ceph osd pool create testpool1 32 32
pool 'testpool1' created
root@ceph-mgr01:~# ceph osd pool ls
device_health_metrics
mypool
.rgw.root
default.rgw.log
default.rgw.control
default.rgw.meta
cephfs-metadata
cephfs-data
testpool1
root@ceph-mgr01:~# ceph osd pool stats testpool1
pool testpool1 id 10
nothing is going on
root@ceph-mgr01:~# ceph osd pool rename testpool1 testpool
pool 'testpool1' renamed to 'testpool'
root@ceph-mgr01:~# ceph osd pool ls
device_health_metrics
mypool
.rgw.root
default.rgw.log
default.rgw.control
default.rgw.meta
cephfs-metadata
cephfs-data
testpool
root@ceph-mgr01:~# rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD WR_OPS WR USED COMPR UNDER COMPR
.rgw.root 48 KiB 4 0 12 0 0 0 4 4 KiB 4 4 KiB 0 B 0 B
cephfs-data 12 KiB 1 0 3 0 0 0 2 1 KiB 3 154 KiB 0 B 0 B
cephfs-metadata 132 KiB 22 0 66 0 0 0 0 0 B 74 42 KiB 0 B 0 B
default.rgw.control 0 B 8 0 24 0 0 0 0 0 B 0 0 B 0 B 0 B
default.rgw.log 408 KiB 177 0 531 0 0 0 22563 22 MiB 15007 34 KiB 0 B 0 B
default.rgw.meta 0 B 0 0 0 0 0 0 0 0 B 0 0 B 0 B 0 B
device_health_metrics 0 B 1 0 3 0 0 0 0 0 B 2 2 KiB 0 B 0 B
mypool 0 B 0 0 0 0 0 0 1 1 KiB 2 1 KiB 0 B 0 B
testpool 0 B 0 0 0 0 0 0 0 0 B 0 0 B 0 B 0 B
total_objects 213
total_used 435 MiB
total_avail 16 GiB
total_space 16 GiB
root@ceph-mgr01:~# ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA OMAP META AVAIL %USE VAR PGS STATUS
10 hdd 0.00099 1.00000 1020 MiB 37 MiB 4.5 MiB 0 B 32 MiB 983 MiB 3.58 1.34 41 up
11 hdd 0.00099 1.00000 1020 MiB 21 MiB 4.5 MiB 0 B 17 MiB 999 MiB 2.10 0.79 57 up
12 hdd 0.00099 1.00000 1020 MiB 37 MiB 4.5 MiB 0 B 32 MiB 983 MiB 3.60 1.35 52 up
13 hdd 0.00099 1.00000 1020 MiB 31 MiB 4.5 MiB 0 B 27 MiB 989 MiB 3.09 1.16 47 up
2 hdd 0.00099 1.00000 1020 MiB 5.0 MiB 4.5 MiB 0 B 24 MiB 1015 MiB 0.49 0.19 46 up
3 hdd 0.00099 1.00000 1020 MiB 32 MiB 4.5 MiB 0 B 28 MiB 988 MiB 3.18 1.19 45 up
4 hdd 0.00099 1.00000 1020 MiB 22 MiB 4.5 MiB 0 B 17 MiB 998 MiB 2.15 0.81 54 up
5 hdd 0.00099 1.00000 1020 MiB 26 MiB 4.5 MiB 0 B 22 MiB 994 MiB 2.60 0.97 51 up
6 hdd 0.00099 1.00000 1020 MiB 32 MiB 4.5 MiB 0 B 27 MiB 988 MiB 3.11 1.17 45 up
7 hdd 0.00099 1.00000 1020 MiB 27 MiB 4.5 MiB 0 B 23 MiB 993 MiB 2.68 1.00 52 up
8 hdd 0.00099 1.00000 1020 MiB 32 MiB 4.5 MiB 0 B 28 MiB 988 MiB 3.18 1.19 48 up
9 hdd 0.00099 1.00000 1020 MiB 33 MiB 4.5 MiB 0 B 28 MiB 987 MiB 3.20 1.20 49 up
14 hdd 0.00099 1.00000 1020 MiB 27 MiB 4.5 MiB 0 B 22 MiB 993 MiB 2.63 0.99 50 up
15 hdd 0.00099 1.00000 1020 MiB 26 MiB 4.5 MiB 0 B 22 MiB 994 MiB 2.57 0.96 50 up
16 hdd 0.00099 1.00000 1020 MiB 26 MiB 4.5 MiB 0 B 21 MiB 994 MiB 2.53 0.95 51 up
17 hdd 0.00099 1.00000 1020 MiB 20 MiB 4.5 MiB 0 B 16 MiB 1000 MiB 1.98 0.74 57 up
TOTAL 16 GiB 435 MiB 72 MiB 0 B 386 MiB 16 GiB 2.67
MIN/MAX VAR: 0.19/1.35 STDDEV: 0.74
需要删除myrbd1这个存储池
root@ceph-mgr01:~# ceph osd pool ls
device_health_metrics
mypool
myrbd1
.rgw.root
default.rgw.log
default.rgw.control
default.rgw.meta
cephfs-metadata
cephfs-data
默认禁止删除存储池,需要先设置成允许删除
root@ceph-mgr01:~# ceph tell mon.* injectargs --mon-allow-pool-delete=true
mon.ceph-mon01: {}
mon.ceph-mon01: mon_allow_pool_delete = 'true'
mon.ceph-mon02: {}
mon.ceph-mon02: mon_allow_pool_delete = 'true'
mon.ceph-mon03: {}
mon.ceph-mon03: mon_allow_pool_delete = 'true'
root@ceph-mgr01:~# ceph osd pool rm myrbd1 myrbd1 --yes-i-really-really-mean-it
pool 'myrbd1' removed
root@ceph-mgr01:~# ceph osd pool ls
device_health_metrics
mypool
.rgw.root
default.rgw.log
default.rgw.control
default.rgw.meta
cephfs-metadata
cephfs-data
再将允许删除改为禁止
root@ceph-mgr01:~# ceph tell mon.* injectargs --mon-allow-pool-delete=false
mon.ceph-mon01: {}
mon.ceph-mon01: mon_allow_pool_delete = 'false'
mon.ceph-mon02: {}
mon.ceph-mon02: mon_allow_pool_delete = 'false'
mon.ceph-mon03: {}
mon.ceph-mon03: mon_allow_pool_delete = 'false'
root@ceph-mgr01:~# ceph osd pool get-quota testpool
quotas for pool 'testpool':
max objects: N/A ## 默认不限制对象数量
max bytes : N/A ## 默认不限制空间大小
限制上传对象数最大1000个
root@ceph-mgr01:~# ceph osd pool set-quota testpool max_objects 1000
set-quota max_objects = 1000 for pool testpool
root@ceph-mgr01:~# ceph osd pool get-quota testpool
quotas for pool 'testpool':
max objects: 1k objects (current num objects: 0 objects)
max bytes : N/A
限制最多使用1G
root@ceph-mgr01:~# echo "1024*1024*1024"|bc
1073741824
root@ceph-mgr01:~# ceph osd pool set-quota testpool max_bytes 1073741824
set-quota max_bytes = 1073741824 for pool testpool
root@ceph-mgr01:~# ceph osd pool get-quota testpool
quotas for pool 'testpool':
max objects: 1k objects (current num objects: 0 objects)
max bytes : 1 GiB (current num bytes: 0 bytes)
查看的话就使用ceph osd pool get,如果要调整参数的话就ceph osd pool set
| 参数 | 含义 |
|---|---|
| ceph osd pool get testpool size | 存储池副本数 |
| ceph osd pool get testpool min_size | 提供服务最小副本数 |
| ceph osd pool get testpool pg_num | 查看pg数量 |
| ceph osd pool get testpool crush_rule | 查看crush算法规则,是副本池还是纠删码 |
| ceph osd pool get testpool nodelete | 控制是否可以删除,默认是可以 |
| ceph osd pool get testpool nopgchange | 是否可以更改存储池的pg_num和pgp_num |
| ceph osd pool set testpool pg_num 64 | 将pg数设置成64 |
| ceph osd pool get testpool nosizechange | 是否可以修改存储池大小 |
| ceph osd pool get testpool noscrub | 是否开启轻量扫描 |
| ceph osd pool get testpool nodeep-scrub | 是否开启深度扫描 |
| scrub_min_interval | 存储池最小清理间隔 |
noxxx 是不允许,如果是false那就可以对该值进行修改,如果是true那就无法修改.可以修改为false后再修改.
对存储池中的数据做快照或恢复,尽量在业务低峰期做快照.
## 方法1
root@ceph-mgr01:~# ceph osd pool mksnap testpool testpool-snap
created pool testpool snap testpool-snap
## 方法2
root@ceph-mgr01:~# rados -p testpool mksnap testpool-snap2
created pool testpool snap testpool-snap2
## 查看快照
created pool testpool snap testpool-snap2
root@ceph-mgr01:~# rados lssnap -p testpool
1 testpool-snap 2022.09.18 11:06:33
2 testpool-snap2 2022.09.18 11:07:27
2 snaps
## 先往testpool里写一些东西
root@ceph-mgr01:~# rados -p testpool put test.pass /etc/passwd
root@ceph-mgr01:~# rados -p testpool put my.sys /etc/fstab
root@ceph-mgr01:~# rados -p testpool put aat.pass /etc/group
root@ceph-mgr01:~# rados -p testpool ls
aat.pass
test.pass
my.sys
## 创建快照
root@ceph-mgr01:~# rados -p testpool mksnap testpool-snap3
## 再做些变化
root@ceph-mgr01:~# rados -p testpool put issue /etc/issue
root@ceph-mgr01:~# rados -p testpool ls
issue
aat.pass
test.pass
my.sys
root@ceph-mgr01:~# rados -p testpool lssnap
1 testpool-snap 2022.09.18 11:06:33
2 testpool-snap2 2022.09.18 11:07:27
3 testpool-snap3 2022.09.18 11:15:31
3 snaps
## 删除test.pass
root@ceph-mgr01:~# rados -p testpool rm test.pass
root@ceph-mgr01:~# rados -p testpool rm test.pass
error removing testpool>test.pass: (2) No such file or directory
## 从快照中还原某个文件
root@ceph-mgr01:~# rados -p testpool rollback test.pass testpool-snap3
rolled back pool testpool to snapshot testpool-snap3
root@ceph-mgr01:~# rados -p testpool ls
issue
aat.pass
test.pass
my.sys
## 又能删了
root@ceph-mgr01:~# rados -p testpool rm test.pass
root@ceph-mgr01:~# rados -p testpool rmsnap testpool-snap
removed pool testpool snap testpool-snap
root@ceph-mgr01:~# rados -p testpool rmsnap testpool-snap2
removed pool testpool snap testpool-snap2
root@ceph-mgr01:~# rados -p testpool lssnap
3 testpool-snap3 2022.09.18 11:15:31
1 snaps
bulestore存储引擎,ceph支持"实时数据压缩"即边压缩边保存数据的功能,该功能有助于节约磁盘空间,可以在bulestore OSD上创建每个Ceph池上启用或禁用压缩,以节约磁盘空间,默认没有开启压缩,需要后期配置并开启.
snappy: 该配置为指定压缩使用的算法,默认是snappy,还有none,zlib,lz4,zstd等,zstd压缩比高,但消耗CPU,lz4和snappy对cpu占用较低,不建议使用zlib.
# ceph osd pool set testpool compression_algorithm snappy
# ceph osd pool set testpool compression_mode aggressive
压缩模式有:
| 存储池压缩参数 | 含义 |
|---|---|
| compression_algorithm | 压缩算法 |
| compression_mode | 压缩模式 |
| compression_required_ratio | 压缩后与压缩前比,默认为.875 |
| compression_max_blob_size | 大于此的块在压缩前被分解成更小的blob块,次设置将覆盖blustore压缩max blob的全局设置 |
可以配置到ceph.conf配置文件的global中,作用于所有存储池
| 参数 | 含义 |
|---|---|
| bluestore_compression_algorithm | 压缩算法 |
| bluestore_compression_mode | 压缩模式 |
| bluestore_compression_required_ratio | 压缩比 |
| bluestore_compression_min_blob_size | 小于他的块不被压缩,默认0 |
| bluestore_compression_max_blob_size | 大于他的块在压缩前会被拆成更小的块,默认0 |
| bluestore_compression_min_blob_size_ssd | 默认8192 |
| bluestore_compression_max_blob_size_ssd | 默认65536 |
| bluestore_compression_min_blob_size_hdd | 默认8192 |
| bluestore_compression_max_blob_size_hdd | 默认65536 |
在不加认证的情况下,先把文件拆分成4M每个的数据块,拿出数据块的ino和ono相加,得到对象id.通过hash对象id对pg进行与运算,计算出对象id属于哪个PG,使用CRUSH算法进行OSD映射.