分布式存储CEPH

Ceph

ceph集群中的角色

monitor:ceph-mon,ceph监视器,在主机运行一个守护进程,用于维护集群状态映射,如存储池pool,PG数量以及PG和存储池的映射状态。此外还用于管理程序和客户端之间的身份验证(cephx协议),通常至少需要三个监视器实现高可用

manage:ceph-mgr,在主机运行一个守护程序,负责跟踪运行时指标和ceph集群的当前状态如,存储利用率,当前性能指标和系统负载。至少需要两个管理器实现高可用

OSDs:ceph-osd,提供数据存储一个硬盘就是一个osd,因此一个服务器的osd数量不能超过磁盘数,OSD用于处理ceph集群数据复制,恢复,重新平衡,并通过检测其他ceph OSD守护程序的心跳向监视器和管理器提供监视数据,至少三个OSD才能实现高可用

RADOS cluster:ceph集群

MDS:元数据服务器

CRUSH:ceph通过CRUSH来存

放和管理数据,是ceph的智能分发机制

磁盘扫描

#!/bun/bash
num=`ls -l /sys/class/scsi_host/* |wc -l`
for ((i=0;i<${num};i++))
do
        echo - - - > /sys/class/scsi_host/host$i/scan && echo "scan host$i"
done

环境准备,部署ceph

所有节点
创建用户

ubuntu --stdin参数不可用
#groupadd -g 2000 cephadmin && useradd -u 2000 -g 2000 cephadmin && echo "123456" |passwd --stdin   cephadmin && echo  "cephadmin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
root@deploy:~# groupadd -g 2000 cephadmin && useradd -u 2000 -g 2000 -s /bin/bash cephadmin && echo "cephadmin:123456"|chpasswd  && echo  "cephadmin ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

地址解析

cat>>/etc/hosts<<EOF
10.0.0.18 deploy
10.0.0.28 mon1 mgr1
10.0.0.38 mon2 mgr2
10.0.0.48 node1
10.0.0.58 node2
10.0.0.68 node3
EOF
root@deploy:~# getenforce 
Disabled

准备apt源

root@deploy:~# apt -y install apt-transport-https ca-certificates curl software-properties-common
root@deploy:~# wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | apt-key add -
root@deploy:~# echo "deb http://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list
wget -q -O- 'https://mirrors.ustc.edu.cn/ceph/keys/release.asc' | apt-key add -
echo "deb http://mirrors.ustc.edu.cn/ceph/debian-pacific/ bionic main" >> /etc/apt/sources.list
root@deploy:~# apt install python2.7 -y && ln -sv /usr/bin/python2.7 /usr/bin/python2

deploy:免密 安装ceph-deploy

cephadmin@deploy:~$ ssh-keygen
cephadmin@deploy:~$  scp * cephadmin@10.0.0.28:~/.ssh
cephadmin@deploy:~$  scp * cephadmin@10.0.0.38:~/.ssh
cephadmin@deploy:~$  ssh-copy-id cephadmin@10.0.0.38
cephadmin@deploy:~$  ssh-copy-id cephadmin@10.0.0.48
cephadmin@deploy:~$  ssh-copy-id cephadmin@10.0.0.58
cephadmin@deploy:~$  ssh-copy-id cephadmin@10.0.0.68


deb http://mirrors.ustc.edu.cn/ceph/debian-15.2.9/ bionic main #用于安装deploy 2.0.1
cephadmin@deploy:~$ sudo apt install ceph-deploy

初始化集群指定mon1

cephadmin@deploy:~$ sudo ceph-deploy new --cluster-network 192.168.10.0/24 --public-network 10.0.0.0/24 mon1 #初始化集群指定外部链接ip和内部通信ip
cephadmin@deploy:~$ ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring
cephadmin@deploy:~$ cat ceph.conf 
[global]
fsid = 50ce7c27-746d-49ac-8668-c7e787c26548
public_network = 10.0.0.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = mon1
mon_host = 10.0.0.28
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

cephadmin@deploy:~$ sudo apt install ceph-common

初始化存储节点

cephadmin@deploy:~$ sudo ceph-deploy install --no-adjust-repos --nogpgcheck node1 node2 node3 #存储节点初始化,在存储节点安装相关包

初始化mon节点

root@mon1:~# apt install -y ceph-mon  #安装ceph-mon包
root@mon2:~# apt install -y ceph-mon
cephadmin@deploy:~$ sudo ceph-deploy mon create-initial #对ceph.conf内指定的mon节点初始化

root@mon1:~# ps -ef |grep mon
root        610      1  0 11:12 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
message+    611      1  0 11:12 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon      618      1  0 11:12 ?        00:00:00 /usr/sbin/atd -f
ceph       6246      1  0 13:29 ?        00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id mon1 --setuser ceph --setgroup ceph
root       6736    957  0 13:30 pts/0    00:00:00 grep --color=auto mon

分发密钥

通过mon,mgr deploy节点管理集群需keyring,并更改权限
cephadmin@deploy:~$ sudo ceph-deploy admin mon1
cephadmin@mon1:~$ ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  rbdmap  tmpJn1plh
cephadmin@mon1:~$ sudo setfacl -m u:cephadmin:rw /etc/ceph/ceph.client.admin.keyring

添加mon节点

