美文网首页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