RBD 实时迁移(pacific版本)
RBD 镜像可以在同一个集群的不同池之间进行实时迁移;在不同的镜像格式和布局之间;或来自外部数据源。启动时,源将被深度复制到目标镜像,拉取所有快照历史记录,同时尽可能保留数据的稀疏分配。
默认情况下,当在同一个 Ceph 集群中实时迁移 RBD 镜像时,源镜像将被标记为只读,所有客户端会将 IO 重定向到新的目标镜像。此外,此模式可以选择保留到源镜像父级的链接以保持稀疏性,或者它可以在迁移期间展平镜像以消除对源镜像父级的依赖。
实时迁移过程也可用于仅导入模式,其中源镜像保持未修改,目标镜像可链接到外部数据源,例如后备文件、HTTP(s) 文件或 S3 对象。
使用新目标镜像时,实时迁移复制过程可以安全地在后台运行。当前要求在不使用仅导入操作模式时在准备迁移之前暂时停止使用源映像。这有助于确保使用镜像的客户端更新为指向新的目标镜像。
笔记:映像实时迁移需要 Ceph Nautilus 或更高版本。对外部数据源的支持需要更高版本的 Ceph Pacific。内核模块目前
krbd
不支持实时迁移。
实时迁移过程包括三个步骤:
-
准备迁移:初始步骤创建新的目标镜像并将目标镜像链接到源。当未配置为仅导入模式时,源镜像也将链接到目标镜像并标记为只读。
与分层镜像类似,尝试读取目标镜像中未初始化的数据范围将在内部将读取重定向到源镜像,并且写入目标中的未初始化范围将在内部将重叠的源镜像块深度复制到目标镜像。
-
执行迁移:这是一个后台操作,将所有已初始化的块从源镜像深度复制到目标镜像。此步骤可以在客户端积极使用新目标映像时运行。
-
完成迁移:后台迁移过程完成后,可以提交或中止迁移。提交迁移将移除源镜像和目标镜像之间的交叉链接,如果未在仅导入模式下配置,则会移除源镜像。中止迁移将删除交叉链接,并将删除目标镜像。
1. 准备迁移
同一个 Ceph 集群中镜像的默认实时迁移过程是通过运行rbd migration prepare命令启动的,提供源镜像和目标镜像:
$ rbd migration prepare migration_source [migration_target]
rbd migration prepare命令接受所有与rbd create命令相同的布局选项 ,它允许更改不可变的磁盘上映像布局。如果目标只是更改磁盘布局,则可以跳过migration_target ,保留原始镜像名称。
在准备实时迁移之前,必须停止所有使用源映像的客户端。如果发现任何正在运行的客户端以读/写模式打开映像,则准备步骤将失败。准备步骤完成后,可以使用新的目标映像名称重新启动客户端。尝试使用源映像名称重新启动客户端将导致失败。
rbd status命令将显示实时迁移的当前状态:
$ rbd status migration_target
Watchers: none
Migration:
source: rbd/migration_source (5e2cba2f62e)
destination: rbd/migration_target (5e2ed95ed806)
state: prepared
注意源镜像会被移到 RBD 垃圾箱,避免迁移过程中的误用:
$ rbd info migration_source
rbd: error opening image migration_source: (2) No such file or directory
$ rbd trash ls --all
5e2cba2f62e migration_source
2. 准备仅导入迁移
仅导入实时迁移过程通过运行相同的 rbd 迁移准备命令启动,但添加了–import-only选项并提供 JSON 编码source-spec
来描述如何访问源镜像数据。这source-spec
可以通过–source-spec可选参数直接传递,也可以通过文件或 STDIN 通过 –source-spec-path可选参数传递:
$ rbd migration prepare --import-only --source-spec "<JSON>" migration_target
rbd migration prepare命令接受所有与rbd create命令相同的布局选项 。
rbd status命令将显示实时迁移的当前状态:
$ rbd status migration_target
Watchers: none
Migration:
source: {"stream":{"file_path":"/mnt/image.raw","type":"file"},"type":"raw"}
destination: rbd/migration_target (ac69113dc1d7)
state: prepared
JSON的一般格式source-spec
如下:
{
"type": "<format-type>",
<format unique parameters>
"stream": {
"type": "<stream-type>",
<stream unique parameters>
}
}
当前支持以下格式:native
、qcow
和 raw
。当前支持以下流:file
、http
和 s3
。
2.1 格式
native
格式可用于将 Ceph 集群内的原生 RBD 映像描述为源映像。它的source-spec
JSON 编码如下:
{
"type": "native",
"pool_name": "<pool-name>",
["pool_id": <pool-id>,] (optional alternative to "pool_name")
["pool_namespace": "<pool-namespace",] (optional)
"image_name": "<image-name>",
["image_id": "<image-id>",] (optional if image in trash)
"snap_name": "<snap-name>",
["snap_id": "<snap-id>",] (optional alternative to "snap_name")
}
请注意,native
格式不包括stream
对象,因为它使用了原生 Ceph 操作。例如,要从镜像rbd/ns1/image1@snap1
导入 ,source-spec
可以编码为:
{
"type": "native",
"pool_name": "rbd",
"pool_namespace": "ns1",
"image_name": "image1",
"snap_name": "snap1"
}
qcow
格式可用于描述 QCOW(QEMU 写入时复制)块设备。目前支持 QCOW (v1) 和 QCOW2 格式,但压缩、加密、备份文件和外部数据文件等高级功能除外。未来版本中可能会添加对这些缺失功能的支持。qcow
格式数据可以链接到下面描述的任何支持的流源。例如,它的基本source-spec
JSON 编码如下:
{
"type": "qcow",
"stream": {
<stream unique parameters>
}
}
raw
格式可用于描述厚配置的原始块设备导出(即rbd export –export-format 1 <snap-spec>)。raw
格式数据可以链接到下面描述的任何支持的流源。例如,它的基本source-spec
JSON 编码如下:
{
"type": "raw",
"stream": {
<stream unique parameters for HEAD, non-snapshot revision>
},
"snapshots": [
{
"type": "raw",
"name": "<snapshot-name>",
"stream": {
<stream unique parameters for snapshot>
}
},
] (optional oldest to newest ordering of snapshots)
}
包含snapshots
阵列是可选的,目前仅支持厚配置raw
快照导出。
RBD 导出格式 v2 和 RBD 导出差异快照等其他格式将在未来版本中添加。
2.2 流
file
流可用于从本地可访问的 POSIX 文件源导入。它的source-spec
JSON 编码如下:
{
<format unique parameters>
"stream": {
"type": "file",
"file_path": "<file-path>"
}
}
例如,要从位于“/mnt/image.raw”的文件中导入原始格式的镜像,其source-spec
JSON 编码如下:
{
"type": "raw",
"stream": {
"type": "file",
"file_path": "/mnt/image.raw"
}
}
http
流可用于从远程 HTTP 或 HTTPS Web 服务器导入。它的source-spec
JSON 编码如下:
{
<format unique parameters>
"stream": {
"type": "http",
"url": "<url-path>"
}
}
例如,要从位于 http://download.ceph.com/image.raw
的文件中导入原始格式的镜像,其source-spec
JSON 编码如下:
{
"type": "raw",
"stream": {
"type": "http",
"url": "http://download.ceph.com/image.raw"
}
}
s3
流可用于从远程 S3 存储桶导入。它的source-spec
JSON 编码如下:
{
<format unique parameters>
"stream": {
"type": "s3",
"url": "<url-path>",
"access_key": "<access-key>",
"secret_key": "<secret-key>"
}
}
例如,要从位于 http://s3.ceph.com/bucket/image.raw的文件中导入原始格式的镜像,其source-spec
JSON 编码如下:
{
"type": "raw",
"stream": {
"type": "s3",
"url": "http://s3.ceph.com/bucket/image.raw",
"access_key": "NX5QOQKC6BH2IDN8HC7A",
"secret_key": "LnEsqNNqZIpkzauboDcLXLcYaWwLQ3Kop0zAnKIn"
}
}
笔记:
access_key
和secret_key
参数支持将键存储在 MON config-key 存储中,方法是在键值前面加上config://
MON config-key 存储中的路径到该值。值可以通过ceph config-key set <key-path> <value>
(例如ceph config-key set rbd/s3/access_key NX5QOQKC6BH2IDN8HC7A
)存储在配置密钥存储中。
3. 执行迁移
准备好实时迁移后,必须将源镜像中的镜像块复制到目标镜像。这是通过运行 rbd 迁移执行命令来完成的:
$ rbd migration execute migration_target
Image migration: 100% complete...done.
rbd status命令还将提供有关迁移块深拷贝过程的进度的反馈:
$ rbd status migration_target
Watchers:
watcher=1.2.3.4:0/3695551461 client.123 cookie=123
Migration:
source: rbd/migration_source (5e2cba2f62e)
destination: rbd/migration_target (5e2ed95ed806)
state: executing (32% complete)
4. 提交迁移
一旦实时迁移完成将所有数据块从源映像深度复制到目标,就可以提交迁移:
$ rbd status migration_target
Watchers: none
Migration:
source: rbd/migration_source (5e2cba2f62e)
destination: rbd/migration_target (5e2ed95ed806)
state: executed
$ rbd migration commit migration_target
Commit image migration: 100% complete...done.
如果migration_source映像是一个或多个克隆的父级, 则需要在确保所有后代克隆映像都未使用后指定–force选项。
提交实时迁移将删除源镜像和目标镜像之间的交叉链接,并将删除源镜像:
$ rbd trash list --all
5. 中止迁移
如果您希望恢复准备或执行步骤,请运行rbd migration abort 命令恢复迁移过程:
$ rbd migration abort migration_target
Abort image migration: 100% complete...done.
中止迁移将导致目标映像被删除并恢复对原始源映像的访问:
$ rbd ls
migration_source