cephadmin@deploy:~$ sudo ceph-deploy mon add mon2 #增加新的mon节点,实现mon高可用至少需3个mon节点
cephadmin@deploy:~$ sudo ceph-deploy admin mon2
root@mon2:~# setfacl -m u:cephadmin:rw /etc/ceph/ceph.client.admin.keyring
cephadmin@deploy:~$ ceph -s
  cluster:
    id:     50ce7c27-746d-49ac-8668-c7e787c26548
    health: HEALTH_OK

  services:
    mon: 2 daemons, quorum mon1,mon2 (age 13s)
    mgr: mgr1(active, since 65m)
    osd: 9 osds: 9 up (since 12m), 9 in (since 13m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   52 MiB used, 180 GiB / 180 GiB avail
    pgs:     1 active+clean

检查mon

cephadmin@deploy:~$ ceph quorum_status --format json-pretty

初始化mgr节点

cephadmin@mon1:~$ sudo apt install ceph-mgr  #mgr节点安装ceph-mgr包
cephadmin@deploy:~$ sudo ceph-deploy mgr create mgr1 #初始化mgr节点
cephadmin@mon1:~$ ps -ef | grep ceph
root       4426      1  0 13:28 ?        00:00:00 /usr/bin/python3.6 /usr/bin/ceph-crash
ceph       6246      1  0 13:29 ?        00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id mon1 --setuser ceph --setgroup ceph
root       6900    957  0 13:35 pts/0    00:00:00 su - cephadmin
cephadm+   6901   6900  0 13:35 pts/0    00:00:00 -su
ceph      11446      1 18 13:41 ?        00:00:07 /usr/bin/ceph-mgr -f --cluster ceph --id mgr1 --setuser ceph --setgroup ceph

通过mgr节点管理集群需keyring
cephadmin@deploy:~$ sudo ceph-deploy admin deploy
cephadmin@deploy:~$ setfacl -m u:cephadmin:rw /etc/ceph/ceph.client.admin.keyring

消除mon is allowing insecure global_id reclaim

cephadmin@deploy:~$ sudo setfacl -m u:cephadmin:rw /etc/ceph/ceph.client.admin.keyring
cephadmin@deploy:~$ ceph -s
  cluster:
    id:     50ce7c27-746d-49ac-8668-c7e787c26548
    health: HEALTH_WARN
            mon is allowing insecure global_id reclaim
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum mon1 (age 16m)
    mgr: mgr1(active, since 4m)
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

cephadmin@deploy:~$ ceph config set mon auth_allow_insecure_global_id_reclaim false
cephadmin@deploy:~$ ceph -s
  cluster:
    id:     50ce7c27-746d-49ac-8668-c7e787c26548
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3

  services:
    mon: 1 daemons, quorum mon1 (age 17m)
    mgr: mgr1(active, since 5m)
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

添加mgr节点

mgr节点高可用,至少2个mgr节点
root@mon2:~# apt install ceph-mgr -y
cephadmin@deploy:~$ sudo ceph-deploy mgr create mgr2

cephadmin@deploy:~$ ceph -s
  cluster:
    id:     50ce7c27-746d-49ac-8668-c7e787c26548
    health: HEALTH_OK

  services:
    mon: 2 daemons, quorum mon1,mon2 (age 8m)
    mgr: mgr1(active, since 74m), standbys: mgr2
    osd: 9 osds: 9 up (since 21m), 9 in (since 21m)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   52 MiB used, 180 GiB / 180 GiB avail
    pgs:     1 active+clean

准备OSD

#擦除磁盘之前通过 deploy 节点对 node 节点执行安装 ceph 基本运行环境
cephadmin@deploy:~$ ceph-deploy install --release pacific node1
cephadmin@deploy:~$ ceph-deploy install --release pacific node2
cephadmin@deploy:~$ ceph-deploy install --release pacific node3

列出磁盘

cephadmin@deploy:~$ sudo ceph-deploy disk list node1
cephadmin@deploy:~$ sudo ceph-deploy disk list node2
cephadmin@deploy:~$ sudo ceph-deploy disk list node3

ceph-deploy disk zap node1 /dev/sdb
ceph-deploy disk zap node1 /dev/sdc
ceph-deploy disk zap node1 /dev/sdd

ceph-deploy disk zap node2 /dev/sdb
ceph-deploy disk zap node2 /dev/sdc
ceph-deploy disk zap node2 /dev/sdd

ceph-deploy disk zap node3 /dev/sdb
ceph-deploy disk zap node3 /dev/sdc
ceph-deploy disk zap node3 /dev/sdd

错误:
[node2][WARNIN] --> --destroy was not specified, but zapping a whole device will remove the partition table
[node2][WARNIN]  stderr: wipefs: error: /dev/sdb: probing initialization failed: Device or resource busy

node节点上手动删除lvm
root@node2:~# lsblk 
NAME                                                                                                 MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                                                                                                    8:0    0  100G  0 disk 
└─sda1                                                                                                 8:1    0  100G  0 part /
sdb                                                                                                    8:16   0   20G  0 disk 
└─ceph--20202ca6--848a--4709--8023--18d34ae450dd-osd--block--bc9a29e8--2f75--487f--a0b7--5f51c78fcc86
                                                                                                     253:0    0   20G  0 lvm  
sdc                                                                                                    8:32   0   20G  0 disk 
└─ceph--b2c4df19--3512--494f--94c4--390a3766a7ce-osd--block--57b22e2a--0599--44e3--9606--5881534a2c98
                                                                                                     253:1    0   20G  0 lvm  
sdd                                                                                                    8:48   0   20G  0 disk 
└─ceph--20306cc2--f596--4e29--be7a--582c8af373b5-osd--block--2e4e4f73--d61a--4c97--a44d--b3944d2d3430
                                                                                                     253:2    0   20G  0 lvm  
root@node2:~# dmsetup remove ceph--b2c4df19--3512--494f--94c4--390a3766a7ce-osd--block--57b22e2a--0599--44e3--9606--5881534a2c98

添加OSD

ceph-deploy osd create node1 --data /dev/sdb
ceph-deploy osd create node1 --data /dev/sdc
ceph-deploy osd create node1 --data /dev/sdd

ceph-deploy osd create node2 --data /dev/sdb
ceph-deploy osd create node2 --data /dev/sdc
ceph-deploy osd create node2 --data /dev/sdd

ceph-deploy osd create node3 --data /dev/sdb
ceph-deploy osd create node3 --data /dev/sdc
ceph-deploy osd create node3 --data /dev/sdd


cephadmin@deploy:~$ ceph -s
  cluster:
    id:     50ce7c27-746d-49ac-8668-c7e787c26548
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum mon1 (age 64m)
    mgr: mgr1(active, since 52m)
    osd: 9 osds: 9 up (since 6s), 9 in (since 15s)

  data:
    pools:   1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage:   52 MiB used, 180 GiB / 180 GiB avail
    pgs:     1 active+clean



root@node1:~# ps -ef |grep osd
ceph        9022       1  0 14:30 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph       10681       1  0 14:30 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph
ceph       12337       1  0 14:30 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph


root@deploy:/data# cat zap.sh create.sh 
#!/bin/bash
for i in {1,2,3}
do
	for j in {b,c,d}
	do
		ceph-deploy disk zap node$i /dev/sd$j
	done
done
#!/bin/bash
for i in {1,2,3}
do
	for j in {b,c,d}
	do
		ceph-deploy osd create node$i --data /dev/sd$j
	done
done

设置osd开机自启

root@node1:~# systemctl enable ceph-osd@0 ceph-osd@1 ceph-osd@2
Created symlink /etc/systemd/system/ceph-osd.target.wants/ceph-osd@0.service → /lib/systemd/system/ceph-osd@.service.
Created symlink /etc/systemd/system/ceph-osd.target.wants/ceph-osd@1.service → /lib/systemd/system/ceph-osd@.service.
Created symlink /etc/systemd/system/ceph-osd.target.wants/ceph-osd@2.service → /lib/systemd/system/ceph-osd@.service.

OSD移除
Ceph 集群中的一个 OSD 是一个 node 节点的服务进程且对应于一个物理磁盘设备,是一个专用的守护进程。在某 OSD 设备出现故障,或管理员出于管理之需确实要移除特定的 OSD设备时,需要先停止相关的守护进程,而后再进行移除操作。对于 Luminous 及其之后的版本来说,停止和移除命令的格式分别如下所示:

  1. 1. 停用设备:ceph osd out {osd-num}(osd.0  osd.1)
    2. 停止进程:sudo systemctl stop ceph-osd@{osd-num}
    3. 移除设备:ceph osd purge {id} --yes-i-really-mean-it
    $ ceph osd purge 5 --yes-i-really-mean-it  {id为osd的id,ceph osd tree查看}
    4.$ ceph osd crush remove node2 移除node 或者
    	ceph-deploy purge node1 node2 node3
    	ceph-deploy purgedata node1 node2 node3
       若类似如下的 OSD 的配置信息存在于 ceph.conf 配置文件中,管理员在删除 OSD 之后手动将其删除。
    

Luminous 之前的版本来说,管理员需要依次手动执行如下步骤删除 OSD 设备:

  1. 1. 于 CRUSH 运行图中移除设备:ceph osd crush remove {name}
    2. 移除 OSD 的认证 key:ceph auth del osd.{osd-num}
    3. 最后移除 OSD 设备:ceph osd rm {osd-num}
    

ceph测试

创建pool,查看pool
cephadmin@deploy:~$ ceph osd pool create mypool 32 32
pool 'mypool' created
cephadmin@deploy:~$ ceph osd pool ls
device_health_metrics
mypool
cephadmin@deploy:~$ ceph osd lspools
1 device_health_metrics
2 mypool
上传文件
cephadmin@deploy:~$ sudo rados put msg1 /var/log/syslog --pool=mypool
cephadmin@deploy:~$ rados ls --pool=mypool
msg1
下载文件
cephadmin@deploy:~$ sudo rados get msg1 --pool=mypool /opt/test.txt
cephadmin@deploy:~$ ls /opt/test.txt 
/opt/test.txt
删除文件
cephadmin@deploy:~$ sudo rados rm msg1 --pool=mypool
cephadmin@deploy:~$ rados ls --pool=mypool

ceph集群基础应用

RBD(RADOS Block Devices)即为块存储的一种,RBD 通过 librbd 库与 OSD 进行交互,RBD为 KVM 等虚拟化技术和云服务(如 OpenStack 和 CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于 libvirt 和 QEMU 实用程序与 RBD 进行集成,客户端基于librbd 库即可将 RADOS 存储集群用作块设备,

创建存储池命令格式:
$ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}
$ ceph osd pool create myrbd1 64 64 #创建存储池,指定 pg 和 pgp 的数量,pgp 是对存在于 pg 的数据进行组合存储,pgp 通常等于 pg 的值
pool 'myrdb1' created
$ ceph osd pool --help
$ ceph osd pool application enable myrbd1 rbd #对存储池启用 RBD 功能
enabled application 'rbd' on pool 'myrdb1' $ rbd -h
$ rbd pool init -p myrbd1 #通过 RBD 命令对存储池初始化
cephadmin@deploy:~$  ceph osd pool create mydb1 32 32  #创建pool
cephadmin@deploy:~$  ceph osd pool application enable mydb1 rdb  #对指定的pool开启rbd
cephadmin@deploy:~$  rbd pool init -p mydb1 #初始化pool

rbd存储池通过创建映像(image)并把映像作为块设备使用,rbd 命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作

$ rbd create myimg1 --size 5G --pool myrbd1
$ rbd create myimg2 --size 3G --pool myrbd1 --image-format 2 --image-feature layering
#后续步骤会使用 myimg2 ,由于 centos 系统内核较低无法挂载使用,因此只开启部分特性。除了 layering 其他特性需要高版本内核支持
$ rbd ls --pool myrbd1 #列出指定的 pool 中所有的 img
$ rbd --image myimg1 --pool myrbd1 info
cephadmin@deploy:~$  rbd create myimg1 --size 1G --pool mydb1
cephadmin@deploy:~$  rbd create myimg2 --size 1G --pool mydb1 --image-format 2 --image-feature layering #创建image
cephadmin@deploy:~$  rbd ls --pool mydb1 #列出image
cephadmin@deploy:~$  rbd --image myimg1 --pool mydb1 info #查看image信息
cephadmin@deploy:~$ rbd --image myimg1 --pool mydb1 info
rbd image 'myimg1':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 375558d8ce79
	block_name_prefix: rbd_data.375558d8ce79
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Tue Nov 15 15:46:51 2022
	access_timestamp: Tue Nov 15 15:46:51 2022
	modify_timestamp: Tue Nov 15 15:46:51 2022
cephadmin@deploy:~$ rbd --image myimg2 --pool mydb1 info
rbd image 'myimg2':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	snapshot_count: 0
	id: 11ae5efd0dc2
	block_name_prefix: rbd_data.11ae5efd0dc2
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Tue Nov 15 15:59:22 2022
	access_timestamp: Tue Nov 15 15:59:22 2022
	modify_timestamp: Tue Nov 15 15:59:22 2022
	
cephadmin@deploy:~$ sudo rbd -p mydb1 map myimg1  #映射img到客户端低版本内核无法使用
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable mydb1/myimg1 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
cephadmin@deploy:~$ sudo rbd -p mydb1 map myimg2 #映射img到客户端
rbd: warning: image already mapped as /dev/rbd0
/dev/rbd0
cephadmin@deploy:~$ lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk 
└─sda1   8:1    0  100G  0 part /
sr0     11:0    1  951M  0 rom  
rbd0   252:0    0    1G  0 disk 

root@deploy:~# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=9, agsize=31744 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=262144, 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@deploy:~# mount /dev/rbd0 /data
root@deploy:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            955M     0  955M   0% /dev
tmpfs           198M  9.5M  188M   5% /run
/dev/sda1       100G  4.5G   96G   5% /
tmpfs           986M     0  986M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           986M     0  986M   0% /sys/fs/cgroup
tmpfs           198M     0  198M   0% /run/user/0
/dev/rbd0      1014M   34M  981M   4% /data
root@deploy:~# cd /data/
root@deploy:/data# touch test.txt
root@deploy:/data# ll
total 4
drwxr-xr-x  2 root root   22 Nov 15 16:09 ./
drwxr-xr-x 23 root root 4096 Nov 15 16:08 ../
-rw-r--r--  1 root root    0 Nov 15 16:09 test.txt

ceph radosgw(RGW)对象存储

RGW 提供的是 REST 接口,客户端通过 http 与其进行交互,完成数据的增删改查等管理操作。

使用 radosgw 的场合,则以下命令将 ceph-mgr1 服务器部署为 RGW 主机:

mgr1:# apt install radosgw=16.2.5-1bionic
deploy:$  ceph-deploy --overwrite-conf rgw create mgr1
初始化完成 radosgw 之后,会初始化默认的存储池
default.rgw.control
default.rgw.meta
default.rgw.log

Ceph-FS 文件存储

Ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使用 ceph 集群作为数据存储服务器。Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds,ceph-mds进程管理与 cephFS 上存储的文件相关的元数据,并协调对 ceph 存储集群的访问。

部署 MDS 服务

在指定的 ceph-mds 服务器部署 ceph-mds 服务,可以和其它服务器混用(如 ceph-mon、ceph-mgr)
mgr1:# apt install ceph-mds=16.2.5-1bionic
deploy:$ ceph-deploy mds create ceph-mgr1

ceph mds stat

deploy:$  ceph osd pool create cephfs-metadata 32 32 
pool 'cephfs-metadata' created #保存 metadata 的 pool
deploy:$ ceph osd pool create cephfs-data 64 64

创建 cephFS

fs new <fs_name> <metadata> <data> [--force] [--      make new filesystem using named pools <metadata> and allow-dangerous-metadata-overlay] [<fscid:int>] [--   <data> recover]

ceph fs new mycephfs cephfs-metadata cephfs-data
ceph fs ls
ceph mds stat

在 ceph 的客户端测试 cephfs 的挂载,需要指定 mon 节点的 6789 端口:

mount -t ceph 172.31.6.101:6789:/ /mnt -o name=admin,secret=(ceph.client.admin.keyring  key)

常用命令

只显示存储池:
$ ceph osd pool ls
$ ceph osd lspools #列出存储池并显示 id
$ ceph pg stat #查看 pg 状态
$ ceph osd pool stats mypool #查看指定 pool 或所有的 pool 的状态
$ ceph df #查看集群存储状态
$ ceph df detail #查看集群存储状态详情
$ ceph osd stat #查看 osd 状态
$ ceph osd dump #显示 OSD 的底层详细信息
$ ceph osd tree #显示 OSD 和节点的对应关系
$ ceph mon stat #查看 mon 节点状态:
$ ceph mon dump #查看 mon 节点的 dump 信息 epoch 3 #Ceph OSD 守护进程和 PG 的每个状态改变的历史(称之为"epoch"),osd.N 的失效会导致 osd map 变化,epoch 值也会自动调整
#显示存储池的用量信息:
$ rados df
#重命名存储池:
$ ceph osd pool rename

cephadmin@deploy:~$ ceph osd pool ls
device_health_metrics
mypool
mydb1
cephadmin@deploy:~$ ceph osd lspools
1 device_health_metrics
2 mypool
3 mydb1
cephadmin@deploy:~$ ceph pg stat
65 pgs: 65 active+clean; 14 MiB data, 90 MiB used, 180 GiB / 180 GiB avail
cephadmin@deploy:~$ ceph osd pool stats mypool
pool mypool id 2
  nothing is going on

cephadmin@deploy:~$ ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL    USED  RAW USED  %RAW USED
hdd    180 GiB  180 GiB  90 MiB    90 MiB       0.05
TOTAL  180 GiB  180 GiB  90 MiB    90 MiB       0.05
 
--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS    USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        0     0 B      0     57 GiB
mypool                  2   32     0 B        0     0 B      0     57 GiB
mydb1                   3   32  10 MiB       20  31 MiB   0.02     57 GiB
cephadmin@deploy:~$ ceph osd stat
9 osds: 9 up (since 116m), 9 in (since 116m); epoch: e60
cephadmin@deploy:~$ ceph osd tree
ID  CLASS  WEIGHT   TYPE NAME       STATUS  REWEIGHT  PRI-AFF
-1         0.17537  root default                             
-3         0.05846      host node1                           
 0    hdd  0.01949          osd.0       up   1.00000  1.00000
 1    hdd  0.01949          osd.1       up   1.00000  1.00000
 2    hdd  0.01949          osd.2       up   1.00000  1.00000
-5         0.05846      host node2                           
 3    hdd  0.01949          osd.3       up   1.00000  1.00000
 4    hdd  0.01949          osd.4       up   1.00000  1.00000
 5    hdd  0.01949          osd.5       up   1.00000  1.00000
-7         0.05846      host node3                           
 6    hdd  0.01949          osd.6       up   1.00000  1.00000
 7    hdd  0.01949          osd.7       up   1.00000  1.00000
 8    hdd  0.01949          osd.8       up   1.00000  1.00000
cephadmin@deploy:~$ ceph mon stat
e2: 2 mons at {mon1=[v2:10.0.0.28:3300/0,v1:10.0.0.28:6789/0],mon2=[v2:10.0.0.38:3300/0,v1:10.0.0.38:6789/0]}, election epoch 8, leader 0 mon1, quorum 0,1 mon1,mon2

集群的停止或重启:

重启之前,要提前设置 ceph 集群不要将 OSD 标记为 out,避免 node 节点关闭服务后被踢出 ceph 集群外:

cephadmin@deploy:~$  ceph osd set noout #关闭服务前设置 nooutnoout is set
cephadmin@deploy:~$  ceph osd unset noout #启动服务后取消 nooutnoout is unset

关闭服务顺序

#关闭服务前设置 noout
关闭存储客户端停止读写数据
如果使用了 RGW,关闭 RGW
关闭 cephfs 元数据服务
关闭 ceph OSD
关闭 ceph manager
关闭 ceph monitor

开启服务顺序

启动 ceph monitor
启动 ceph manager
启动 ceph OSD
关闭 cephfs 元数据服务
启动 RGW
启动存储客户端
#启动服务后取消 noout-->ceph osd unset noout

添加服务器

1.先添加仓库源
2.ceph-deploy install --release pacific ceph-nodex
3.擦除磁盘
ceph-deploy disk zap ceph-nodex /dev/sdx
4.添加 osd:
sudo ceph-deploy osd create ceph-nodex --data /dev/sdx

删除服务器

停止服务器之前要把服务器的 OSD 先停止并从 ceph 集群删除
1 把 osd 踢出集群
ceph osd out 1
2.等一段时间
3.停止 osd.x 进程
4.删除 osd
ceph osd rm 1
5.当前主机的其它磁盘重复以上操作
6.OSD 全部操作完成后下线主机

副本池:replicated,定义每个对象在集群中保存为多少个副本,默认为三个副本,一主两备,实现高可用,副本池是 ceph 默认的存储池类型。将一个数据对象存储为多个副本,在客户端写入操作时,客户端通过类似一致性哈希算法的方式计算出存储pool,ceph 使用 CRUSH 算法计算出与对象相对应的 PG ID 和 primary OSD,主 OSD 根据设置的副本数、对象名称、存储池名称和集群运行图(cluster map)计算出 PG的各辅助 OSD,然后由 OSD 将数据再同步给辅助 OSD。

ceph的数据读写

读取数据:
1. 客户端发送读请求,RADOS 将请求发送到主 OSD。
2. 主 OSD 从本地磁盘读取数据并返回数据,最终完成读请求。
写入数据:
1. 客户端 APP 请求写入数据,RADOS 发送数据到主 OSD。
2. 主 OSD 识别副本 OSDs,并发送数据到各副本 OSD。
3. 副本 OSDs 写入数据,并发送写入完成信号给主 OSD。
4. 主 OSD 发送写入完成信号给客户端 APP。
注:数据写入时主副OSD全部返回完成信号时才会返回数据存储完成信号
cephadmin@deploy:~$ ceph pg ls-by-pool mypool |awk '{print $1,$2,$15}' #按pool查看pg,主副本信息等
PG OBJECTS ACTING
2.0 0 [3,6,0]p3
2.1 0 [2,6,3]p2
2.2 0 [5,1,8]p5
2.3 0 [5,2,8]p5
2.4 0 [1,7,3]p1
2.5 0 [8,0,4]p8
2.6 0 [1,6,3]p1
2.7 0 [3,7,2]p3
2.8 0 [3,7,0]p3
2.9 0 [1,4,8]p1
2.a 0 [6,1,3]p6
2.b 0 [8,5,2]p8
2.c 0 [6,0,5]p6
2.d 0 [6,3,2]p6
2.e 0 [2,8,3]p2
2.f 0 [8,4,0]p8
2.10 0 [8,1,5]p8
2.11 0 [4,1,8]p4
2.12 0 [7,1,3]p7
2.13 0 [7,4,2]p7
2.14 0 [3,7,0]p3
2.15 0 [7,1,3]p7
2.16 0 [5,7,1]p5
2.17 0 [5,6,2]p5
2.18 0 [8,4,2]p8
2.19 0 [0,4,7]p0
2.1a 0 [3,8,2]p3
2.1b 0 [6,5,2]p6
2.1c 0 [8,4,1]p8
2.1d 0 [7,3,0]p7
2.1e 0 [2,7,5]p2
2.1f 0 [0,3,8]p0

纠删码池(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 则可以支持纠删码池。

纠删码写:

数据将在主 OSD 进行编码然后分发到相应的 OSDs 上去。

1.计算合适的数据块并进行编码

2.对每个数据块进行编码并写入 OSD

PG和PGP

PG = Placement Group #归置组

PGP = Placement Group for Placement purpose #归置组的组合,pgp 相当于是 pg 对应osd 的一种排列组合关系。

归置组(placement group)是用于跨越多 OSD 将数据存储在每个存储池中的内部数据结构。

归置组在 OSD 守护进程和 ceph 客户端之间生成了一个中间层,CRUSH 算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个 OSD 守护进程,从而能够支持在新的 OSD 设备上线时进行数据重新平衡。

PG 是一个虚拟组件,它是对象映射到存储池时使用的虚拟层。

存储池由一系列的归置组组成,而 CRUSH 算法则根据集群运行图和集群状态,将个 PG 均匀、伪随机(基于 hash 映射,每次的计算结果够一样)的分布到集群中的 OSD 之上。

如果某个 OSD 失败或需要对集群进行重新平衡,ceph 则移动或复制整个归置组而不需要单独对每个镜像进行寻址。

PG和OSD

ceph 基于 crush 算法将归置组 PG 分配至 OSD

当一个客户端存储对象的时候,CRUSH 算法映射每一个对象至归置组(PG)

存储池PG计算:

官方的计算公式:

Total PGs = (Total_number_of_OSD * 100) / max_replication_count

单个 pool 的 PG 计算如下:

有 100 个 osd,3 副本,5 个 pool

Total PGs =100*100/3=3333

每个 pool 的 PG=3333/5=512,那么创建 pool 的时候就指定 pg 为 512(pool 的 PG 值四舍五入到最近的 2 的 N 次幂)

PG状态

Peering:
正在同步状态,同一个 PG 中的 OSD 需要将准备数据同步一致,而 Peering(对等)就是 OSD同步过程中的状态。

Activating:
Peering 已经完成,PG 正在等待所有 PG 实例同步 Peering 的结果(Info、Log 等)

Clean:
干净态,PG 当前不存在待修复的对象,并且大小等于存储池的副本数,即 PG 的活动集(Acting Set)和上行集(Up Set)为同一组 OSD 且内容一致。
活动集(Acting Set):由 PG 当前主的 OSD 和其余处于活动状态的备用 OSD 组成,当前 PG内的 OSD 负责处理用户的读写请求。
上行集(Up Set):在某一个 OSD 故障时,需要将故障的 OSD 更换为可用的 OSD,并主 PG内部的主 OSD 同步数据到新的 OSD 上,例如 PG 内有 OSD1、OSD2、OSD3,当 OSD3故障后需要用 OSD4 替换 OSD3,那么 OSD1、OSD2、OSD3 就是上行集,替换后 OSD1、OSD2、OSD4 就是活动集,OSD 替换完成后活动集最终要替换上行集。

Active:
就绪状态或活跃状态,Active 表示主 OSD 和备 OSD 处于正常工作状态,此时的 PG 可以正常处理来自客户端的读写请求,正常的 PG 默认就是 Active+Clean 状态。

Degraded:降级状态:
降级状态出现于 OSD 被标记为 down 以后,那么其他映射到此 OSD 的 PG 都会转换到降级状态。如果此 OSD 还能重新启动完成并完成 Peering 操作后,那么使用此 OSD 的 PG 将重新恢复为 clean 状态。如果此 OSD 被标记为 down 的时间超过 5 分钟还没有修复,那么此 OSD 将会被 ceph 踢出集群,然后 ceph 会对被降级的 PG 启动恢复操作,直到所有由于此 OSD 而被降级的 PG重新恢复为 clean 状态。恢复数据会从 PG 内的主 OSD 恢复,如果是主 OSD 故障,那么会在剩下的两个备用 OSD重新选择一个作为主 OSD。

Stale:过期状态:
正常状态下,每个主 OSD 都要周期性的向 RADOS 集群中的监视器(Mon)报告其作为主 OSD所持有的所有 PG 的最新统计数据,因任何原因导致某个 OSD 无法正常向监视器发送汇报信息的、或者由其他 OSD 报告某个 OSD 已经 down 的时候,则所有以此 OSD 为主 PG 则会立即被标记为 stale 状态,即他们的主 OSD 已经不是最新的数据了,如果是备份的 OSD发送 down 的时候,则 ceph 会执行修复而不会触发 PG 状态转换为 stale 状态。

undersized:
PG 当前副本数小于其存储池定义的值的时候,PG 会转换为 undersized 状态,比如两个备份 OSD 都 down 了,那么此时 PG 中就只有一个主 OSD 了,不符合 ceph 最少要求一个主 OSD 加一个备 OSD 的要求,那么就会导致使用此 OSD 的 PG 转换为 undersized 状态,直到添加备份 OSD 添加完成,或者修复完成。

Scrubbing:
scrub 是 ceph 对数据的清洗状态,用来保证数据完整性的机制,Ceph 的 OSD 定期启动 scrub 线程来扫描部分对象,通过与其他副本比对来发现是否一致,如果存在不一致,抛出异常提示用户手动解决,scrub 以 PG 为单位,对于每一个 pg,ceph 分析该 pg 下所有的 object, 产生一个类似于元数据信息摘要的数据结构,如对象大小,属性等,叫 scrubmap, 比较主与副 scrubmap,来保证是不是有 object 丢失或者不匹配,扫描分为轻量级扫描和深度扫描,轻量级扫描也叫做 light scrubs 或者 shallow scrubs 或者 simply scrubs 即轻量级扫描. Light scrub(daily)比较 object size 和属性,deep scrub (weekly)读取数据部分并通过checksum(CRC32 算 法 ) 对 比 和 数 据 的 一 致 性 , 深 度 扫 描 过 程 中 的 PG 会 处 于scrubbing+deep 状态。

Recovering:
正在恢复态,集群正在执行迁移或同步对象和他们的副本,这可能是由于添加了一个新的OSD 到集群中或者某个 OSD 宕掉后,PG 可能会被 CRUSH 算法重新分配不同的 OSD,而由于 OSD 更换导致 PG 发生内部数据同步的过程中的 PG 会被标记为 Recovering。

Backfilling:
正在后台填充态,backfill 是 recovery 的一种特殊场景,指 peering 完成后,如果基于当前权威日志无法对 Up Set(上行集)当中的某些 PG 实例实施增量同步(例如承载这些 PG 实例的 OSD 离线太久,或者是新的 OSD 加入集群导致的 PG 实例整体迁移) 则通过完全拷贝当前 Primary 所有对象的方式进行全量同步,此过程中的 PG 会处于 backfilling。

Backfill-toofull:
某个需要被 Backfill 的 PG 实例,其所在的 OSD 可用空间不足,Backfill 流程当前被挂起时PG 给的状态。

ceph 读写

ceph 读写对象的时候,客户端从 ceph 监视器检索出集群运行图(cluster map),然后客户端访问指定的存储池,并对存储池内 PG 的对象执行读写操作。
存储池的 CRUSH 计算结果和 PG 的数量,是决定 ceph 如何放置数据的关键因素。基于集群的最新运行图,客户端能够了解到集群中的所有监视器和 OSD 以及他们各自当前
的状态。
但是客户端仍然不知道对象的保存位置。

客户端在读写对象时,需要提供的是对象标识和存储池名称。
客户端需要在存储池中读写对象时,需要客户端将对象名称、对象名称的 hash 码、存储池中的 PG 数量和存储池名称作为输入信息提供给 ceph,然后由 CRUSH 计算出 PG 的 ID 以及此 PG 针对的主 OSD 即可读写 OSD 中的对象。

具体写操作如下:
1.APP 向 ceph 客户端发送对某个对象的请求,此请求包含对象和存储池,然后 ceph 客户端对访问的对象做 hash 计算,并根据此 hash 值计算出对象所在的 PG,完成对象从 Pool至 PG 的映射。
APP 访问 pool ID 和 object ID (比如 pool = pool1 and object-id = “name1”)
ceph client 对 objectID 做哈希
ceph client 对该 hash 值取 PG 总数的模,得到 PG 编号(比如 32),(第 2 和第 3 步基本保证了一个 pool 内部的所有 PG 将会被均匀地使用)
ceph client 对 pool ID 取 hash(比如 “pool1” = 3)
ceph client 将 pool ID 和 PG ID 组合在一起(比如 3.23)得到 PG 的完整 ID。
2.然后客户端据 PG、CRUSH 运行图和归置组(placement rules)作为输入参数并再次进行计算,并计算出对象所在的 PG 内的主 OSD ,从而完成对象从 PG 到 OSD 的映射。
Ceph client 从 MON 获取最新的 cluster map。
Ceph client 根据上面的第(2)步计算出该 object 将要在的 PG 的 ID。
Ceph client 再根据 CRUSH 算法计算出 PG 中目标主和备 OSD 的 ID,即可对 OSD 的数据进行读写。
3.客户端开始对主 OSD 进行读写请求(副本池 IO),如果发生了写操作,会有 ceph 服务端完成对象从主 OSD 到备份 OSD 的同步。

存储池删除操作

如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设置了两个机制来防止误删除操作。

第一个机制是 NODELETE 标志,需要设置为 false 但是默认就是 false 了。

创建存储池
cephadmin@deploy:~$ ceph osd pool create mypool 32 32
pool 'mypool' created
cephadmin@deploy:~$ ceph osd lspools
1 device_health_metrics
2 mypool
cephadmin@deploy:~$ ceph osd pool get mypool nodelete
nodelete: false

如果设置为了 true 就表示不能删除,可以使用 set 指令重新设置为 fasle
cephadmin@deploy:~$ ceph osd pool set mypool nodelete true
set pool 2 nodelete to true
cephadmin@deploy:~$ ceph osd pool get mypool nodelete
nodelete: true

第二个机制是集群范围的配置参数 mon allow pool delete,默认值为 false,即监视器不允许删除存储池,可以在特定场合使用 tell 指令临时设置为(true)允许删除,在删除指定的 pool之后再重新设置为 false。

cephadmin@deploy:~$ ceph tell mon.* injectargs --mon-allow-pool-delete=true
mon.mon1: {}
mon.mon1: mon_allow_pool_delete = 'true' 
mon.mon2: {}
mon.mon2: mon_allow_pool_delete = 'true' 

删除存储池

cephadmin@deploy:~$ ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
pool 'mypool' removed
cephadmin@deploy:~$ ceph osd  lspools
1 device_health_metrics

存储池配额

cephadmin@deploy:~$ ceph osd pool create mypool 32 32
pool 'mypool' created
cephadmin@deploy:~$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: N/A #默认不限制对象数量
  max bytes  : N/A #默认不限制空间大小

cephadmin@deploy:~$ ceph osd pool set-quota mypool max_objects 1000 #限制最大 1000 个对象
set-quota max_objects = 1000 for pool mypool
cephadmin@deploy:~$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: 1k objects  (current num objects: 0 objects)
  max bytes  : N/A
  
cephadmin@deploy:~$ ceph osd pool set-quota mypool max_bytes 10737418240 #限制最大 10737418240 字节
set-quota max_bytes = 10737418240 for pool mypool
cephadmin@deploy:~$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
  max objects: 1k objects  (current num objects: 0 objects)
  max bytes  : 10 GiB  (current num bytes: 0 bytes)

存储池可用参数:

size:存储池中的对象副本数,默认一主两个备 3 副本。
$ ceph osd pool get mypool size
size: 3
$ ceph osd pool get mypool min_size
min_size: 2
min_size:提供服务所需要的最小副本数,如果定义 size 为 3,min_size 也为 3,坏掉一个OSD,如果 pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务,如果将 min_size定义为 2,那么还可以提供服务,如果提供为 1,表示只要有一块副本都提供服务。
pg_num:查看当前 PG 的数量
$ ceph osd pool get mypool pg_num
pg_num: 32
crush_rule:设置 crush 算法规则
$ ceph osd pool get mypool crush_rule
crush_rule: replicated_rule #默认为副本池
nodelete:控制是否可删除,默认可以
$ ceph osd pool get mypool nodelete
nodelete: false
nopgchange:控制是否可更改存储池的 pg num 和 pgp num
$ ceph osd pool get mypool nopgchange
nopgchange: false
$ ceph osd pool set mypool pg_num 64 #修改指定 pool 的 pg 数量
set pool 1 pg_num to 64
nosizechange:控制是否可以更改存储池的大小
$ ceph osd pool get mypool nosizechange
nosizechange: false #默认允许修改存储池大小
$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
max objects: 1 k objects
max bytes : 10 GiB
$ ceph osd pool set-quota mypool max_bytes 21474836480
set-quota max_bytes = 21474836480 for pool mypool
$ ceph osd pool set-quota mypool max_objects 1000
set-quota max_objects = 1000 for pool mypool
$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
max objects: 1 k objects
max bytes : 20 GiB

noscrub 和 nodeep-scrub:控制是否不进行轻量扫描或是否深层扫描存储池,可临时解决高 I/O 问题
$ ceph osd pool get mypool noscrub
noscrub: false #查看当前是否关闭轻量扫描数据,默认为不关闭,即开启
$ ceph osd pool set mypool noscrub true
set pool 1 noscrub to true #可以修改某个指定的 pool 的轻量级扫描测量为 true,即不执行轻量级扫描
$ ceph osd pool get mypool noscrub
noscrub: true #再次查看就不进行轻量级扫描了
$ ceph osd pool get mypool nodeep-scrub
nodeep-scrub: false #查看当前是否关闭深度扫描数据,默认为不关闭,即开启
$ ceph osd pool set mypool nodeep-scrub true
set pool 1 nodeep-scrub to true #可以修改某个指定的 pool 的深度扫描测量为 true,即不执行深度扫描
$ ceph osd pool get mypool nodeep-scrub
nodeep-scrub: true #再次查看就不执行深度扫描了
scrub_min_interval:集群存储池的最小清理时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_min_interval 参数指定间隔时间。
$ ceph osd pool get mypool scrub_min_interval
Error ENOENT: option 'scrub_min_interval' is not set on pool 'mypool' scrub_max_interval:整理存储池的最大清理时间间隔,默认值没有设置,可以通过配置文
件中的 osd_scrub_max_interval 参数指定。
$ ceph osd pool get mypool scrub_max_interval
Error ENOENT: option 'scrub_max_interval' is not set on pool 'mypool' deep_scrub_interval:深层整理存储池的时间间隔,默认值没有设置,可以通过配置文件中
的 osd_deep_scrub_interval 参数指定。
$ ceph osd pool get mypool deep_scrub_interval
Error ENOENT: option 'deep_scrub_interval' is not set on pool 'mypool' #ceph node 的默认配置:


#ceph node 的默认配置:
[root@ceph-node1 ~]# ll /var/run/ceph/
total 0
srwxr-xr-x 1 ceph ceph 0 Nov 3 12:22 ceph-osd.3.asok
srwxr-xr-x 1 ceph ceph 0 Nov 3 12:22 ceph-osd.6.asok
srwxr-xr-x 1 ceph ceph 0 Nov 3 12:23 ceph-osd.9.asok
[root@ceph-node1 ~]# ceph daemon osd.3 config show | grep scrub
"mds_max_scrub_ops_in_progress": "5", 
"mon_scrub_inject_crc_mismatch": "0.000000",
"mon_scrub_inject_missing_keys": "0.000000", 
"mon_scrub_interval": "86400", 
"mon_scrub_max_keys": "100", 
"mon_scrub_timeout": "300", 
"mon_warn_not_deep_scrubbed": "0",
"mon_warn_not_scrubbed": "0", 
"osd_debug_deep_scrub_sleep": "0.000000", 
"osd_deep_scrub_interval": "604800.000000", #定义深度清洗间隔,604800 秒=7天
"osd_deep_scrub_keys": "1024", 
"osd_deep_scrub_large_omap_object_key_threshold": "200000", 
"osd_deep_scrub_large_omap_object_value_sum_threshold": "1073741824", 
"osd_deep_scrub_randomize_ratio": "0.150000", 
"osd_deep_scrub_stride": "524288", 
"osd_deep_scrub_update_digest_min_age": "7200", 
"osd_max_scrubs": "1", #定义一个 ceph OSD daemon 内能够同时进行 scrubbing的操作数
"osd_op_queue_mclock_scrub_lim": "0.001000", 
"osd_op_queue_mclock_scrub_res": "0.000000", 
"osd_op_queue_mclock_scrub_wgt": "1.000000",
"osd_requested_scrub_priority": "120", 
"osd_scrub_auto_repair": "false", 
"osd_scrub_auto_repair_num_errors": "5", 
"osd_scrub_backoff_ratio": "0.660000", 
"osd_scrub_begin_hour": "0", 
"osd_scrub_begin_week_day": "0", 
"osd_scrub_chunk_max": "25", 
"osd_scrub_chunk_min": "5", 
"osd_scrub_cost": "52428800", 
"osd_scrub_during_recovery": "false", 
"osd_scrub_end_hour": "24", 
"osd_scrub_end_week_day": "7", 
"osd_scrub_interval_randomize_ratio": "0.500000", 
"osd_scrub_invalid_stats": "true", #定义 scrub 是否有效
"osd_scrub_load_threshold": "0.500000", 
"osd_scrub_max_interval": "604800.000000", #定义最大执行 scrub 间隔,604800秒=7 天
"osd_scrub_max_preemptions": "5", 
"osd_scrub_min_interval": "86400.000000", #定义最小执行普通 scrub 间隔,86400秒=1 天
"osd_scrub_priority": "5", "osd_scrub_sleep": "0.000000",

存储池快照

快照用于读存储池中的数据进行备份与还原,创建快照需要占用的磁盘空间会比较大,取决于存储池中的数据大小,

创建快照

$ ceph osd pool ls
#命令 1:ceph osd pool mksnap {pool-name} {snap-name}
cephadmin@deploy:~$ ceph osd pool mksnap mypool mypool-snap
created pool mypool snap mypool-snap
cephadmin@deploy:~$ rados lssnap -p mypool
1	mypool-snap	2022.12.01 14:58:22
1 snaps

#命令 2: rados -p {pool-name} mksnap {snap-name}
$ rados -p mypool mksnap mypool-snap2
created pool mypool snap mypool-snap2


快照回滚

rados rollback <obj-name> <snap-name> roll back object to snap <snap-name>
cephadmin@deploy:~$ rados -p mypool put testfile /etc/hosts
cephadmin@deploy:~$ rados -p  mypool ls
testfile
cephadmin@deploy:~$ ceph osd pool mksnap mypool mypool-snap
created pool mypool snap mypool-snap
cephadmin@deploy:~$ rados lssnap -p mypool
3	mypool-snap	2022.12.01 15:04:41
1 snaps
cephadmin@deploy:~$ rados -p mypool rm testfile
error removing mypool>testfile: (2) No such file or directory
cephadmin@deploy:~$ rados rollback -p mypool testfile mypool-snap
rolled back pool mypool to snapshot mypool-snap
cephadmin@deploy:~$ rados -p mypool rm testfile

删除快照

ceph osd pool rmsnap <poolname> <snap>
cephadmin@deploy:~$ rados lssnap -p mypool
3	mypool-snap	2022.12.01 15:04:41
1 snaps
cephadmin@deploy:~$ ceph osd pool rmsnap mypool mypool-snap
removed pool mypool snap mypool-snap
cephadmin@deploy:~$ rados lssnap -p mypool
0 snaps

数据压缩

如果使用 bulestore 存储引擎,ceph 支持称为”实时数据压缩”即边压缩边保存数据的功能,该功能有助于节省磁盘空间,可以在 BlueStore OSD 上创建的每个 Ceph 池上启用或禁用压缩,以节约磁盘空间,默认没有开启压缩,需要后期配置并开启。

开启压缩并指定压缩模式

$ ceph osd pool set <pool name> compression_algorithm snappy #默认算法为 snappy
snappy:该配置为指定压缩使用的算法默认为 sanppy,还有 none、zlib、lz4、zstd 和 snappy等算法,zstd 压缩比好,但消耗 CPU,lz4 和 snappy 对 CPU 占用较低,不建议使用 zlib。

指定压缩模式

$ ceph osd pool set <pool name> compression_mode aggressive
aggressive:压缩的模式,有 none、aggressive、passive 和 force,默认 none。
none:从不压缩数据。
passive:除非写操作具有可压缩的提示集,否则不要压缩数据。
aggressive:压缩数据,除非写操作具有不可压缩的提示集。
force:无论如何都尝试压缩数据,即使客户端暗示数据不可压缩也会压缩,也就是在所有情况下都使用压缩。
存储池压缩设置参数:
compression_algorithm #压缩算法
compression_mode #压缩模式
compression_required_ratio #压缩后与压缩前的压缩比,默认为.875
compression_max_blob_size:
#大于此的块在被压缩之前被分解成更小的 blob(块),此设置将覆盖 bluestore 压缩 max blob*的全局设置。
compression_min_blob_size:#小于此的块不压缩, 此设置将覆盖 bluestore 压缩 min blob*的全局设置。

全局压缩选项,这些可以配置到 ceph.conf 配置文件,作用于所有存储池:
bluestore_compression_algorithm #压缩算法
bluestore_compression_mode #压缩模式
bluestore_compression_required_ratio #压缩后与压缩前的压缩比,默认为.875
bluestore_compression_min_blob_size #小于它的块不会被压缩,默认 0
bluestore_compression_max_blob_size #大于它的块在压缩前会被拆成更小的块,默认 0
bluestore_compression_min_blob_size_ssd #默认 8k
bluestore_compression_max_blob_size_ssd #默认 64k
bluestore_compression_min_blob_size_hdd #默认 128k
bluestore_compression_max_blob_size_hdd #默认 512k
开启压缩
cephadmin@deploy:~$ ceph osd pool get mypool compression_algorithm
Error ENOENT: option 'compression_algorithm' is not set on pool 'mypool'
cephadmin@deploy:~$ ceph osd pool set mypool compression_algorithm snappy
set pool 3 compression_algorithm to snappy
cephadmin@deploy:~$ ceph osd pool get mypool compression_algorithm
compression_algorithm: snappy
修改模式:
cephadmin@deploy:~$ ceph osd pool set mypool compression_mode passive
set pool 3 compression_mode to passive
cephadmin@deploy:~$ ceph osd pool get mypool compression_mode
compression_mode: passive

cephx认证机制

Ceph 使用 cephx 协议对客户端进行身份认证

授权流程

1.客户端向MON请求认证
2.MON生成session key并用密钥加密后发送给客户端(秘钥是在客户 端提前配置好的/etc/ceph/ceph.client.admin.keyring)
3.客户端使用密钥解密得到session key,客户端使用session key向MON申请所需服务的tiket
4.MON节点验证session key并发送tiket
5.客户端使用tiket访问OSD
6.OSD验证tiket返回数据

访问流程

无论 ceph 客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象:

ceph 用户需要拥有存储池访问权限,才能读取和写入数据

ceph 用户必须拥有执行权限才能使用 ceph 的管理命令

ceph用户

用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。

通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池及存储池中的数据。

ceph 支持多种类型的用户,但可管理的用户都属于 client 类型区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。

通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如 client.admin

列出指定用户信息

cephadmin@deploy:~$ ceph auth get osd.0
[osd.0]
	key = AQC4Aohj0Qt3ABAAcioHYQZVETIcISL7b1LREQ==
	caps mgr = "allow profile osd"
	caps mon = "allow profile osd"
	caps osd = "allow *"
exported keyring for osd.0
cephadmin@deploy:~$ ceph auth get client.admin
[client.admin]
	key = AQAjAYhjA+VpGRAAIaEw3qdsiePEErnEhnvgAA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
exported keyring for client.admin

ceph授权和使能

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。

通用的语法格式:daemon-type ‘allow caps’ [...]

能力一览表:

r:向用户授予读取权限。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力。
w:向用户授予针对对象的写入权限。
x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能力。
*:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力
class-read:授予用户调用类读取方法的能力,属于是 x 能力的子集。
class-write:授予用户调用类写入方法的能力,属于是 x 能力的子集。
profile osd:授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告(获取 OSD 的状态信息)。
profile mds:授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限。
profile bootstrap-osd:授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授权给部署工具,使其在引导 OSD 时有权添加密钥。
profile bootstrap-mds:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥。

MON 能力:
包括 r/w/x 和 allow profile cap(ceph 的运行图)
例如:
mon 'allow rwx' 
mon 'allow profile osd

OSD 能力:
包括 r、w、x、class-read、class-write(类读取))和 profile osd(类写入),另外 OSD 能力还允许进行存储池和名称空间设置。
osd 'allow capability' [pool=poolname] [namespace=namespace-name]

MDS 能力:
只需要 allow 或空都表示允许。
mds 'allow'

用户管理

在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问 ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于 linux 系统的的/etc/passwd 文件。

cephadmin@deploy:~$ ceph auth list  #列出用户
osd.0
	key: AQC4Aohj0Qt3ABAAcioHYQZVETIcISL7b1LREQ==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
...
client.admin
	key: AQAjAYhjA+VpGRAAIaEw3qdsiePEErnEhnvgAA==
	caps: [mds] allow *
	caps: [mgr] allow *
	caps: [mon] allow *
	caps: [osd] allow *
....

注:TYPE.ID 表示法
针对用户采用 TYPE.ID 表示法,例如 osd.0 指定是 osd 类并且 ID 为 0 的用户(节点),client.admin 是 client 类型的用户,其 ID 为 admin,每个项包含一个 key=xxxx 项,以及一个或多个 caps 项。另可以结合使用-o 文件名选项和 ceph auth list 将输出保存到某个文件。
[ceph@ceph-deploy ceph-cluster]$ ceph auth list -o 123.key

添加用户

方式1:auth add <entity> {<caps> [<caps>...]}
cephadmin@deploy:~$ ceph auth add client.user1 mon 'allow r' osd 'allow rwx pool=mypool'
added key for client.user1
cephadmin@deploy:~$ ceph auth get client.user1
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool"
exported keyring for client.user1

方式2:
ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥,还可以使用 -o 指定文件名选项将输出保存到某个文件。
cephadmin@deploy:~$ ceph auth get-or-create  client.user1 mon 'allow r' osd 'allow rwx pool=mypool'
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
cephadmin@deploy:~$ ceph auth get-or-create  client.user2 mon 'allow r' osd 'allow rwx pool=mypool'
[client.user2]
	key = AQAYWoljvnl6GRAAuoYJoWd4b0fnvYI9sFJ7tw==

方式3:
ceph auth get-or-create-key,此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非常有用。如果该用户已存在,此命令只返回密钥。您可以使用 -o 文件名选项将输出保存到某个文件。
cephadmin@deploy:~$ ceph auth get-or-create-key client.user1
AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
cephadmin@deploy:~$ ceph auth get-or-create-key client.user2
AQAYWoljvnl6GRAAuoYJoWd4b0fnvYI9sFJ7tw==
cephadmin@deploy:~$ ceph auth get-or-create-key client.user3 mon 'allow r' osd 'allow rwx pool=mypool'
AQCyWoljHL9fGRAAP8gzmY3YzC7BsVNsfU3xGA==


获取用户key
cephadmin@deploy:~$ ceph auth print-key client.user1
AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==

修改用户能力

使用 ceph auth caps 命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前的能力,因此要加上之前的用户已经拥有的能和新的能力,如果看当前能力,可以运行ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式时还需要指定现有能力:
ceph auth caps USERTYPE.USERID daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]' [daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]']

