设为首页 收藏本站
查看: 1201|回复: 0

[经验分享] 使用Docker快速部署Ceph集群

[复制链接]

尚未签到

发表于 2019-2-1 14:34:09 | 显示全部楼层 |阅读模式
  一 应用场景描述
  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 ceph
0274d663099c        ceph/daemon             "/entrypoint.sh osd_d"   21 hours ago        Up 21 hours                                            osd
9d734d34bfef        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 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块设备
DSC0000.png

  块设备命令
  创建块设备映像
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
  

  

  

  

  

  

  

  

  

  

  

  

  参考文档:
  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
  

  

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-670548-1-1.html 上篇帖子: 关于ceph的一些问题及解决 下篇帖子: Openstack 之 ceph更换故障磁盘
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表