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。
二 操作步骤
本文测试环境:
Ubuntu 18.04.1 LTS
Docker version 18.06.1-ce
ceph version 14.2.9 (581f22da52345dba46ee232b73b990f06029a2a0) nautilus (stable)
测试使用三台服务器:
172.30.30.215
172.30.30.217
172.30.30.219
操作系统使用磁盘/dev/sda, Ceph OSD使用磁盘/dev/sdb
在3台服务器上执行:
apt install docker
apt install docker.io
systemctl start docker
x86: docker pull ceph/daemon:master-22b99b7-nautilus-centos-7-x86_64
arm: docker pull ceph/daemon:master-59450b6-nautilus-centos-7-aarch64
mkdir -p /etc/ceph/ /var/lib/ceph/
关掉selinux
vi /etc/selinux/config
SELINUX=disabled
重启
部署mon
在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
验证
[root@node70~]# docker exec mon ceph -s
cluster:
id: f1182348-e4c8-411e-ab4d-96b3e3769c70
health: HEALTH_OK
services:
mon: 1 daemons, quorum node70 (age 4m)
mgr: no daemons active
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:
- Monitor不能通过NAT网络通信,使用--net=host 暴露Docker主机网络;
- MON_IP 是Monitor的IP地址, 写宿主机的ip;
- MON_NAME 是Monitor的名称,默认是主机名;
- CEPH_PUBLIC_NETWORK 这个是Monitor所在网络的CIDR ,这里也写宿主机的;
- CEPH_CLUSTER_NETWORK 这个OSD之间复制数据用到的网络,默认和CEPH_PUBLIC_NETWORK相同;
- ceph/daemon mon 这个ceph/daemon是images;
- 这些参数都是在镜像内部的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
部署OSD
ceph 10.2 之前版本
按照ceph-docker git 视频中的方法使用osd_ceph_disk作为ceph/daemon参数启动OSD会失败
所以为了解决这个问题,可以先手动磁盘进行格式化并挂载后,使用osd_directory作为ceph/daemon的参数来启动OSD
mkdir -p /ceph-osd/
mkfs.xfs /dev/sdb -f
mount /dev/sdb /ceph-osd/
创建osd
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-osd:/var/lib/ceph/osd \
ceph/daemon osd_directory
ceph12.2.x之后版本,这里用的是 ceph 13.2
sudo docker run -d --net=host --name=myosd1 \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /dev/:/dev/ \
-e OSD_DEVICE=/dev/sdb \
ceph/daemon osd_ceph_disk
- OSD_DEVICE=/dev/sdb 根据实际情况写空磁盘的位置.
都执行这些操作过后查看Docker进程
Ceph RGW节点安装
说明
RGW为Rados Gateway的缩写,ceph通过RGW为互联网云服务提供商提供对象存储服务。RGW在librados之上向应用提供访问ceph集群的RestAPI, 支持Amazon S3和openstack swift两种接口。对RGW最直接的理解就是一个协议转换层,把从上层应用符合S3或Swift协议的请求转换成rados的请求, 将数据保存在rados集群中。
命令
docker run \
-d --net=host \
--name=rgw \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
ceph/daemon rgw
docker exec rgw ss -ntul
[root@node /data]# curl http://127.0.0.1:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
Ceph Mgr节点安装
说明
ceph-mgr 作为 Ceph 集群的管理进程,未来会负责整个集群的管理操作和监控。现在的部分 Monitor 功能会迁移到 ceph-mgr 中,使得 Monitor 更专注于集群的数据面控制,降低集群对于 Monitor 的要求。
在12.2版本以后的版本,mgr已成为标配,不安装成功的话,集群状态会WARN。
命令
在所有mon安装过的节点上运行以下命令:
docker run \
-d --net=host \
--name=mgr \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
ceph/daemon mgr
检查Mgr是否成功启动
docker ps -a|grep mgr
docker exec -it mon ceph -s
cluster:
id: 67dac7c2-a620-4e9a-bf06-d0b13a1f2b55
health: HEALTH_OK
services:
mon: 1 daemons, quorum node
mgr: node(active)
osd: 1 osds: 1 up, 1 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 2.0 GiB used, 17 GiB / 19 GiB avail
pgs:
注意细节
一,如果这里安装异常,或是7000端口未启用,要启用dashboard组件功能。
docker exec mon ceph mgr dump
docker exec mgr ceph mgr module enable dashboard
docker ps |grep ceph
e76f92c38da8 ceph/daemon "/entrypoint.sh osd_…" 4 minutes ago Up 4 minutes myosd1
77396ce279f3 ceph/daemon "/entrypoint.sh mon" About an hour ago Up 15 minutes
mimic版 (nautilus版) dashboard 安装
1、开启dashboard 功能
docker exec mgr ceph mgr module enable dashboard
2、创建证书
docker exec mgr ceph dashboard create-self-signed-cert
3、创建 web 登录用户密码
docker exec mgr ceph dashboard set-login-credentials {user-name} {password}
4 配置端口:mgr dashboard
ceph config set mgr mgr/dashboard/server_addr $IP
ceph config set mgr mgr/dashboard/server_port $PORT
5 关闭https
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
6 重启
docker restart mgr
7、查看服务访问方式
docker exec mgr ceph mgr services
访问:
curl http://$ip:$prot
查看日志
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
部署完成
碰上问题想修改image
我们看下我们运行的docker
[root@lab8106 ceph]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
874d78ccae55 ceph/daemon "/entrypoint.sh osd_c" 14 hours ago Up 14 hours myosd1
86ed05173432 ceph/daemon "/entrypoint.sh mon" 15 hours ago Up 15 hours mon
COMMAND这里有个/entrypoint.sh
如果存在ENTRYPOINT和CMD,那么CMD就是ENTRYPOINT的参数,如果没有ENTRYPOINT,则CMD就是默认执行指令
也就是容器启动的时候默认是会去执行/entrypoint.sh 这个了
我们不需要他执行这个,就需要加参数了
[root@lab8106 ceph]# docker run -i -t --entrypoint /bin/bash ceph/daemon
比如我上次做的一个操作,把ceph用户绑定到root的id
root@9b269bf751f9:/# cat /etc/passwd|grep ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/bin/false
root@9b269bf751f9:/# sed -i 's/64045/0/g' /etc/passwd
root@9b269bf751f9:/# cat /etc/passwd|grep ceph
ceph:x:0:0:Ceph storage service:/var/lib/ceph:/bin/false
退出容器
root@9b269bf751f9:/# exit
查询我们最后运行的容器,修改回entrypoint我们再把容器修改提交到基础image
[root@lab8106 ceph]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b269bf751f9 ceph/daemon "/bin/bash" 2 minutes ago Exited (0) 15 seconds ago angry_hawking
[root@lab8106 ~]# docker run -i -t --entrypoint /entrypoint.sh ceph/daemon
[root@lab8106 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2ea602c18ac ceph/daemon "/entrypoint.sh" 10 seconds ago Exited (1) 7 seconds ago ecstatic_bartik
[root@lab8106 ceph]# docker commit c2ea602c18ac ceph/daemon
再次启动容器,并且检查内容,可以看到已经修改好了
[root@lab8106 ceph]# docker run -i -t --entrypoint /bin/bash ceph/daemon
root@65b538fdc61e:/# cat /etc/passwd|grep ceph
ceph:x:0:0:Ceph storage service:/var/lib/ceph:/bin/false
如果需要做其他的改动,这样改下就行
三 Ceph常用操作
检查集群监控状况
docker exec mon ceph health
HEALTH_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 tree
ID 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 stat
v190: 64 pgs: 64 active+clean; 0 bytes data, 399 MB used, 61010 MB / 61410 MB avail
列出存储池
docker exec mon ceph osd lspools
0 rbd,
创建存储池
docker exec mon ceph osd pool create data 200
pool '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 10000
set-quota max_objects = 10000 for pool data
删除存储池
docker exec mon ceph osd pool delete data data --yes-i-really-really-mean-it
Error 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-it
pool 'data' removed
重命名存储池
docker exec mon ceph osd pool rename data datanew
pool '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 0
total_used 420M
total_avail 60989M
total_space 61410M
拍下存储池快照
docker exec mon ceph osd pool mksnap datanew data_snap2017
created pool datanew snap data_snap2017
删除存储池快照
docker exec mon ceph osd pool rmsnap datanew data_snap2017
removed 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 0
pool 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块设备
ditaa-dc9f80d771b55f2daa5cbbfdb2dd0d3e6d
块设备命令
创建块设备映像
rbd create --size {megabytes} {pool-name}/{image-name}
```
创建块设备映射之前需要创建对应的存储池
docker exec mon ceph osd pool create swimmingpool 128
pool '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 swimmingpool
bar
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}/{image-name} --id {user-name}
rbd map foo --id admin
rbd: sysfs write failed
RBD image 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: image foo: image 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: image foo: image uses unsupported features: 0x3c
出现这个报错的原因是和Linux内核版本和rbd映像格式有关
rbd支持两种镜像格式 --image-format
format 1 已经弃用, 为一个新的镜像使用原始的格式。这个格式可以被所有的librbd版本和内核rbd模块所理解,但是不支持最新的特性
format 2 rbd格式第二版,被librbd和3.1内核版本以上支持。这个格式支持克隆,在将来更容易扩展支持更多的特性
--image-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 features
rbd_default_features = 61
61=32+16+8+4+1 即默认支持layering,exclusive-lock,object-map,fast-diff,deep-flatten
前面的报错中显示不支持的代号是0x3c, 这是十六进制,换算成10进制就是60。也就是不支持后面4种特性
查看当前使用的镜像属性
rbd info foo
rbd image '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 foo
rbd image '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
参考文档:
http://blog.51cto.com/john88wang/1947672
https://github.com/ceph/ceph-docker
https://github.com/ceph/ceph-ansible
https://github.com/ceph/ceph-deploy
http://www.sebastien-han.fr/blog/2013/09/19/how-I-barely-got-my-first-ceph-mon-running-in-docker/
http://ceph.org.cn/2016/05/02/%E5%9C%A8docker%E9%87%8C%E8%BF%90%E8%A1%8Cceph%E9%9B%86%E7%BE%A4/
http://docs.ceph.org.cn/rados/operations/crush-map/?highlight=crush
http://www.dockerinfo.net/445.html
http://www.dockerinfo.net/4440.html
https://www.youtube.com/embed/FUSTjTBA8f8
http://docs.ceph.org.cn/rados/operations/placement-groups/
http://www.zphj1987.com/2016/06/07/rbd%E6%97%A0%E6%B3%95map-rbd-feature-disable/