cephadmin@deploy:~$ ceph auth get client.user1
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool"
exported keyring for client.user1
cephadmin@deploy:~$ ceph auth caps client.user1 mon 'allow rw' osd 'allow rwx pool=mypool'
updated caps for client.user1
cephadmin@deploy:~$ ceph auth get client.user1
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow rw"
	caps osd = "allow rwx pool=mypool"
exported keyring for client.user1

删除用户

cephadmin@deploy:~$ ceph auth del client.user3
updated
cephadmin@deploy:~$ ceph auth list

client.user1
	key: AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps: [mon] allow rw
	caps: [osd] allow rwx pool=mypool
client.user2
	key: AQAYWoljvnl6GRAAuoYJoWd4b0fnvYI9sFJ7tw==
	caps: [mon] allow r
	caps: [osd] allow rwx pool=mypool
mgr.mgr1
	key: AQDKAYhj8+gCABAAHi7/nzxWyFmyFcUz7iDc+w==
	caps: [mds] allow *
	caps: [mon] allow profile mgr
	caps: [osd] allow *

密钥环管理

ceph 的秘钥环是一个保存了 secrets、keys、certificates 并且能够让客户端通认证访问 ceph的 keyring file(集合文件),一个 keyring file 可以保存一个或者多个认证信息,每一个 key 都有一个实体名称加权限,类型为:{client、mon、mds、osd}.name

