当前位置:   article > 正文

Ceph RBD 部署与管理

部署ceph rbd

RBD 介绍

RBD块存储是ceph提供的3种存储类型中使用最广泛,最稳定的存储类型。RBD块类似于磁盘,可以挂载到物理机或虚拟机中,通常的挂载方式有两种:

  • Kernel模块(KRBD)
  • 利用QEMU模拟器通过LIBRBD方式

块是一个有序字节,普通的一个块大小为512字节。基于块存储是最常见的方式,常见的硬盘、软盘和CD光驱等都是存储数据最简单快捷的设备。

在物理机上提供块设备时,使用的是Kernel的RBD模块,基于内核模块驱动时,可以使用Linux自带的页缓存(Page Caching)来提高性能。
当在虚拟机(比如QUEM/KVM)提供块设备时,通常是使用LIBVIRT调用librbd库的方式提供块设备。

部署RBD

在部署之前,需要检查内核版本,看是否支持RBD,建议升级到4.5以上版本内核

  1. [root@local-node-1 ~]# uname -r
  2. 4.4.174-1.el7.elrepo.x86_64
  3. [root@local-node-1 ~]# modprobe rbd
一. 初始化集群
  1. 在部署RBD之前,需要先部署一个Ceph 集群,集群状态如下:
  1. [root@local-node-1 ~]# ceph -s
  2. cluster:
  3. id: 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
  4. health: HEALTH_OK
  5. services:
  6. mon: 2 daemons, quorum local-node-2,local-node-3
  7. mgr: ceph-mgr(active)
  8. osd: 9 osds: 9 up, 9 in
  9. data:
  10. pools: 0 pools, 0 pgs
  11. objects: 0 objects, 0 B
  12. usage: 9.2 GiB used, 81 GiB / 90 GiB avail
  13. pgs:
  14. [root@local-node-1 ~]# ceph osd tree
  15. ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
  16. -1 0.08817 root default
  17. -3 0.02939 host local-node-1
  18. 0 hdd 0.00980 osd.0 up 1.00000 1.00000
  19. 1 hdd 0.00980 osd.1 up 1.00000 1.00000
  20. 2 hdd 0.00980 osd.2 up 1.00000 1.00000
  21. -5 0.02939 host local-node-2
  22. 3 hdd 0.00980 osd.3 up 1.00000 1.00000
  23. 4 hdd 0.00980 osd.4 up 1.00000 1.00000
  24. 5 hdd 0.00980 osd.5 up 1.00000 1.00000
  25. -7 0.02939 host local-node-3
  26. 6 hdd 0.00980 osd.6 up 1.00000 1.00000
  27. 7 hdd 0.00980 osd.7 up 1.00000 1.00000
  28. 8 hdd 0.00980 osd.8 up 1.00000 1.00000
  1. 初始pool
  1. ceph osd pool create ceph_rbd 128
  2. rbd pool init ceph_rbd
  1. 创建一个块存储的用户:
  1. ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]'
  2. EG:
  3. # ceph auth get-or-create client.docker mon 'profile rbd' osd 'profile rbd pool=ceph_rbd, profile rbd-read-only pool=images'
  4. [client.docker]
  5. key = AQDQkK1cpNAKJRAAnaw2ZYeFHsXrsTWX3QonkQ==
  1. 添加此用户文件到配置目录
  1. [root@local-node-1 ~]# cat /etc/ceph/ceph.client.docker.keyring
  2. [client.docker]
  3. key = AQDQkK1cpNAKJRAAnaw2ZYeFHsXrsTWX3QonkQ==
二. 创建块设备镜像
  1. 创建一个指定大小的块设备镜像,这里的size单位为M。 ==在下面的所有命令中,如果不指定pool默认操作名为rbd的pool==
  1. rbd create --size {megabytes} {pool-name}/{image-name}
  2. eg:
  3. [root@local-node-1 ~]# rbd create --size 1024 ceph_rbd/docker_image
  1. 查看创建的镜像
  1. [root@local-node-1 ~]# rbd ls ceph_rbd
  2. docker_image
  1. 列出rbd池中将要延迟删除块设备
