ceph 进阶
ceph集群应用基础
ceph的集群应用有如下的三个方面:
-
块设备: RBD
-
对象存储: RGW
-
文件存储: Ceph-FS
块设备RBD
RBD是块存储的一种,RBD通过librbd库和ods进行交互,rbd为kvm,k8s等云服务提供高性能和无限拓展的存储后端,这些依赖于qemu和libvirt实用程序和RBD进行集成。
创建RBD
- 创建存储pool
创建存储池,指定 pg 和 pgp 的数量,pgp是对存在于pg的数据进行组合存储,pgp 通常等于 pg 的值
cephstore@ceph-deploy:~/ceph-clusters$ ceph osd pool create myrbd 64 64
cephstore@ceph-deploy:~/ceph-clusters$ ceph osd pool ls
- 启用rbd并初始化
cephstore@ceph-deploy:~/ceph-clusters$ ceph osd pool application enable myrbd rbd
cephstore@ceph-deploy:~/ceph-clusters$ rbd pool init -p myrbd
创建并验证img
rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用
rbd 命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作,例如,下面的命令能够创建一个名为 myimg的映像
- myimg: 用于高内核版本的linux服务器挂载使用
- myimg1: 用于centos系列服务器使用
cephstore@ceph-deploy:~/ceph-clusters$ rbd create myimg --size 3G --pool myrbd
cephstore@ceph-deploy:~/ceph-clusters$ rbd create myimg1 --size 3G --pool myrbd --image-feature layering
cephstore@ceph-deploy:~/ceph-clusters$ rbd ls --pool myrbd
cephstore@ceph-deploy:~/ceph-clusters$ rbd --image myimg --pool myrbd info #查看详情
cephstore@ceph-deploy:~/ceph-clusters$ ceph df
客户端使用块存储
- 客户端安装ceph-common
[root@ceph-client-centos7 ~]# yum install epel-release
[root@ceph-client-centos7 ~]# yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm -y
[root@ceph-client-centos7 ~]# yum install ceph-common -y
- ceph-deploy同步认证文件
cephstore@ceph-deploy:~/ceph-clusters$ scp ceph.conf ceph.client.admin.keyring root@192.168.56.110:/etc/ceph/
- 客户端映射img
[root@ceph-client-centos7 ~]# rbd -p myrbd map myimg #存在异常
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd/myimg 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@ceph-client-centos7 ~]# rbd -p myrbd map myimg1
/dev/rbd0
- 客户端验证rbd
- 客户端挂载并使用
[root@ceph-client-centos7 ~]# mkdir /data/cephrbd
[root@ceph-client-centos7 ~]# mount /dev/rbd0 /data/cephrbd/
- 测试
[root@ceph-client-centos7 ~]# cd /data/cephrbd/
[root@ceph-client-centos7 cephrbd]# dd if=/dev/zero of=./file bs=1M count=200
文件存储ceph-fs(单节点)
官方文档地址: https://docs.ceph.com/en/latest/cephfs/
-
客户端可以通过ceph协议挂载此文件系统进行读写
-
需要部署和添加ceph-mds服务
-
ceph-mds服务监听在
mon服务
的6789端口 -
依靠metadata和data存储池存储元数据信息和真实数据
-
单节点部署的话存在单点故障,高可用部署在后面介绍
部署和添加MDS服务
- 找一个单独的节点配置清华源和ceph源,目前测试环境配置跟ceph-mon3复用
root@ceph-mon3:~# apt-cache madison ceph-mds
root@ceph-mon3:~# apt install ceph-mds -y
- ceph-deploy节点创建mds服务并加入集群
cephstore@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mon3
- mds状态查看: 存储池未作初始化,mds状态为standby
cephstore@ceph-deploy:~/ceph-cluster$ ceph mds stat
1 up:standby
- 创建ceph-fs的metadata和data存储池
cephstore@ceph-deploy:~/ceph-cluster$ ceph osd pool create cephfs-data 64 64
pool 'cephfs-data' created
cephstore@ceph-deploy:~/ceph-cluster$ ceph osd pool create cephfs-metadata 32 32
pool 'cephfs-metadata' created
- ceph状态查看
- 创建ceph-fs并验证
cephstore@ceph-deploy:~/ceph-cluster$ ceph fs new mycephfs cephfs-metadata cephfs-data
new fs with metadata pool 16 and data pool 15
cephstore@ceph-deploy:~/ceph-cluster$ ceph fs ls # fs查看
name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
- 状态查看
ceph fs status mycephfs
ceph -s
ceph mds stat
客户端挂载测试
- 准备centos7 和 ubuntu两个测试节点挂载ceph-fs做业务测试
- 两个客户端节点安装nginx将静态文件放到ceph-fs测试
客户端安装ceph-common
# 软件源准备
## centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release
yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm -y
yum -y install ceph-common
# ubuntu 18.04TLS
wget -q -O- 'https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc' | sudo apt-key add -
sudo echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list
sudo apt update
apt install ceph-common -y
创建客户端挂载
- 将ceph.client.admin.keyring从ceph-deploy拷贝到centos7 客户端
cephstore@ceph-deploy:~/ceph-cluster$ scp ceph.conf ceph.client.admin.keyring root@192.168.56.110:/etc/ceph/
- centos7客户端创建挂载点并挂载
[root@ceph-client-centos7 ~]# mkdir /data/nginx/static -pv
[root@ceph-client-centos7 ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz
[root@ceph-client-centos7 ~]# tar xf nginx-1.20.1.tar.gz
[root@ceph-client-centos7 ~]# cd nginx-1.20.1
[root@ceph-client-centos7 nginx-1.20.1]# yum -y install pcre pcre-devel openssl openssl-devel
[root@ceph-client-centos7 nginx-1.20.1]# ./configure --prefix=/usr/local/nginx
[root@ceph-client-centos7 nginx-1.20.1]# make && make install
## 修改nginx配置并启动
[root@ceph-client-centos7 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /data/nginx/static;
}
[root@ceph-client-centos7 ~]# /usr/local/nginx/sbin/nginx -t
[root@ceph-client-centos7 ~]# /usr/local/nginx/sbin/nginx
[root@ceph-client-centos7 ~]# mount -t ceph 10.168.56.103:6789:/ /data/nginx/static/ -o name=admin,secret=AQB2KSVhhDvaLxAAHXN/JLMikpy45KZMVtzZAw== #挂载cephfs
[root@ceph-client-centos7 ~]# echo "cephfs centos7-client" > /data/nginx/static/index.html
[root@ceph-client-centos7 ~]# curl localhost
cephfs centos7-client
- ceph-deploy作为另外的一个客户端准备挂载cephfs
cephstore@ceph-deploy:~/ceph-cluster$ sudo apt install nginx -y
cephstore@ceph-deploy:~/ceph-cluster$ sudo vim /etc/nginx/conf.d/server.conf
server {
listen 80;
server_name localhost;
location / {
root /data/nginx/static;
}
}
cephstore@ceph-deploy:~/ceph-cluster$ sudo mkdir /data/nginx/static -p
cephstore@ceph-deploy:~/ceph-cluster$ sudo mount -t ceph 10.168.56.103:6789:/ /data/nginx/static/ -o name=admin,secret=AQB2KSVhhDvaLxAAHXN/JLMikpy45KZMVtzZAw==
cephstore@ceph-deploy:~/ceph-cluster$ sudo nginx -s reload
客户端数据写入测试
- centos7 数据写入测试
[root@ceph-client-centos7 ~]# dd if=/dev/zero of=file bs=1M count=400
常用的命令总结
-
ceph -s :查看服务状态
-
ceph fs status : cephfs状态查看
-
ceph df
-
ceph osd lspools: 列出osd的存储池
-
ceph osd tree: osd与节点的对应关系
-
ceph osd status: osd状态查看
-
ceph osd dump
-
ceph osd stat
ceph集群维护
通过套接字进行单机管理
node节点:
- 查看socket文件
root@ceph-data1:~# ll /var/run/ceph/
total 0
drwxrwx--- 2 ceph ceph 100 Aug 23 21:19 ./
drwxr-xr-x 27 root root 920 Aug 23 21:19 ../
srwxr-xr-x 1 ceph ceph 0 Aug 23 21:19 ceph-osd.0.asok=
srwxr-xr-x 1 ceph ceph 0 Aug 23 21:19 ceph-osd.1.asok=
srwxr-xr-x 1 ceph ceph 0 Aug 23 21:19 ceph-osd.2.asok=
- 创建认证(ceph-deploy创建ceph-data1节点认证)
# 在ceph-data1 节点安装ceph-common
root@ceph-data1:~# apt install ceph-common -y
# ceph-deploy节点推送认证
cephstore@ceph-deploy:~/ceph-cluster$ ceph-deploy admin create ceph-data1
- 通过socket查看信息
root@ceph-data1:~# ceph --admin-socket /var/run/ceph-osd.0.asok --help
root@ceph-data1:~# ceph --admin-socket /var/run/ceph-osd.0.asok status
cluster:
id: c2221043-a745-49ed-b2b5-8326bb156f90
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mon-mgr1,ceph-mon-mgr2,ceph-mon3 (age 2h)
mgr: ceph-mon-mgr2(active, since 2h), standbys: ceph-mon-mgr1
mds: 1/1 daemons up
osd: 9 osds: 9 up (since 108m), 9 in (since 108m)
data:
volumes: 1/1 healthy
pools: 3 pools, 97 pgs
objects: 24 objects, 269 KiB
usage: 7.0 GiB used, 173 GiB / 180 GiB avail
pgs: 97 active+clean
mon&mgr节点(我这边是复用了)
- socket文件查看
root@ceph-mon-mgr1:~# ll /var/run/ceph/
total 0
drwxrwx--- 2 ceph ceph 80 Aug 23 20:46 ./
drwxr-xr-x 30 root root 1040 Aug 23 20:46 ../
srwxr-xr-x 1 ceph ceph 0 Aug 23 20:46 ceph-mgr.ceph-mon-mgr1.asok=
srwxr-xr-x 1 ceph ceph 0 Aug 23 20:46 ceph-mon.ceph-mon-mgr1.asok=
- 创建认证
# 在ceph-mon-mgr1 节点安装ceph-common
root@ceph-mon-mgr1:~# apt install ceph-common -y
# ceph-deploy节点推送认证
cephstore@ceph-deploy:~/ceph-cluster$ ceph-deploy admin create ceph-mon-mgr1
- 通过socket查看信息
root@ceph-mon-mgr1:~# ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon-mgr1.asok status
no valid command found; 10 closest matches:
0
1
2
abort
add_bootstrap_peer_hint <addr>
add_bootstrap_peer_hintv <addrv>
assert
compact
config diff
config diff get <var>
admin_socket: invalid command
}
root@ceph-mon-mgr1:~# ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon-mgr1.asok config show
ceph集群的停止或重启
- osd(3300)默认在6秒跟mon上报一次数据,20秒之后状态变更
- 集群在重启之前要将ceph的osd状态设置为noout
ceph osd set noout
- 重启完成之后将ceph的osd状态取消noout
ceph osd unset noout
关闭顺序
-
设置osd为noout
-
停止cephfs,rgw, rbd客户端
-
关闭RGW
-
关闭cephfs元数据服务
-
关闭OSD
-
关闭mgr
-
关闭mon
启动顺序
-
monitor
-
mgr
-
osd
-
RGW/cephfs元数据服务
-
存储客户端启动
-
ceph osd unset noout
ceph添加数据服务器
-
添加ceph源
-
配置ceph-deploy 与新机器ssh(cephstore用户)免密
-
ceph-deploy install --no-adjust-repos --nogpgcheck ceph-datax
-
ceph-deploy install --release pacific ceph-datax
-
擦除磁盘: ceph-deploy disk zap ceph-datax /dev/sdx
-
添加osd:ceph-deploy osd create ceph-nodex --data=/dev/sdx
ceph下线数据服务器
-
将osd剔除集群: ceph osd out osd_id
-
等待数据同步完成
-
停止ceph-osd@x进程
-
删除osd: ceph osd rm x
-
故障节点所有的osd删除
-
下线主机即可
ceph配置文件
-
默认路径:/etc/ceph/ceph.conf
-
[global] : 全局配置
-
[osd]: 专用配置
-
[mon]: 专用配置
-
[client]: 客户端配置
存储池,PG 和CRUSH
- 副本池: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 则可以支持纠删码池。
副本池IO
- 将一个数据对象存储为多个副本在客户端写入操作时,ceph 使用 CRUSH 算法计算出与对象相对应的 PG ID 和 primary OSD
- 主 OSD 根据设置的副本数、对象名称、存储池名称和集群运行图(cluster map)计算出 PG 的各辅助 OSD,然后由 OSD 将数据再同步给辅助 OSD。
读取数据流程:
\1. 客户端发送读请求,RADOS 将请求发送到主 OSD。
\2. 主 OSD 从本地磁盘读取数据并返回数据,最终完成读请求。
写入数据流程:
\1. 客户端 APP 请求写入数据,RADOS 发送数据到主 OSD。
\2. 主 OSD 识别副本 OSDs,并发送数据到各副本 OSD。 3. 副本 OSDs 写入数据,并发送写入完成信号给主 OSD。 4. 主 OSD 发送写入完成信号给客户端 APP。
纠删码IO
Ceph 从 Firefly 版本开始支持纠删码,但是不推荐在生产环境使用纠删码池。
纠删码池降低了数据保存所需要的磁盘总空间数量,但是读写数据的计算成本要比副本池高RGW 可以支持纠删码池,RBD 不支持纠删码池可以降低企业的前期 TCO 总拥有成本
纠删码写
数据将在主 OSD 进行编码然后分发到相应的 OSDs 上去。
1.计算合适的数据块并进行编码 2.对每个数据块进行编码并写入 OSD
- 创建纠删码池
cephstore@ceph-deploy:~$ ceph osd pool create erasure-testpool 16 16 erasure
- 获取默认纠删码配置
cephstore@ceph-deploy:~$ ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van
k=2 #k 为数据块的数量,即要将原始对象分割成的块数量,例如,如果 k = 2,则会将一个10kB 对象分割成各为 5kB 的 k 个对象。
m=2 #编码块(chunk)的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示有两个额外的备份,最多可以从当前 pg 中宕机 2 个 OSD,而不会丢失数据。
plugin=jerasure #默认的纠删码池插件
- 数据写入
cephstore@ceph-deploy:~$ sudo rados put -p erasure-testpool testfile1 /var/log/syslog
- 数据验证
cephstore@ceph-deploy:~$ sudo rados get -p erasure-testpool testfile1 - #直接打印
cephstore@ceph-deploy:~$ sudo rados get -p erasure-testpool testfile1 /opt/msg #存到本地文件
cephstore@ceph-deploy:~$ ceph osd map erasure-testpool testfile1 #数据块验证
cephstore@ceph-deploy:~$ ceph pg ls-by-pool erasure-testpool | awk '{print $1,$2,$15}'
纠删码读
从相应的 OSDs 中获取数据后进行解码
如果此时有数据丢失,Ceph 会自动从存放校验码的 OSD 中读取数据进行解码。
pg和pgp
PG = Placement Group #归置组
PGP = Placement Group for Placement purpose #归置组的组合,pgp 相当于是 pg 对应osd 的一种排列组合关系。
- 归置组(placement group)是用于跨越多 OSD 将数据存储在每个存储池中的内部数据结构。
- 归置组在 OSD 守护进程和 ceph 客户端之间生成了一个中间层,CRUSH 算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个 OSD 守护进程,从而能够支持在新的 OSD 设备上线时进行数据重新平衡。
-
相对于存储池来说,PG 是一个虚拟组件,它是对象映射到存储池时使用的虚拟层。可以自定义存储池中的归置组数量。
-
ceph 出于规模伸缩及性能方面的考虑,ceph 将存储池细分为多个归置组,把每个单独的对象映射到归置组,并为归置组分配一个主 OSD。
-
存储池由一系列的归置组组成,而 CRUSH 算法则根据集群运行图和集群状态,将个 PG 均匀、伪随机(基于 hash 映射,每次的计算结果够一样)的分布到集群中的 OSD 之上。
-
如果某个 OSD 失败或需要对集群进行重新平衡,ceph 则移动或复制整个归置组而不需要单独对每个镜像进行寻址
pg与pgp的关系
ceph 基于 crush 算法将归置组 PG 分配至 OSD
一般pg熟练跟pgp的数量是相等的
- 如果数据量在100G以内建议pg和pgp设置成16
- 100GT以上的话,或者更大数据量,尽量选择32,64,128…
cephstore@ceph-deploy:~$ ceph osd pool create mypool 32 32
pool 'mypool' created
cephstore@ceph-deploy:~$ ceph pg ls-by-pool mypool | awk '{print $1,$2,$15}'
pg的计算规则
首先计算磁盘有多少,官方推荐每个osd100个PG
关键因素:数据量,存储池数量,磁盘数量
官方站点: https://docs.ceph.com/en/mimic/rados/configuration/pool-pg-config-ref/
- 归置组(PG)的数量是由管理员在创建存储池的时候指定的,然后由 CRUSH 负责创建和使用,PG 的数量是 2 的 N 次方的倍数,每个 OSD 的 PG 不要超出 250 个 PG,官方是每个 OSD 100个左右
- 对于 10 个 osd、存储池为 4 个,我们建议每个存储池大约(100 * 10) / 4 = 256
- 验证pg和pgp的组合
cephstore@ceph-deploy:~$ ceph pg ls-by-pool mypool |awk '{print $1,$2,$15}'
1.通常,PG 的数量应该是数据的合理力度的子集。
例如:一个包含 256 个 PG 的存储池,每个 PG 中包含大约 1/256 的存储池数据
2.当需要将 PG 从一个 OSD 移动到另一个 OSD 的时候,PG 的数量会对性能产生影响。
PG 的数量过少,一个 OSD 上保存的数据数据会相对加多,那么 ceph 同步数据的时候产生的网络负载将对集群的性能输出产生一定影响。
PG 过多的时候,ceph 将会占用过多的 CPU 和内存资源用于记录 PG 的状态信息
3.PG 的数量在集群分发数据和重新平衡时扮演者重要的角色作用
在所有 OSD 之间进行数据持久存储以及完成数据分布会需要较多的归置组,但是他们的数量应该减少到实现 ceph 最大性能所需的最小 PG 数量值,以节省 CPU 和内存资源。
一般来说,对于有着超过 50 个 OSD 的 RADOS 集群,建议每个 OSD 大约有 50-100 个 PG以平衡资源使用及取得更好的数据持久性和数据分布,而在更大的集群中,每个 OSD 可以有 100-200 个 PG
4.至于一个 pool 应该使用多少个 PG,可以通过下面的公式计算后,将 pool 的 PG 值四舍五
入到最近的 2 的 N 次幂,如下先计算出 ceph 集群的总 PG 数:
Total OSDs * PGPerOSD/replication factor => total PGs
磁盘总数 x 每个磁盘 PG 数/副本数 => ceph 集群总 PG 数(略大于 2^n 次方)
官方的计算公式:
Total PGs = (Total_number_of_OSD * 100) / max_replication_count
5.单个 pool 的 PG 计算如下:
有 100 个 osd,3 副本,5 个 pool
Total PGs =100*100/3=3333
每个 pool 的 PG=3333/5=512,那么创建 pool 的时候就指定 pg 为 512
需要结合数据数量、磁盘数量及磁盘空间计算出 PG 数量,8、16、32、64、128、256等 2 的 N 次方。
一个 RADOS 集群上会存在多个存储池,因此管理员还需要考虑所有存储池上的 PG 分布后每个 OSD 需要映射的 PG 数量。
- 删除存储池
cephstore@ceph-deploy:~$ ceph tell mon.* injectargs --mon-allow-pool-delete=true
cephstore@ceph-deploy:~$ ceph osd pool rm erasure-testpool erasure-testpool --yes-i-really-really-mean-it
pg的状态
-
Peering:
-
Activiting:
-
Clean
-
Active
-
Degraded: 降级状态出现于 OSD 被标记为 down 以后,那么其他映射到此 OSD 的 PG 都会转换到降级状态。
-
Stale: 过期状态
-
Undersized
-
Scrubbing
-
Recovering
-
Backfilling
-
Backfilling-toofull: OSD空间不足
存储池操作
存储池的管理通常保存创建、列出、重命名和删除等操作,管理工具使用 ceph osd pool 的子命令及参数,比如 create/ls/rename/rm 等。
- 官方文档: http://docs.ceph.org.cn/rados/
常用命令
-
ceph pool create poolName pgNum pgpNum
-
ceph osd pool ls
-
ceph osd pool ls detail
-
ceph osd pool stats poolName
-
ceph osd pool get-quota mypool : 查看存储池限制
-
ceph osd pool set-quota mypool max_object 1111 max_bytes 102410241024*n (G)
-
ceph osd pool get mypool pg_num : 查看pg数量
-
rados df : 显式存储池用量信息
慎重命令:生产环境下慎重rename
- ceph osd pool rename old_pool new_pool
删除pool
如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设置了两个机制来防止误删除操作。
- ceph osd pool set mypool2 nodelete false/true
ceph tell mon.* injectargs --mon-allow-pool-delete=true
cephstore@ceph-deploy:~$ ceph osd pool rm erasure-testpool erasure-testpool --yes-i-really-really-mean-it
修改pool配额
-
ceph osd pool get mypool size #查看副本数
-
ceph osd pool set mypool size 2 #最低两个副本
-
ceph osd pool set-quota mypool max_objects 1000 #设置最大对象数量
-
ceph osd pool set-quota mypool max_bytes 1000 #设置最大容量bytes
存储池可用参数
-
ceph osd pool get mypool min_size #查看最小副本数,可以设置1,默认2
-
ceph osd pool get mypool pg_num #查看存储池的pg数量
-
ceph osd pool get mypool crush_rule #查看crush算法
-
**ceph osd pool get mypool nodelete #**控制是否可删除,默认可以
存储池快照
生产环境不推荐对pool进行快照,对性能损耗比较大,对具体存储对象做快照比较好
存储池数据压缩
生产环境不推荐压缩
数据读写流程
客户端需要在存储池中读写对象时,需要客户端将对象名称、对象名称的 hash 码、存储池中的 PG 数量和存储池名称作为输入信息提供给 ceph,然后由 CRUSH 计算出 PG 的 ID 以及此 PG 针对的主 OSD 即可读写 OSD 中的对象。
具体操作如下:
-
APP 向 ceph 客户端发送对某个对象的请求,此请求包含对象和存储池,然后 ceph 客户端对访问的对象做 hash 计算,并根据此 hash 值计算出对象所在的 PG,完成对象从 Pool 至 PG的映射
-
然后客户端据 PG、CRUSH 运行图和归置组(placement rules)作为输入参数并再次进行计算,并计算出对象所在的 PG 内的主 OSD ,从而完成对象从 PG 到 OSD 的映射。
-
客户端开始对主 OSD 进行读写请求(副本池 IO),如果发生了写操作,会有 ceph 服务端完成对象从主 OSD 到备份 OSD 的同步。
cephx认证机制
cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx
认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性
认证流程
访问流程
ceph用户
用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。
通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池及存储池中的数据。
ceph 支持多种类型的用户,但可管理的用户都属于 client 类型,区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。
用户信息获取
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth list #列出所有权限
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get osd.0 #osd权限查看
创建自定义客户端用户
- 列出用户
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth list
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth list -o all.key
- 创建账户
ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥,还可以使用 -o 指定文件名选项将输出保存到某个文件。
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth add client.test mon 'allow r' osd 'allow rwx pool=mypool'
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test #查看权限
[client.test]
key = AQCQwSdhXVRTCxAAKq0etoRsdQnhpYGmAVQBAw==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
exported keyring for client.test
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get-or-create client.test mon 'allow r' osd 'allow rwx pool=mypool' #创建账号
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get-or-create-key client.test mon 'allow r' osd 'allow rwx pool=mypool' #生产环境不建议删除用户在创建
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth print-key client.test #打印key
- 修改权限
ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth caps client.test mon 'allow r' osd 'allow rw pool=mypool'cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test
- 删除用户
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth del client.test
updated
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test
Error ENOENT: failed to find client.test in keyring
- 密钥环(keyring)管理
当客户端访问 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 #编译后的二进制文件
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get-or-create client.test mon 'allow r' osd 'allow rwx pool=mypool' #创建用户
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test
cephstore@ceph-deploy:~/ceph-clusters$ ceph-authtool --create-keyring ceph.client.test.keyring #创建keyring,空文件
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test -o ceph.client.test.keyring #导出keyring
cephstore@ceph-deploy:~/ceph-clusters$ cat ceph.client.test.keyring
- 通过keyring恢复用户
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth del client.test
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth import -i ceph.client.test.keyring #恢复数据
cephstore@ceph-deploy:~/ceph-clusters$ ceph auth get client.test
ceph实战案例与优化
- 进阶(二) : https://www.yuque.com/docs/share/c5183f10-f527-4d37-8431-3a0a2deb0168?# 《ceph进阶(二)》