一 应用场景描述
Ceph是一个开源的分布式文件系统。使用Ceph可以轻松地将存储容量扩展到PB以上并拥有不错的性能。Ceph提供对象存储、块存储和文件系统三种存储方式。如果要直接在物理机或者虚拟机上部署Ceph集群,可以使用ceph-deploy工具,也可以使用ceph-ansible。如果不想花时间安装ceph,可以通过ceph-docker来部署Ceph集群。使用Docker部署Ceph集群的一大好处就是不用为升级而烦恼,但是,如果使用yum或者apt-get的方式来升级ceph就需要解决很多依赖包的问题。
一个Ceph存储集群至少需要一个Ceph Monitor和两个OSD守护进程。但是,如果要运行Ceph文件系统客户端,那就还需要部署一个元数据服务器Metadata Server.
Ceph OSDs 负责存储数据,处理数据的的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向Ceph Monitors提供一些监控信息。
Ceph Monitors 维护者展示集群状态的各种图表
MDSs 元数据服务器,为Ceph文件系统存储元数据。Ceph块存储和Ceph对象存储不需要MDS。
Ceph把客户端的数据保存为存储池内的对象,通过CRUSH算法,Ceph可以计算出哪个PG应该持有的对象,然后进一步计算出哪个OSD守护进程持有该PG。CRUSH算法使得Ceph存储集群可以动态地伸缩、再均衡和修复。
线上环境最好不要将多个OSD守护进程部署在同一台服务器上的同一个磁盘上,也不要将Monitor或者MDS与OSD守护进程部署在同一台服务器上的同一个磁盘上。最佳的办法是将操作系统、OSD数据和OSD日志分别放在不同的磁盘上。例如,一台服务器操作系统运行在/dev/sda,OSD数据运行在/dev/sdb, OSD日志运行在/dev/sdc。
二 操作步骤
本文测试环境:
CentOS 7.3
Docker 1.12.6
测试使用三台服务器:
172.30.30.215
172.30.30.217
172.30.30.219
操作系统使用磁盘/dev/sda, Ceph OSD使用磁盘/dev/sdb
在3台服务器上执行:
#mkdir -p /etc/ceph/ /var/lib/ceph/
在215上部署Monitor:
sudo docker run -d --net=host --name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph \-e MON_IP=172.30.30.215 \-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \ceph/daemon mon
Monitor不能通过NAT网络通信,使用--net=host 暴露Docker主机网络
MON_IP 是Monitor的IP地址
MON_NAME 是Monitor的名称,默认是主机名
CEPH_PUBLIC_NETWORK 这个是Monitor所在网络的CIDR
CEPH_CLUSTER_NETWORK 这个OSD之间复制数据用到的网络,默认和CEPH_PUBLIC_NETWORK相同
这些参数都是在镜像内部的variables_entrypoint.sh中定义的
如果要增加同一个集群的Monitor的数量,需要将/etc/ceph/ 和/var/lib/ceph/bootstrap-* 这些目录下的文件复制到其他主机上,记得不要保留文件的属主权限。使用rsync -r 或者scp -r远程复制就行
#rsync -avz /etc/ceph/ root@172.30.30.217:/etc/ceph/#rsync -avz /etc/ceph/ root@172.30.30.219:/etc/ceph/#rsync -r /var/lib/ceph/bootstrap-* root@172.30.30.217:/var/lib/ceph/#rsync -r /var/lib/ceph/bootstrap-* root@172.30.30.219:/var/lib/ceph/
在217上部署Monitor:
sudo docker run -d --net=host --name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph \-e MON_IP=172.30.30.217 \-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \ceph/daemon mon
在219上部署Monitor:
sudo docker run -d --net=host --name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph \-e MON_IP=172.30.30.219 \-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \ceph/daemon mon
在3台服务器上部署OSD
按照ceph-docker git 视频中的方法使用osd_ceph_disk作为ceph/daemon参数启动OSD会失败
所有为了解决这个问题,可以先手动磁盘进行格式化并挂载后,使用osd_directory作为ceph/daemon的参数来启动OSD
# mkdir -p /ceph-rbd/# mkfs.xfs /dev/sdb -f# mount /dev/sdb /ceph-rbd/
sudo docker run -d --net=host --name=osd \--privileged=true \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph \-v /dev/:/dev/ \-v /ceph-rbd:/var/lib/ceph/osd \ceph/daemon osd_directory
都执行这些操作过后查看Docker进程
# docker ps|grep ceph0274d663099c ceph/daemon "/entrypoint.sh osd_d" 21 hours ago Up 21 hours osd9d734d34bfef ceph/daemon "/entrypoint.sh mon" 22 hours ago Up 22 hours
查看日志
#docker logs -f mon#docker logs -f osd
检查Ceph集群监控状况
在3台服务器上都查看下
# docker exec mon ceph -s cluster 96f3568a-4e57-4b5e-bf47-bea1b930dfe3 health HEALTH_OK monmap e4: 3 mons at {ceph-mon215=172.30.30.215:6789/0,ceph-osd217=172.30.30.217:6789/0,ceph-osd219=172.30.30.219:6789/0} election epoch 12, quorum 0,1,2 ceph-mon215,ceph-osd217,ceph-osd219 mgr no daemons active osdmap e18: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds,require_kraken_osds pgmap v36: 64 pgs, 1 pools, 0 bytes data, 0 objects 399 MB used, 61010 MB / 61410 MB avail 64 active+clean
可以看到整个Ceph集群为HEALTH_OK
部署完成
三 Ceph常用操作
检查集群监控状况
# docker exec mon ceph healthHEALTH_OK
观察集群内正发生的事件
# docker exec mon ceph -w
检查集群的使用情况
# docker exec mon ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 61410M 61010M 399M 0.65 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 0 0 20336M 0
检查OSD状态
# docker exec mon ceph osd stat osdmap e18: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds,require_kraken_osds
或者
# docker exec mon ceph osd dump
# docker exec mon ceph osd treeID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.05997 root default -2 0.01999 host ceph-mon215 0 0.01999 osd.0 up 1.00000 1.00000 -3 0.01999 host ceph-osd217 1 0.01999 osd.1 up 1.00000 1.00000 -4 0.01999 host ceph-osd219 2 0.01999 osd.2 up 1.00000 1.00000
查看PG
# docker exec mon ceph pg dump
# docker exec mon ceph pg statv190: 64 pgs: 64 active+clean; 0 bytes data, 399 MB used, 61010 MB / 61410 MB avail
列出存储池
# docker exec mon ceph osd lspools0 rbd,
创建存储池
# docker exec mon ceph osd pool create data 200pool 'data' created
data 是存储池的名称
200 是设置的PG数量
设置PG值:
少于5个OSD可把pg_num设置为128
OSD数量在5到10,可以设置pg_num为512
OSD数量在10到50,可以设置pg_num为4096
OSD数量大于50,需要计算pg_num的值
设置存储池最大对象数
# docker exec mon ceph osd pool set-quota data max_objects 10000set-quota max_objects = 10000 for pool data
删除存储池
# docker exec mon ceph osd pool delete data data --yes-i-really-really-mean-itError EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
如果确定要删除存储,需要将pg_name 输入两次,然后写上--yes-i-really-really-mean-it
这里有个提示,修改当前的Monitor配置文件/etc/ceph/ceph.conf
添加参数: mon_allow_pool_delete = true
然后执行 docker restart mon
# docker exec mon ceph osd pool delete data data --yes-i-really-really-mean-itpool 'data' removed
重命名存储池
# docker exec mon ceph osd pool rename data datanewpool 'data' renamed to 'datanew'
查看存储池统计信息
# docker exec mon rados df POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRAED RD_OPS RD WR_OPS WR datanew 0 0 0 0 0 0 0 0 0 0 0 rbd 0 0 0 0 0 0 0 0 0 0 0 total_objects 0total_used 420Mtotal_avail 60989Mtotal_space 61410M
拍下存储池快照
# docker exec mon ceph osd pool mksnap datanew data_snap2017created pool datanew snap data_snap2017
删除存储池快照
# docker exec mon ceph osd pool rmsnap datanew data_snap2017removed pool datanew snap data_snap2017
设置对象副本数
# docker exec mon ceph osd pool set datanew size 5
需要注意一下,一个处于降级模式的对象其副本数小于规定值的pool_size, 仍然可以接收I/O请求。为了保证I/O正常,可以设置min_size, 确保数据存储池里任何对象的副本数小于min_size都不接收I/O
# docker exec mon ceph osd pool set datanew min_size 2
获取对象副本数
# docker exec mon ceph osd dump|grep 'replicated size'pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0pool 4 'datanew' replicated size 5 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 200 pgp_num 200 last_change 36 flags hashpspool stripe_width 0
四 Ceph块设备
块设备命令
创建块设备映像
rbd create --size {megabytes} {pool-name}/{p_w_picpath-name}
创建块设备映射之前需要创建对应的存储池
# docker exec mon ceph osd pool create swimmingpool 128pool 'swimmingpool' created
在swimmingpool这个存储池中创建一个名为bar,大小为1G的映像
# docker exec mon rbd create --size 1024 swimmingpool/bar
如果创建映像时不指定存储池,它将使用默认的rbd存储池
# docker exec mon rbd create --size 1024 foo
使用rbd ls列出块设备映像
# docker exec mon rbd ls swimmingpoolbar
# docker exec mon rbd ls foo
使用rbd info检索映像信息
# docker exec mon rbd info foo # docker exec mon rbd info swimmingpool/bar
调整块设备映像大小
rbd resize --size 2048 foo (to increase)rbd resize --size 2048 foo --allow-shrink (to decrease)
删除块设备映像
# docker exec mon rbd rm foo# docker exec mon rbd rm swimmingpool/bar
映射块设备
sudo rbd map {pool-name}/{p_w_picpath-name} --id {user-name}
# rbd map foo --id adminrbd: sysfs write failedRBD p_w_picpath feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".In some cases useful info is found in syslog - try "dmesg | tail" or so.rbd: map failed: (6) No such device or address
在215上映射foo出现报错,查看日志
[8961646.895022] rbd: p_w_picpath foo: p_w_picpath uses unsupported features: 0x3c[8961670.609930] libceph: mon0 172.30.30.215:6789 session established[8961670.610894] libceph: client34098 fsid 96f3568a-4e57-4b5e-bf47-bea1b930dfe3[8961670.633265] rbd: p_w_picpath foo: p_w_picpath uses unsupported features: 0x3c
出现这个报错的原因是和Linux内核版本和rbd映像格式有关
rbd支持两种镜像格式 --p_w_picpath-format
format 1 已经弃用, 为一个新的镜像使用原始的格式。这个格式可以被所有的librbd版本和内核rbd模块所理解,但是不支持最新的特性
format 2 rbd格式第二版,被librbd和3.1内核版本以上支持。这个格式支持克隆,在将来更容易扩展支持更多的特性
--p_w_picpath-feature 可以指定rbd format2特性启用或者禁用
rbd format2 支持的属性有
layering BIT码为1
striping BIT码为2
exclusive-lock BIT码为4
object-map BIT码为8
fast-diff BIT码为16
deep-flatten BIT码为32
查看当前ceph集群版本支持的rbd 的属性
# ceph --show-config|grep rbd|grep featuresrbd_default_features = 61
61=32+16+8+4+1 即默认支持layering,exclusive-lock,object-map,fast-diff,deep-flatten
前面的报错中显示不支持的代号是0x3c, 这是十六进制,换算成10进制就是60。也就是不支持后面4种特性
查看当前使用的镜像属性
# rbd info foorbd p_w_picpath 'foo': size 1024 MB in 256 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.855f2ae8944a format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags:
可以关闭后面4个特性
# rbd feature disable rbd/foo exclusive-lock, object-map, fast-diff, deep-flatten
再挂载试试
# rbd map rbd/foo /dev/rbd0
挂载成功
再查看foo的特性
# rbd info foorbd p_w_picpath 'foo': size 1024 MB in 256 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.855f2ae8944a format: 2 features: layering flags:
发现只有一个laytering特性了。
这样每次创建一个镜像都这样启动和关闭特性比较麻烦,可以修改ceph.conf文件
rbd_default_features = 3
不用重启Monitor或者OSD
参考文档: