授人以鱼不如授人以“渔”——OpenStack之Cinder Replication浅析

授人以鱼不如授人以“渔”——OpenStack之Cinder Replication浅析

什么是Replication

Replication(复制)与Snapshot(快照)、Backup(备份)是存储领域最为常见的数据保护技术。在衡量数据保护技术优劣时,通常使用RPO(Recovery Point Objective)与RTO(Recovery Time Objective)两个指标。优秀的数据保护技术可以使得RPO=0且RTO趋近于0。Replication与Snapshot相比,它不依赖于数据源,可以做到异地容灾;而与Backup相比,它轻量,可以恢复到任意时间点数据源。
Replication技术因其可靠的数据保护作用,常常被用来构建高可用数据中心。简单来说,Replication通过在两个Volume(卷)之间创建一个Session(会话),并进行数据同步,这两个Volume可以处于同一台存储阵列中,也可以处于两个异地的存储阵列中,同时只有一个提供生产服务,当提供生产服务的Primary Volume发生故障时,立即切换至备用的Secondary Volume,从而保证业务的连续性。
Replication根据数据同步的方式分为Sync(同步)与Async(异步)两种模式。Sync模式下,数据在写入Primary Volume与Secondary Volume后才可用;Async模式反之。因此,只有Sync Replication可以提供RPO=0的保障。


Cinder Replication简介

Cinder从Juno版开始支持Replication,目前API已发展至v2.1版本。Replication v1由IBM主导并实现了相关框架代码,但是其他厂商并不是很“买账”,所以支持的Driver较少。此后,Replication v2由Solidfire主导并开发框架代码,在v2完成后不久Solidfire又对API进行了改动,形成了现在的v2.1版本。v2的框架代码在Liberty版本基本完成,主流厂商跟进热情很高,在近期发布的Mitaka版本中,已有多家厂商的产品宣布支持v2.1。
值得一提的是,Ceph RBD driver也已计划在Newton版本中增加对Replication的支持,不过前提得是Ceph RBD自身的Replication功能能够及时发布。


Cinder Replication v2.1操作指南

以下通过命令行操作介绍一下如何使用Cinder的Replication,这里以EMC VNX Driver为例,其他厂商Driver的操作基本类似:

创建支持Replication的volume
1) 首先需要创建支持Replication的volume type

#cinder type-create replication-type
#cinder type-key replication-type set replication_enabled=True

2) 使用1)中创建的volume type创建volume
#cinder create --volume-type replication_type --name vol001 100

发生故障时对指定的cinder backend执行Failover操作
#cinder failover-host --backend-id <secondary-id> \
controller-node1@vnxbackend

待源端故障清理完毕,执行Failback操作
#cinder failover-host --backend-id default \
controller-node1@vnxbackend


Cinder Replication v2.1详解

  1. Failover操作对象
    Failover的操作对象是一个具体的Cinder Backend。当某个Cinder Backend发生故障时,该Backend上所有的Volume将不可访问,这时需要对其进行“failover-host”操作以恢复业务。在进行“failover-host”操作时,指定的“backend-id”就是目的端。当“failover-host”操作完成后,Backend上的所有Volume将由目的端上的Volume替代,提供生产服务。
    如果Backend上的某些Volume没有开启Replication功能,这些Volume将不会Failover到目的端。

  2. Replication目的端
    Cinder支持一对多的Replication,即一个Cinder Backend可以Replicate到多个目的端,但并非所有Driver都支持一对多的Relication。Replication目的端的信息需要在“cinder.conf”里配置,其中“backend_id”是必须配置的,该参数用于进行“failover-host”操作时指定目的端。目的端一般是灾备数据中心的存储阵列,用来做主业务数据中心的冗余设备。

  3. Failback操作
    当Cinder Backend管理的源端故障排除后,可以对该Cinder Backend执行Failback操作,这样源端的Volume将继续提供服务,在故障处理期间,向目的端写入的数据也会同步回源端。

  4. Sync与Async
    目前Cinder并不支持显示的设置Replication的同步模式,这是因为Replication极度依赖于厂商Driver的实现。一般而言,各厂商的具体实现中,会使用“volume type”中的“extra spec key”去设置Volume的Replication同步模式。