当客户端访问 ceph 集群时,ceph 会使用以下四个密钥环文件预设置密钥环设置:

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring #保存单个用户的 keyring

/etc/ceph/cluster.keyring #保存多个用户的 keyring

/etc/ceph/keyring #未定义集群名称的多个用户的 keyring

/etc/ceph/keyring.bin #编译后的二进制文件

密钥环备份和恢复用户:

使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件。

创建 keyring 文件命令格式:

ceph-authtool --create-keyring FILE

将用户信息导出至 keyring 文件,对用户信息进行备份:
cephadmin@deploy:~$ ceph-authtool --create-keyring ceph.client.user1.keyring
creating ceph.client.user1.keyring
cephadmin@deploy:~$ ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-rgw.keyring	ceph.conf
ceph.bootstrap-mgr.keyring  ceph.client.admin.keyring	ceph-deploy-ceph.log
ceph.bootstrap-osd.keyring  ceph.client.user1.keyring	ceph.mon.keyring
cephadmin@deploy:~$ cat ceph.client.user1.keyring 
cephadmin@deploy:~$ ceph auth get client.user1 -o ceph.client.user1.keyring 
exported keyring for client.user1
cephadmin@deploy:~$ cat ceph.client.user1.keyring 
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow rw"
	caps osd = "allow rwx pool=mypool"

注:在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名及keyring 来 命 名 , 并 将 其 保 存 在 /etc/ceph 目 录 中 。 例 如 为 client.user1用户创建ceph.client.user1.keyring

用户恢复

可以使用 ceph auth import -i 指定 keyring 文件并导入到 ceph,其实就是起到用户备份和恢复的目的:

cephadmin@deploy:~$ ceph auth del client.user1
updated
cephadmin@deploy:~$ ceph auth get client.user1
Error ENOENT: failed to find client.user1 in keyring
cephadmin@deploy:~$ ceph auth import -i ceph.client.user1.keyring 
imported keyring
cephadmin@deploy:~$ ceph auth get client.user1
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow rw"
	caps osd = "allow rwx pool=mypool"
exported keyring for client.user1

一个 keyring 文件中可以包含多个不同用户的认证文件。

将多用户导出至秘钥环:
cephadmin@deploy:~$ ceph-authtool --create-keyring ceph.client.user.keyring
creating ceph.client.user.keyring
cephadmin@deploy:~$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user1.keyring 
importing contents of ./ceph.client.user1.keyring into ./ceph.client.user.keyring
cephadmin@deploy:~$ cat ceph.client.user.keyring
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow rw"
	caps osd = "allow rwx pool=mypool"
cephadmin@deploy:~$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user2.keyring 
importing contents of ./ceph.client.user2.keyring into ./ceph.client.user.keyring
cephadmin@deploy:~$ cat ceph.client.user.keyring
[client.user1]
	key = AQA4WYljWSvaChAAh835cQd24CJxaMTl+gF5aQ==
	caps mon = "allow rw"
	caps osd = "allow rwx pool=mypool"