[root@local-node-1 ~]# rbd trash ls ceph_rbd
  1. 检索镜像的信息:
  1. [root@local-node-1 ~]# rbd info ceph_rbd/docker_image
  2. rbd image 'docker_image':
  3. size 1 GiB in 256 objects
  4. order 22 (4 MiB objects)
  5. id: 1bedc6b8b4567
  6. block_name_prefix: rbd_data.1bedc6b8b4567
  7. format: 2
  8. features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
  9. op_features:
  10. flags:
  11. create_timestamp: Wed Apr 10 14:52:48 2019
  1. 如果有需要,可以给镜像扩容或者缩容
  1. # 扩容
  2. [root@local-node-1 ~]# rbd resize --size 2048 ceph_rbd/docker_image
  3. Resizing image: 100% complete...done.
  4. # 缩容
  5. [root@local-node-1 ~]# rbd resize --size 1024 ceph_rbd/docker_image --allow-shrink
  6. Resizing image: 100% complete...done.

Ceph的块镜像设备是精简配置,在创建他们并指定大小时并不会使用物理存储空间,直到存储数据。但是它们可以通过--size指定最大容量的限制。

  1. 删除块设备镜像
 rbd rm ceph_rbd/docker_image
  1. 可以将暂时不用的镜像移入trash
  1. # rbd trash mv ceph_rbd/docker_image
  2. # rbd trash ls ceph_rbd
  3. 1beb76b8b4567 docker_image
  1. 如果要恢复trash中的镜像可以执行如下命令:
  1. rbd trash restore ceph_rbd/1beb76b8b4567
  2. # 此时trash中将不会有数据,原来的镜像已经恢复
  3. # rbd ls ceph_rbd
  4. docker_image
  1. 如果要在恢复的时候重命名镜像,执行如下命令:
rbd trash restore ceph_rbd/1beb76b8b4567 --image docker # 将镜像重命名为docker
  1. 删除trash中的镜像,需要使用镜像的ID
rbd trash rm ceph_rbd/1beb76b8b4567

提示:

  • 即使这个镜像存在快照,或者它自身某一个克隆正在被使用,都可以将镜像移入trash,但是不能从trash中删除。
  • 如果想要删除,可以使用-expires-at设置延迟时间(默认为now),如果延迟时间尚未到期,则除非使用-force,否则无法删除
三. 使用内核模块映射RBD
  1. 检查集群版本和可调参数版本:
  1. # 在内核版本为4.5以下的,建议使用hammer,否则会出现无法映射rbd的情况
  2. [root@local-node-1 ~]# ceph osd crush show-tunables
  3. {
  4. "choose_local_tries": 0,
  5. "choose_local_fallback_tries": 0,
  6. "choose_total_tries": 50,
  7. "chooseleaf_descend_once": 1,
  8. "chooseleaf_vary_r": 1,
  9. "chooseleaf_stable": 0,
  10. "straw_calc_version": 1,
  11. "allowed_bucket_algs": 54,
  12. "profile": "hammer",
  13. "optimal_tunables": 0,
  14. "legacy_tunables": 0,
  15. "minimum_required_version": "hammer",
  16. "require_feature_tunables": 1,
  17. "require_feature_tunables2": 1,
  18. "has_v2_rules": 0,
  19. "require_feature_tunables3": 1,
  20. "has_v3_rules": 0,
  21. "has_v4_buckets": 1,
  22. "require_feature_tunables5": 0,
  23. "has_v5_rules": 0
  24. }
  25. # 设置版本
  26. [root@local-node-1 ~]# ceph osd crush tunables hammer
  1. 查看当前存在的镜像
  1. [root@local-node-1 ~]# rbd list ceph_rbd
  2. docker_image

3.在客户端映射块设备(需要安装ceph)

  1. [root@local-node-1 ~]# rbd device map ceph_rbd/docker_image --id admin
  2. /dev/rbd0

==提示:==
如果在执行映射步骤时出现以下报错,说明当前内核rbd的一些特性并不支持,需要禁用某些特性:

  1. # rbd device map ceph_rbd/docker_image --id admin
  2. rbd: sysfs write failed
  3. RBD image feature set mismatch. Try disabling features unsupported by the kernel with "rbd feature disable".
  4. In some cases useful info is found in syslog - try "dmesg | tail".
  5. rbd: map failed: (6) No such device or address

禁用特性:

# rbd feature disable ceph_rbd/docker_image exclusive-lock, object-map, fast-diff, deep-flatten
  1. 如果设置了密钥认证策略,在映射的时候需要指定密钥,可以是指定keyring文件,也可以是单独保存密钥的文件:
  1. sudo rbd device map rbd/myimage --id admin --keyring /path/to/keyring
  2. sudo rbd device map rbd/myimage --id admin --keyfile /path/to/file
  3. eg:
  4. #rbd device map ceph_rbd/docker_image --id docker --keyring /etc/ceph/ceph.client.docker.keyring
  5. /dev/rbd0
  1. 查看映射的块存储
  1. [root@local-node-1 ~]# rbd device list
  2. id pool image snap device
  3. 0 ceph_rbd docker_image - /dev/rbd0
  4. [root@local-node-1 ~]# lsblk | grep rbd
  5. rbd0 252:0 0 1G 0 disk
  1. 使用rbd块存储
  1. [root@local-node-1 ~]# mkfs.xfs /dev/rbd
  2. [root@local-node-1 ~]# mount /dev/rbd0 /mnt

7 . 如果要卸载设备使用如下命令:

  1. [root@local-node-1 ~]# umount /mnt/
  2. [root@local-node-1 ~]# rbd device unmap /dev/rbd0

RBD的特性

当挂载的rbd 被卸载掉之后,块设备中的数据一般情况下不会丢失(强制重启后可能会损坏数据从而不可用),可以重新挂载到另一个主机上。

RBD支持复制,快照和在线扩容等功能。

RBD 快照

快照是映像在某个特定时间点的一份==只读副本==。 Ceph 块设备的一个高级特性就是你可以为映像创建快照来保留其历史。 Ceph 还支持分层快照,让你快速、简便地克隆映像(如 VM 映像)。 Ceph 的快照功能支持 rbd 命令和多种高级接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack 。

如果在做快照时映像仍在进行 I/O 操作,快照可能就获取不到该映像准确的或最新的数据,并且该快照可能不得不被克隆到一个新的可挂载的映像中。所以,我们建议在做快照前先停止 I/O 操作。如果映像内包含文件系统,在做快照前请确保文件系统处于一致的状态或者使用fsck命令先检查挂载的块设备。要停止 I/O 操作可以使用 fsfreeze 命令。 对于虚拟机,qemu-guest-agent 被用来在做快照时自动冻结文件系统。

  1. 检查文件系统,在创建快照前冻结IO操作(fsfreeze的更多操作参考: https://blog.pythian.com/fsfreeze-in-linux/),==执行此命令之后所有对此目录文件的操作都会hang住==
fsfreeze -f /mnt
  1. 创建快照:
  1. rbd snap create rbd/foo@snapname
  2. EG:
  3. rbd snap create rbd/test@test-snap
  1. 快照创建成功后解除IO冻结
 fsfreeze -u /mnt/
  1. 查看快照
  1. [root@local-node-1 ~]# rbd snap ls rbd/test
  2. SNAPID NAME SIZE TIMESTAMP
  3. 4 test-snap 1 GiB Tue Apr 16 14:49:27 2019
  4. 5 test-snap-2 1 GiB Tue Apr 16 15:56:18 2019
  1. 回滚,回滚后的镜像会保留之前的快照数据,但是它是只读的,不能对其进行写入和删除操作。
 rbd snap rollback rbd/test@test-snap
  1. 对于挂载的磁盘,需要卸载后重新挂载,如果挂载出现如下错误:
  1. # mount /dev/rbd0 /mnt/
  2. mount: wrong fs type, bad option, bad superblock on /dev/rbd0,
  3. missing codepage or helper program, or other error
  4. In some cases useful info is found in syslog - try
  5. dmesg | tail or so.
  6. # 当使用xfs_repair修复时出现如下报错:
  7. xfs_repair /dev/rbd0
  8. Phase 1 - find and verify superblock...
  9. Phase 2 - using internal log
  10. - zero log...
  11. ERROR: The filesystem has valuable metadata changes in a log which needs to
  12. be replayed. Mount the filesystem to replay the log, and unmount it before
  13. re-running xfs_repair. If you are unable to mount the filesystem, then use
  14. the -L option to destroy the log and attempt a repair.
  15. Note that destroying the log may cause corruption -- please attempt a mount
  16. of the filesystem before doing this.
  17. # 使用-L 参数修复:
  18. xfs_repair -L /dev/rbd0
  1. 挂载后的文件,系统依然是只读的。
mount /dev/rbd0 /mnt/
  1. 如果要删除快照,执行如下命令:
  1. rbd snap rm rbd/test@test-snap
  2. # 如果要删除一个映像的所有快照,执行:
  3. rbd snap purge rbd/foo
RBD 复制

Ceph 可以从快照中克隆写时复制副本,由于快照是只读的,当需要对文件进行修改时,我们可以使用快照创建一个写时复制的副本。(Openstack中,使用这种机制创建新的虚拟机,通常使用快照保存镜像,复制这个快照创建新的虚拟机)

Ceph 仅支持克隆 format 2 的映像(即用 rbd create --image-format 2 创建的,这个在新版中是默认的)。内核客户端从 3.10 版开始支持克隆的映像

具体的流程如下:

创建块设备映像-->创建快照-->保护快照-->克隆快照
  1. 保护快照。克隆映像要访问父快照。如果用户不小心删除了父快照,所有克隆映像都会损坏。为防止数据丢失,在克隆前必须先保护快照:
  1. # 创建快照
  2. rbd snap create rbd/test@test-snap
  3. #列出快照
  4. # rbd snap list rbd/test
  5. SNAPID NAME SIZE TIMESTAMP
  6. 10 test-snap 1 GiB Tue Apr 16 17:46:48 2019
  7. # 保护快照,这样就无法被删除了
  8. rbd snap protect rbd/test@test-snap
  1. 克隆快照,需要指定父存储池,父映像名和快照,子存储池和子镜像名,可以指定不同的存储池:
  1. rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
  2. EG:
  3. rbd clone rbd/test@test-snap rbd/test-new

查看新创建的镜像:

  1. # rbd ls
  2. test
  3. test-new
  1. 取消快照保护
rbd snap unprotect rbd/test@test-snap
  1. 查看快照的生成的子镜像
  1. # rbd children rbd/test@test-snap
  2. rbd/test-new
  3. [root@local-node-1 ~]# rbd --pool rbd --image test-new info
  4. rbd image 'test-new':
  5. size 1 GiB in 256 objects
  6. order 22 (4 MiB objects)
  7. id: ba9096b8b4567
  8. block_name_prefix: rbd_data.ba9096b8b4567
  9. format: 2
  10. features: layering
  11. op_features:
  12. flags:
  13. create_timestamp: Tue Apr 16 17:53:51 2019
  14. parent: rbd/test@test-snap # 此处显示了父快照等关联信息
  15. overlap: 1 GiB
  1. 扁平化镜像,使它和父镜像脱离依赖关联,防止父镜像改动后对新镜像产生影响:
rbd flatten rbd/test-new
  1. 此时,新生成的镜像就可以任意读写了。
RBD在线扩容
  1. 对已经挂载的rbd进行扩容:
  1. # rbd resize ceph_rbd/docker_image --size 4096
  2. Resizing image: 100% complete...done.
  1. 查看扩容后的状态:
  1. # rbd info ceph_rbd/docker_image
  2. rbd image 'docker_image':
  3. size 4 GiB in 1024 objects
  4. order 22 (4 MiB objects)
  5. id: 1bef96b8b4567
  6. block_name_prefix: rbd_data.1bef96b8b4567
  7. format: 2
  8. features: layering
  9. op_features:
  10. flags:
  11. create_timestamp: Wed Apr 10 15:50:21 2019
  1. 检查客户机上的容量是否被内核所接受:
  1. # xfs_growfs -d /mnt
  2. meta-data=/dev/rbd0 isize=512 agcount=9, agsize=31744 blks
  3. = sectsz=512 attr=2, projid32bit=1
  4. = crc=1 finobt=0 spinodes=0
  5. data = bsize=4096 blocks=262144, imaxpct=25
  6. = sunit=1024 swidth=1024 blks
  7. naming =version 2 bsize=4096 ascii-ci=0 ftype=1
  8. log =internal bsize=4096 blocks=2560, version=2
  9. = sectsz=512 sunit=8 blks, lazy-count=1
  10. realtime =none extsz=4096 blocks=0, rtextents=0
  11. data blocks changed from 262144 to 1048576
  12. # lsblk | grep mnt
  13. rbd0 252:0 0 4G 0 disk /mnt
  1. 直接上传超过1G的文件,发现xfs文件系统已经自动扩容了:
  1. # df -h | grep mnt
  2. /dev/rbd0 4.0G 3.1G 998M 76% /mnt
RBD 在线缩容 (作死操作,仅用于测试)
  1. 在执行缩容操作时,确认有足够的空余空间,否则可能会丢失数据:
  1. # rbd resize --size 2048 ceph_rbd/docker_image --allow-shrink
  2. Resizing image: 100% complete...done.
  1. 查看缩容后的挂载盘:
  1. # lsblk |grep mnt
  2. rbd0 252:0 0 2G 0 disk /mnt
  3. # xfs_growfs -d /mnt/
  4. meta-data=/dev/rbd0 isize=512 agcount=34, agsize=31744 blks
  5. = sectsz=512 attr=2, projid32bit=1
  6. = crc=1 finobt=0 spinodes=0
  7. data = bsize=4096 blocks=1048576, imaxpct=25
  8. = sunit=1024 swidth=1024 blks
  9. naming =version 2 bsize=4096 ascii-ci=0 ftype=1
  10. log =internal bsize=4096 blocks=2560, version=2
  11. = sectsz=512 sunit=8 blks, lazy-count=1
  12. realtime =none extsz=4096 blocks=0, rtextents=0
  13. data size 524288 too small, old size is 1048576
  1. 不建议这样操作。
RBD 卸载

==如果要卸载RBD,存放的数据会丢失。==

  1. 卸载磁盘,取消映射
  1. [root@local-node-3 mnt]# df -h | grep mnt
  2. ...
  3. /dev/rbd0 2.0G 33M 2.0G 2% /mnt
  4. [root@local-node-3 ~]# rbd device list
  5. id pool image snap device
  6. 0 ceph_rbd docker_image - /dev/rbd0
  7. [root@local-node-3 ~]# rbd device unmap /dev/rbd0
  1. 删除rbd镜像
  1. [root@local-node-3 ~]# rbd ls ceph_rbd
  2. docker_image
  3. [root@local-node-3 ~]# rbd info ceph_rbd/docker_image
  4. rbd image 'docker_image':
  5. size 2 GiB in 512 objects
  6. order 22 (4 MiB objects)
  7. id: 1bef96b8b4567
  8. block_name_prefix: rbd_data.1bef96b8b4567
  9. format: 2
  10. features: layering
  11. op_features:
  12. flags:
  13. create_timestamp: Wed Apr 10 15:50:21 2019
  14. [root@local-node-3 ~]# rbd trash ls ceph_rbd
  15. # 将rbd移除到trash,也可以直接删除
  16. [root@local-node-3 ~]# rbd trash mv ceph_rbd/docker_image
  17. [root@local-node-3 ~]# rbd trash ls ceph_rbd
  18. 1bef96b8b4567 docker_image
  19. # 从trash 中删除镜像
  20. [root@local-node-3 ~]# rbd trash rm ceph_rbd/1bef96b8b4567
  21. Removing image: 100% complete...done.
  22. [root@local-node-3 ~]# rbd trash ls ceph_rbd
  23. [root@local-node-3 ~]# rbd ls ceph_rbd
  1. 删除池
  1. [root@local-node-3 ~]# ceph osd lspools
  2. 7 ceph_rbd
  3. [root@local-node-3 ~]# ceph osd pool rm ceph_rbd ceph_rbd --yes-i-really-really-mean-it
  4. pool 'ceph_rbd' removed
  1. 查看集群状态:
  1. [root@local-node-3 ~]# ceph -s
  2. cluster:
  3. id: 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
  4. health: HEALTH_OK
  5. services:
  6. mon: 3 daemons, quorum local-node-1,local-node-2,local-node-3
  7. mgr: ceph-mgr(active)
  8. osd: 9 osds: 9 up, 9 in
  9. data:
  10. pools: 0 pools, 0 pgs
  11. objects: 0 objects, 0 B
  12. usage: 9.3 GiB used, 81 GiB / 90 GiB avail
  13. pgs:
  14. [root@local-node-3 ~]# ceph osd tree
  15. ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
  16. -1 0.08817 root default
  17. -3 0.02939 host local-node-1
  18. 0 hdd 0.00980 osd.0 up 1.00000 1.00000
  19. 1 hdd 0.00980 osd.1 up 1.00000 1.00000
  20. 2 hdd 0.00980 osd.2 up 1.00000 1.00000
  21. -5 0.02939 host local-node-2
  22. 3 hdd 0.00980 osd.3 up 1.00000 1.00000
  23. 4 hdd 0.00980 osd.4 up 1.00000 1.00000
  24. 5 hdd 0.00980 osd.5 up 1.00000 1.00000
  25. -7 0.02939 host local-node-3
  26. 6 hdd 0.00980 osd.6 up 1.00000 1.00000
  27. 7 hdd 0.00980 osd.7 up 1.00000 1.00000
  28. 8 hdd 0.00980 osd.8 up 1.00000 1.00000

转载于:https://blog.51cto.com/tryingstuff/2379837

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/592812
推荐阅读
相关标签
  

闽ICP备14008679号