注意

本文档适用于 Ceph 的开发版本。

镜像实时迁移

RBD 镜像可以在同一 Ceph 集群内的不同存储池、镜像格式和/或布局之间实时迁移;也可以从另一个 Ceph 集群中的镜像迁移;或者从外部数据源迁移。启动时,源镜像将被深度复制到目标镜像,拉取所有快照历史记录,同时尽可能保留数据的稀疏分配。

默认情况下,在同一 Ceph 集群内实时迁移 RBD 镜像时,源镜像将被标记为只读,所有客户端将转而将 IO 重定向到新的目标镜像。此外,此模式可以选择保留与源镜像父级的链接以保留稀疏性,或者可以在迁移过程中平展镜像以消除对源镜像父级的依赖。

实时迁移过程也可以用于仅导入模式,其中源镜像保持不变,并且目标镜像可以链接到另一个 Ceph 集群中的镜像或外部数据源,例如后端文件、HTTP(s) 文件、S3 对象或 NBD 导出。

实时迁移复制过程可以在新目标镜像使用时在后台安全运行。当前要求在准备迁移之前(当不使用仅导入操作模式时)暂时停止使用源镜像。这有助于确保使用镜像的客户端更新指向新的目标镜像。

注意

镜像实时迁移需要 Ceph Nautilus 版本或更高版本。对外部数据源的支持需要 Ceph Pacific 版本或更高版本。krbd 内核模块目前不支持实时迁移。

实时迁移过程包括三个步骤

  1. 准备迁移: 初始步骤创建新的目标镜像并将目标镜像链接到源镜像。当未配置为仅导入模式时,源镜像也将链接到目标镜像并标记为只读。

    类似于分层镜像,尝试读取目标镜像内未初始化数据范围的尝试将在内部重定向读取到源镜像,并且对目标镜像内未初始化范围的写入将在内部将重叠的源镜像块深度复制到目标镜像。

  2. 执行迁移: 这是一个后台操作,将所有已初始化的块从源镜像深度复制到目标镜像。此步骤可以在客户端正在主动使用新目标镜像时运行。

  3. 完成迁移: 一旦后台迁移过程完成,可以提交或中止迁移。提交迁移将删除源镜像和目标镜像之间的交叉链接,并且如果未配置为仅导入模式,将删除源镜像。中止迁移将删除交叉链接,并删除目标镜像。

准备迁移

同一 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

准备仅导入迁移

仅导入实时迁移过程是通过运行相同的 rbd migration prepare 命令启动的,但添加 --import-only 选项并提供 JSON 编码的 source-spec 来描述如何访问源镜像数据。这个 source-spec 可以直接通过 --source-spec 选项传递,也可以通过 --source-spec-path 选项通过文件或 STDIN 传递

$ 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

source-spec JSON 的通用格式如下

{
    "type": "<format-type>",
    <format unique parameters>
    "stream": {
        "type": "<stream-type>",
        <stream unique parameters>
    }
}

目前支持以下格式:nativeqcowraw。目前支持以下流:filehttps3nbd

格式

native 格式可用于描述 Ceph 集群内的原生 RBD 镜像作为源镜像。其 source-spec JSON 编码如下

{
    "type": "native",
    ["cluster_name": "<cluster-name>",] (specify if image in another cluster,
                                         requires ``<cluster-name>.conf`` file)
    ["client_name": "<client-name>",] (for connecting to another cluster,
                                       default is ``client.admin``)
    "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>",] (specify 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 copy-on-write) 块设备。目前支持 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 export-format v2 和 RBD export-diff 快照将在未来的版本中添加。

file 流可用于从本地可访问的 POSIX 文件源导入。其 source-spec JSON 编码如下

{
    <format unique parameters>
    "stream": {
        "type": "file",
        "file_path": "<file-path>"
    }
}

例如,要从位于 /mnt/image.raw 的文件导入 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>"
    }
}

例如,要从位于 https://download.ceph.com/image.raw 的文件导入 raw 格式镜像,其 source-spec JSON 编码如下

{
    "type": "raw",
    "stream": {
        "type": "http",
        "url": "https://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>"
    }
}

例如,要从位于 https://s3.ceph.com/bucket/image.raw 的文件导入 raw 格式镜像,其 source-spec JSON 编码如下

{
    "type": "raw",
    "stream": {
        "type": "s3",
        "url": "https://s3.ceph.com/bucket/image.raw",
        "access_key": "NX5QOQKC6BH2IDN8HC7A",
        "secret_key": "LnEsqNNqZIpkzauboDcLXLcYaWwLQ3Kop0zAnKIn"
    }
}

注意

access_keysecret_key 参数支持通过在密钥值前加上 config://,后跟 MON config-key 存储中值的路径来将密钥存储在 MON config-key 存储中。值可以通过 ceph config-key set <key-path> <value> 存储在 config-key 存储中(例如 ceph config-key set rbd/s3/access_key NX5QOQKC6BH2IDN8HC7A)。

nbd 流可用于从远程 NBD 导出导入。其 source-spec JSON 编码如下

{
    <format unique parameters>
    "stream": {
        "type": "nbd",
        "uri": "<nbd-uri>",
    }
}

例如,要从位于 nbd://nbd.ceph.com 且导出名称为 image.raw 的 NBD 导出导入 raw 格式镜像,其 source-spec JSON 编码如下

{
    "type": "raw",
    "stream": {
        "type": "nbd",
        "uri": "nbd://nbd.ceph.com/image.raw",
    }
}

nbd-uri 参数应遵循 NBD URI 规范。默认的 NBD 端口是 10809

执行迁移

准备实时迁移后,必须将源镜像中的镜像块复制到目标镜像。这通过运行 rbd migration execute 命令来实现

$ 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)

提交迁移

一旦实时迁移完成将所有数据块从源镜像深度复制到目标镜像,就可以提交迁移

$ 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

中止迁移

如果您希望恢复准备或执行步骤,请运行 rbd migration abort 命令以恢复迁移过程

$ rbd migration abort migration_target
Abort image migration: 100% complete...done.

中止迁移将导致目标镜像被删除,并恢复对原始源镜像的访问

$ rbd ls
migration_source

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入