1.Ceph RBD mirror简介
Ceph采用的是强一致性同步模型,所有副本都必须完成写操作才算一次写入成功,这就导致不能很好地支持跨域部署,因为如果副本在异地,网络延迟就会很大,拖垮整个集群的写性能。因此,Ceph集群很少有跨域部署的,也就缺乏异地容灾。Ceph RBD mirror是Ceph Jewel版本引入的新功能,支持两个Ceph集群数据同步,其原理非常类似mysql的主从同步机制,前者基于journaling,后者基于binlog,二者都是基于日志回放完成主从同步的。2.Ceph RBD mirror配置2.1 环境准备体验Ceph RBD mirror功能,必须准备好以下环境:我们知道一个ceph client节点可以同时访问多个Ceph集群,所有的ceph命令都可以通过-–cluster参数指定集群名字(更确切地说应该是一个命名空间),不指定该参数,则默认值为ceph,集群名字是通过/etc/ceph目录下的配置文件名区分的,/etc/ceph/ceph.conf对应名称为ceph的集群名配置,而/etc/ceph/openstack.conf则对应名称为openstack的Ceph集群。密钥文件命名也一样。
假设我们在server-31、server-32上都部署了两套独立的allinone ceph环境,分别命名为31节点、32节点,这两个环境的ceph版本都是Jewel。在31节点上同时访问这两个ceph集群,只需要复制配置文件到/etc/ceph目录下即可,并且指定配置文件和密钥文件名,如下:- cd/etc/ceph
- cpceph.confserver-31.conf
- cpceph.client.admin.keyringserver-31.client.admin.keyring
- scpserver-32:/etc/ceph/ceph.confserver-32.conf
- scpserver-32:/etc/ceph/ceph.client.admin.keyringserver-32.client.admin.keyring
最后ceph配置如下:
- [root@server-31ceph]#llserver*
- -rw-r--r--1rootroot137Jan2311:58server-31.client.admin.keyring
- -rw-r--r--1rootroot497Jan2311:59server-31.conf
- -rw-r--r--1rootroot129Jan2311:28server-32.client.admin.keyring
- -rw-r--r--1rootroot276Jan2311:33server-32.conf
请确认ceph用户具有读权限,否则服务起不来
验证:- [root@server-31ceph]#ceph--clusterserver-31df
- GLOBAL:
- SIZEAVAILRAWUSED%RAWUSED
- 249G235G14669M5.74
- POOLS:
- NAMEIDUSED%USEDMAXAVAILOBJECTS
- openstack5169M0.07235G81
- rbd600235G0
- int32bit-test810400235G18
- [root@server-31ceph]#ceph--clusterserver-32df
- GLOBAL:
- SIZEAVAILRAWUSED%RAWUSED
- 249G243G6413M2.51
- POOLS:
- NAMEIDUSED%USEDMAXAVAILOBJECTS
- rbd101140243G4
- int32bit-test132280243G10
开启journaling功能,可以在创建RBD image时通过--image-feature参数指定,也可以通过配置文件设置默认开启的features,features通过一个无符号长整型数的位标识,参考CEPH RBD Features,代码如下:
- #defineRBD_FEATURE_LAYERING(1ULL<<0)
- #defineRBD_FEATURE_STRIPINGV2(1ULL<<1)
- #defineRBD_FEATURE_EXCLUSIVE_LOCK(1ULL<<2)
- #defineRBD_FEATURE_OBJECT_MAP(1ULL<<3)
- #defineRBD_FEATURE_FAST_DIFF(1ULL<<4)
- #defineRBD_FEATURE_DEEP_FLATTEN(1ULL<<5)
- #defineRBD_FEATURE_JOURNALING(1ULL<<6)
- #defineRBD_FEATURE_DATA_POOL(1ULL<<7)
我们设置default_rbd_features值为125,在所有的配置文件的[global]配置组下配置:
- rbd_default_features=125
2.2 安装rbd-mirror服务
开启Ceph RBD mirror功能,必须额外安装rbd-mirror服务,CentOS下直接安装即可:- yuminstall-yrbd-mirror
启动服务:
- systemctlenableceph-rbd-mirror@admin.service
- systemctlstartceph-rbd-mirror@admin.service
- systemctlenableceph-rbd-mirror@admin.service
- systemctlstartceph-rbd-mirror@admin.service
开启pool mirror功能:
- rbd--clusterserver-31mirrorpoolenableint32bit-testpool
- rbd--clusterserver-32mirrorpoolenableint32bit-testpool
分别设置peer集群,即需要同步的目标集群,这里我们设置他们互为peer:
- rbd--clusterserver-31mirrorpoolpeeraddint32bit-testclient.admin@server-32
- rbd--clusterserver-32mirrorpoolpeeraddint32bit-testclient.admin@server-31
查看peer状态:
- #rbd-pint32bit-testmirrorpoolinfo
- Mode:pool
- Peers:
- UUIDNAMECLIENT
- 068cd9a1-a7ff-4120-8194-88261e37a39aserver-32client.admin
在31集群上创建一个rbd image,并在server-32集群上查看是否同步:
- rbd--clusterserver-31-pint32bit-testcreaterbd-mirror-test--size1024
- rbd--clusterserver-32-pint32bit-testinforbd-mirror-test
- rbdimage'rbd-mirror-test':
- size1024MBin256objects
- order22(4096kBobjects)
- block_name_prefix:rbd_data.ada71ca0c5fa
- format:2
- features:layering,exclusive-lock,object-map,fast-diff,deep-flatten,journaling
- flags:
- journal:ada71ca0c5fa
- mirroringstate:enabled
- mirroringglobalid:163688ba-52fe-4610-a3d5-eb90c663bd4c
- mirroringprimary:false
从结果上看,我们在server-31集群上创建的image已经同步到server-32上,并且从info中可以查看mirror信息。其中mirroring primary属性标明是否主image,只有primary image才能写,非primary image是只读的,不能进行写操作。通过rbd命令可以把主image降级为非primary image,或者把非primary image提升为prmary image,换句话说,rbd mirror不支持AA模式,只支持主备模式。除此之外,mirror目前只支持1对1,不支持一对多模式,即不能设置多个peer。
可以使用rbd mirror image status命令查看同步状态:- [root@server-31int32bit]#rbd--clusterserver-32mirrorimagestatusint32bit-test/rbd-mirror-test
- rbd-mirror-test:
- global_id:163688ba-52fe-4610-a3d5-eb90c663bd4c
- state:up+syncing
- description:bootstrapping,OPEN_LOCAL_IMAGE
- last_update:2017-01-2411:42:37
syncing表示正在同步,同步完成后状态为replaying。也可以通过rbd mirror pool status查看整个pool的同步状态:
- #rbd--clusterserver-32mirrorpoolstatus--verboseint32bit-test
- health:OK
- images:5total
- 4replaying
- 1stopped
- ...
当health为OK时,说明所有image同步完成。
2.4 关于map操作当RBD image开启了某些高级特性后,内核可能不支持,因此不能执行rbd map操作,否则出现RBD image feature set mismatch错误。- #rbdmapint32bit-test/mirror-test
- rbd:sysfswritefailed
- RBDimagefeaturesetmismatch.Youcandisablefeaturesunsupportedbythekernelwith"rbdfeaturedisable".
- Insomecasesusefulinfoisfoundinsyslog-try"dmesg|tail"orso.
好在从J版本后,RBD支持将RBD image map为本地nbd设备,通过rbd nbd map命令即可映射为本地nbd设备。首先需要安装rbd-nbd模块:
- yuminstallrbd-nbd
map image到本地nbd设备:
- #rbdnbdmapint32bit-test/mirror-test
- /dev/nbd0
安装文件系统后就可以挂载到本地文件系统了:
- mkfs.ext4/dev/nbd0
- mount/dev/nbd0/mnt
由此解决了无法map的问题。
3.Ceph RBD mirror原理介绍Ceph RBD mirror原理其实和mysql的主从同步原理非常类似,简单地说就是通过日志进行回放(replay)。这里仅简单介绍下。前面提到RBD mirror必须依赖于journeling特性,且需要额外部署rbd-mirror服务。rbd-mirror服务负责不同Ceph集群的数据同步,当用户执行IO write操作时(必须写入primary image),首先会尝试写入journal,一旦写入完成会向client发起ACK确认,此时开始执行底层的image写入操作,与此同时rbd-mirror开始根据journal执行回放操作,同步到远端的ceph集群中。如图所示:需要注意的是,一旦同步出现脑裂情况,rbd-mirror将中止同步操作,此时你必须手动决定哪边的image是有用的,然后通过手动执行rbd mirror image resync命令恢复同步。4.Ceph RBD mirror在Openstack上的实践目前很多用户都会选择使用Ceph作为Openstack后端存储,对接Glance、Nova以及Cinder服务,甚至使用RGW对接Swift API。目前Openstack也对异地容灾支持也不太好,可选的多region方案也存在很多问题。Openstack异地容灾的关键是存储的容灾,即块设备容灾,这些包括了用户的所有虚拟机根磁盘、glance镜像以及cinder数据卷,DRBD是一种策略。如果能够把RBD mirror应用到Openstack中,或许能够解决异地容灾问题。Openstack后端开启mirror功能,并不需要额外修改Openstack的配置,只需要部署rbd-mirror服务并对Openstack使用的pool开启mirror功能即可。【