[client.user2]
	key = AQAYWoljvnl6GRAAuoYJoWd4b0fnvYI9sFJ7tw==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool"

ceph RBD使用

Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS,RBD 即RADOS Block Device 的简称,RBD 块存储是常用的存储类型之一,RBD 块设备类似磁盘可以被挂载,RBD 块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。

条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。

image-20230106152450105

实现RBD

1.创建存储池

#创建存储池
cephadmin@deploy:~$ ceph osd pool create rbd-data 32 32
cephadmin@deploy:~$ ceph osd pool ls #查看池
device_health_metrics
rbd-data
cephadmin@deploy:~$ ceph osd pool application enable rbd-data rbd #对存储池启用rbd
cephadmin@deploy:~$ rbd pool init -p rbd-data #rbd初始化

2.创建镜像

cephadmin@deploy:~$ rbd create data-img1 --size 1G --pool rbd-data --image-format 2 --image-feature layering
cephadmin@deploy:~$ rbd create data-img2 --size 1G --pool rbd-data --image-format 2 --image-feature layering
cephadmin@deploy:~$ rbd ls --pool rbd-data
data-img1
data-img2
cephadmin@deploy:~$ rbd --image data-img1 --pool rbd-data info
rbd image 'data-img1':
	size 1 GiB in 256 objects #镜像容量
	order 22 (4 MiB objects) #对象大小,每个对象2^22/1024/1024=4MB
	snapshot_count: 0 #快照
	id: 5e4df2e45565 #镜像ID
	block_name_prefix: rbd_data.5e4df2e45565 #size里面256个对象名称前缀
	format: 2 #镜像文件格式版本
	features: layering #特性 layering支持分层快照以写时复制
	op_features: 
	flags: 
	create_timestamp: Fri Jan  6 11:48:43 2023
	access_timestamp: Fri Jan  6 11:48:43 2023
	modify_timestamp: Fri Jan  6 11:48:43 2023

