美文网首页ceph
使用Docker快速部署Ceph集群

使用Docker快速部署Ceph集群

作者: Joncc | 来源:发表于2018-11-25 19:48 被阅读21次
  • 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 13.2.2

测试使用三台服务器:

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
docker pull ceph/daemon

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地址, 写宿主机的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

在3台服务器上部署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

查看日志

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/

https://www.ibm.com/support/knowledgecenter/en/SSNW54_1.1.2/com.ibm.kvm.v112.admin/cephbasictasks.htm

相关文章

网友评论

    本文标题:使用Docker快速部署Ceph集群

    本文链接:https://www.haomeiwen.com/subject/wucmqqtx.html