cephadmin@deploy:~$ rbd ls --pool rbd-data -l --format json --pretty-format
[
    {
        "image": "data-img1",
        "id": "5e4df2e45565",
        "size": 1073741824,
        "format": 2
    },
    {
        "image": "data-img2",
        "id": "5e96918f3912",
        "size": 1073741824,
        "format": 2
    }
]


其他特性
#特性简介
layering: 支持镜像分层快照特性,用于快照及写时复制,可以对 image 创建快照并保护,然后从快照克隆出新的 image 出来,父子 image 之间采用 COW 技术,共享对象数据。
striping: 支持条带化 v2,类似 raid 0,只不过在 ceph 环境中的数据被分散到不同的对象中,可改善顺序读写场景较多情况下的性能。
exclusive-lock: 支持独占锁,限制一个镜像只能被一个客户端使用。
object-map: 支持对象映射(依赖 exclusive-lock),加速数据导入导出及已用空间统计等,此特性开启的时候,会记录 image 所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速 io。
fast-diff: 快速计算镜像与快照数据差异对比(依赖 object-map)。
deep-flatten: 支持快照扁平化操作,用于快照管理时解决快照依赖关系等。
journaling: 修改数据是否记录日志,该特性可以通过记录日志并通过日志恢复数据(依赖独占锁),开启此特性会增加系统磁盘 IO 使用。

#开启特性
rbd feature enable exclusive-lock --pool rbd-data --image data-img1
#禁用特性
rbd feature disable exclusive-lock --pool rbd-data --image data-img1

3.客户端挂载

客户端安装ceph-common
[root@node1 data]#  yum install epel-release
[root@node1 data]#  yum -y install ceph-common

1.使用admin挂在
推送账户认证文件
cephadmin@deploy:~$ scp ceph.conf ceph.client.admin.keyring root@10.0.0.27:/etc/ceph/
客户端映射镜像
[root@node1 data]# rbd -p rbd-data map data-img1
[root@node2 data]# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  200G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0  100G  0 part /
├─sda3   8:3    0   50G  0 part /data
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0    2G  0 part [SWAP]
sr0     11:0    1 1024M  0 rom  
rbd0   253:0    0    1G  0 disk
格式化镜像
[root@node1 data]# mkfs.ext4 /dev/rbd0
挂载镜像
[root@node1 data]# mount /dev/rbd0 /data/rbd-data

[root@node2 data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        900M     0  900M   0% /dev
tmpfs           910M     0  910M   0% /dev/shm
tmpfs           910M  9.6M  901M   2% /run
tmpfs           910M     0  910M   0% /sys/fs/cgroup
/dev/sda2       100G  7.2G   93G   8% /
/dev/sda3        50G  237M   50G   1% /data
/dev/sda1      1014M  142M  873M  14% /boot
tmpfs           182M     0  182M   0% /run/user/0
/dev/rbd0       976M  2.6M  907M   1% /data/rbd-data

存储池空间
cephadmin@deploy:~$ ceph df
--- RAW STORAGE ---
CLASS     SIZE    AVAIL     USED  RAW USED  %RAW USED
hdd    180 GiB  180 GiB  191 MiB   191 MiB       0.10
TOTAL  180 GiB  180 GiB  191 MiB   191 MiB       0.10
 
--- POOLS ---
POOL                   ID  PGS  STORED  OBJECTS     USED  %USED  MAX AVAIL
device_health_metrics   1    1     0 B        0      0 B      0     57 GiB
rbd-data                2   32  43 MiB       33  129 MiB   0.07     57 GiB

2.使用普通账户挂载
创建普通账户
cephadmin@deploy:~$ ceph auth add client.user mon 'allow r' osd 'allow rwx pool=rbd-data'
创建密钥环
cephadmin@deploy:~$ ceph-authtool --create-keyring ceph.client.user.keyring
导出用户
cephadmin@deploy:~$ ceph auth get client.user -o ceph.client.user.keyring

客户端准备ceph-common,推送普通账户认证文件
cephadmin@deploy:~$ scp ceph.conf ceph.client.user.keyring root@10.0.0.37:/etc/ceph/
使用普通账户映射镜像
[root@node2 data]# rbd --user user -p rbd-data map data-img2
格式化镜像,挂载
[root@node2 data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        900M     0  900M   0% /dev
tmpfs           910M     0  910M   0% /dev/shm
tmpfs           910M  9.6M  901M   2% /run
tmpfs           910M     0  910M   0% /sys/fs/cgroup
/dev/sda2       100G  7.2G   93G   8% /
/dev/sda3        50G  237M   50G   1% /data
/dev/sda1      1014M  142M  873M  14% /boot
tmpfs           182M     0  182M   0% /run/user/0
/dev/rbd0       976M  2.6M  907M   1% /data/rbd-data


cephadmin@deploy:~$ rbd ls --pool rbd-data -l
NAME       SIZE   PARENT  FMT  PROT  LOCK
data-img1  1 GiB            2            
data-img2  1 GiB            2 

镜像拉伸

只建议扩展,不建议缩小

拉伸空间
cephadmin@deploy:~$ rbd resize --pool rbd-data --image data-img1 --size 3G
Resizing image: 100% complete...done.
ext4拉伸
resize2fs /dev/rbd0 #对磁盘
xfs拉伸
xfs_growfs /data #对挂载点

开机挂载

cat /etc/rc.d/rc.local
rbd --user user -p rbd-data map data-img1
mount /dev/rbd0 /data/
chmon +x /etc/rc.d/rc.local

删除镜像

取消挂载

umount /data
rbd --user user -p rbd-data unmap data-img1 #取消映射

删除镜像

从存储池删除镜像
rbd rm --pool rbd-data -image data-img1

回收站机制

镜像状态
cephadmin@deploy:~$ rbd status --pool rbd-data --image data-img1
Watchers:
	watcher=10.0.0.27:0/1097983073 client.24286 cookie=18446462598732840962
移动到回收站
rbd trash move --pool rbd-data --image data-img1
查看回收站
rbd trash list --pool rbd-data
从回收站删除
trash remove
从回收站还原
rbd trash restore --pool rbd-data --image data-img1 --image-id 5e4df2e45565

快照

rbd help snap
snap create (snap add) #创建快照
snap limit clear #清除镜像的快照数量限制
snap limit set #设置一个镜像的快照上限
snap list (snap ls) #列出快照
snap protect #保护快照被删除
snap purge #删除所有未保护的快照
snap remove (snap rm) #删除一个快照
snap rename #重命名快照
snap rollback (snap revert) #还原快照
snap unprotect #允许一个快照被删除(取消快照保护)

创建快照
cephadmin@deploy:~$ rbd snap create --pool rbd-data --image data-img1 --snap img1-snap
Creating snap: 100% complete...done
查看快照
cephadmin@deploy:~$ rbd snap list --pool rbd-data --image data-img1
SNAPID  NAME       SIZE   PROTECTED  TIMESTAMP               
     4  img1-snap  3 GiB             Fri Jan  6 16:25:52 2023

从快照还原
cephadmin@deploy:~$ rbd snap rollback --pool rbd-data --image data-img1 --snap img1-snap
Rolling back to snapshot: 100% complete...done.

删除快照
cephadmin@deploy:~$ rbd snap remove --pool rbd-data --image data-img1 --snap img1-snap
Removing snap: 100% complete...done.
cephadmin@deploy:~$ rbd snap list --pool rbd-data --image data-img1
cephadmin@deploy:~$ 

设置快照数量限制
cephadmin@deploy:~$ rbd snap limit set --pool rbd-data --image data-img1 --limit 10
清空限制
cephadmin@deploy:~$ rbd snap limit clear --pool rbd-data --image data-img1

CephFS 使用:

安装mds

root@mon1:~# apt-cache madison ceph-mds
  ceph-mds | 16.2.10-1bionic | http://mirrors.ustc.edu.cn/ceph/debian-pacific bionic/main amd64 Packages
  ceph-mds | 12.2.13-0ubuntu0.18.04.10 | http://mirrors.ustc.edu.cn/ubuntu bionic-updates/universe amd64 Packages
  ceph-mds | 12.2.13-0ubuntu0.18.04.10 | http://mirrors.ustc.edu.cn/ubuntu bionic-security/universe amd64 Packages
  ceph-mds | 12.2.4-0ubuntu1 | http://mirrors.ustc.edu.cn/ubuntu bionic/universe amd64 Packages
root@mon1:~# apt install -y ceph-mds=16.2.10-1bionic


部署
cephadmin@deploy:~$ ceph-deploy mds create mon1

创建元数据和数据池,指定
cephadmin@deploy:~$ ceph osd pool create cephfs-metadata 32 32
pool 'cephfs-metadata' created
cephadmin@deploy:~$ ceph osd pool create cephfs-data 32 32
pool 'cephfs-data' created

创建cephfs
cephadmin@deploy:~$ ceph fs new mycephfs cephfs-metadata cephfs-data
new fs with metadata pool 3 and data pool 4

查看信息
cephadmin@deploy:~$ ceph fs ls
name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
cephadmin@deploy:~$ ceph fs status mycephfs
mycephfs - 0 clients
========
RANK  STATE   MDS      ACTIVITY     DNS    INOS   DIRS   CAPS  
 0    active  mon1  Reqs:    0 /s    10     13     12      0   
      POOL         TYPE     USED  AVAIL  
cephfs-metadata  metadata  96.0k  56.8G  
  cephfs-data      data       0   56.8G  
MDS version: ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable)


状态
cephadmin@deploy:~$ ceph mds stat
mycephfs:1 {0=mon1=up:active}
cephadmin@deploy:~$ ceph -s

  cluster:
    id:     18dd9474-ffb6-46b6-a772-6fcbde26a548
    health: HEALTH_OK
 
  services:
    mon: 2 daemons, quorum mon1,mon2 (age 16m)
    mgr: mgr2(active, since 15m), standbys: mgr1
    mds: 1/1 daemons up
    osd: 9 osds: 9 up (since 15m), 9 in (since 4d)
 
  data:
    volumes: 1/1 healthy
    pools:   4 pools, 97 pgs
    objects: 71 objects, 52 MiB
    usage:   203 MiB used, 180 GiB / 180 GiB avail
    pgs:     97 active+clean


创建挂载账户
cephadmin@deploy:~$ ceph auth add client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data'
added key for client.cephfs
cephadmin@deploy:~$ ceph auth get client.cephfs
[client.cephfs]
	key = AQDe3bxj4AFsDRAASRGLru/gY6LYHaF/kE842Q==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rwx pool=cephfs-data"
exported keyring for client.cephfs
cephadmin@deploy:~$ pwd
/home/cephadmin
cephadmin@deploy:~$ ceph auth get client.cephfs -o ceph.Cient.cephfs.keyring
exported keyring for client.cephfs

准备测试

[root@centos7 ~]# yum install epel-release -y
[root@centos7 ~]# yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm
[root@centos7 ~]# yum install ceph-common -y
cephadmin@deploy:~$ scp ceph.conf ceph.client.cephfs.keyring root@10.0.0.27:/etc/ceph/
[root@centos7 ~]# ceph --user cephfs -s
  cluster:
    id:     18dd9474-ffb6-46b6-a772-6fcbde26a548
    health: HEALTH_OK
 
  services:
    mon: 2 daemons, quorum mon1,mon2 (age 22m)
    mgr: mgr2(active, since 21m), standbys: mgr1
    mds: 1/1 daemons up
    osd: 9 osds: 9 up (since 22m), 9 in (since 4d)
 
  data:
    volumes: 1/1 healthy
    pools:   4 pools, 97 pgs
    objects: 71 objects, 52 MiB
    usage:   203 MiB used, 180 GiB / 180 GiB avail
    pgs:     97 active+clean

客户端挂载有两种方式,一是内核空间一是用户空间,内核空间挂载需要内核支持 ceph 模块,用户空间挂载需要安装 ceph-fuse

内核空间挂载
挂载测试
[root@centos7 ~]#  mount -t ceph 10.0.0.28:6789:/ /data -o name=cephfs,secret=AQDe3bxj4AFsDRAASRGLru/gY6LYHaF/kE842Q== #通过key直接挂载
[root@centos7 /]#  mount -t ceph 10.0.0.28:6789:/ /data -o name=cephfs,secretfile=/etc/ceph/cephfs.key #通过key文件挂载 # cephadmin@deploy:~$ ceph auth print-key client.cephfs >cephfs.key 获取key文件
[root@centos7 /]# df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          900M     0  900M   0% /dev
tmpfs             910M     0  910M   0% /dev/shm
tmpfs             910M  9.5M  901M   2% /run
tmpfs             910M     0  910M   0% /sys/fs/cgroup
/dev/sda2         100G  1.6G   99G   2% /
10.0.0.28:6789:/   57G  4.0M   57G   1% /data
/dev/sda1        1014M  142M  873M  14% /boot
tmpfs             182M     0  182M   0% /run/user/0

开机挂载
[root@centos7 /]# vim /etc/fstab
10.0.0.28:6789:/              /data                 ceph    defaults,name=cephfs,secretfile=/etc/ceph/cephfs.key,_netdev 0 0
#或者直接使用key ,secret=AQDe3bxj4AFsDRAASRGLru/gY6LYHaF/kE842Q==
[root@centos7 /]# mount -a
、[root@centos7 ~]# df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          900M     0  900M   0% /dev
tmpfs             910M     0  910M   0% /dev/shm
tmpfs             910M  9.6M  901M   2% /run
tmpfs             910M     0  910M   0% /sys/fs/cgroup
/dev/sda2         100G  1.6G   99G   2% /
10.0.0.28:6789:/   57G  4.0M   57G   1% /data
/dev/sda1        1014M  142M  873M  14% /boot
tmpfs             182M     0  182M   0% /run/user/0

内核版本较低时使用用户空间挂载,安装ceph-fuse,用户空间挂载效率较低,不推荐使用

MDS高可用

Ceph mds(etadata service)作为 ceph 的访问入口,需要实现高性能及数据备份,其中设置2个或以上的Rank,这时有2个或以上的mds进程会分配给Rank,还有与Rank相同数量的mds分别作为备份,设置每个 Rank 的备份 MDS,也就是如果此 Rank 当前的 MDS 出现问题马上切换到另个MDS。设置备份的方法有很多,常用选项如下。

mds_standby_replay:值为 truefalsetrue 表示开启 replay 模式,这种模式下主 MDS内的数量将实时与从 MDS 同步,如果主宕机,从可以快速的切换。如果为 false 只有宕机的时候才去同步数据,这样会有一段时间的中断。
mds_standby_for_name:设置当前 MDS 进程只用于备份于指定名称的 MDS。
mds_standby_for_rank:设置当前 MDS 进程只用于备份于哪个Rank,通常为 Rank 编号。另外在存在之个CephFS文件系统中,还可以使用 mds_standby_for_fscid 参数来为指定不同的文件系统。
mds_standby_for_fscid:指定 CephFS 文件系统 ID,需要联合 mds_standby_for_rank 生效,如果设置 mds_standby_for_rank,那么就是用于指定文件系统的指定 Rank,如果没有设置,就是指定文件系统的所有 Rank。

实现

cephadmin@deploy:~$ cat ceph.conf #添加参数
mon clock drift allowed = 2
mon clock drift warn backoff = 30


[mds.mon2]
#mds_standby_for_fscid = mycephfs
mds_standby_for_name = mon1  #指定MDS
mds_standby_replay = true #开启replay

cephadmin@deploy:~$ ceph fs status
mycephfs - 1 clients
========
RANK  STATE   MDS      ACTIVITY     DNS    INOS   DIRS   CAPS  
 0    active  mon1  Reqs:    0 /s    11     14     12      1   
      POOL         TYPE     USED  AVAIL  
cephfs-metadata  metadata   167k  56.8G  
  cephfs-data      data    2532k  56.8G  
STANDBY MDS  
    mon2     
MDS version: ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable)
posted @   ——浮生——  阅读(327)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示