注意

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

图像实时迁移

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

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

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

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

Note

图像实时迁移需要 Ceph Nautilus 版本或更高版本。对外部数据源的支持需要 Ceph Pacific 版本或更高版本。内核模块当前不支持实时迁移。krbd kernel module does not support live-migration at this time.

实时迁移过程由三个步骤组成:

  1. 准备迁移:第一步创建新的目标图像并将目标图像链接到源。当不在导入仅模式下配置时,源图像也将链接到目标图像并被标记为只读。

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

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

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

准备迁移

同一 Ceph 集群内图像的默认实时迁移过程是通过运行rbd migration prepare命令启动的,提供源和目标图像:

$ rbd migration prepare migration_source [migration_target]

The rbd migration prepare命令接受与rbd create命令相同的所有布局可选参数,这允许更改磁盘上的不可变图像布局。如果目标是仅更改磁盘布局,保留原始图像名称,则可以省略migration_target

在准备实时迁移之前,必须停止使用源图像的所有客户端。如果准备步骤发现任何以读写模式打开图像的运行客户端,则该步骤将失败。准备步骤完成后,可以使用新目标图像名称重新启动客户端。尝试使用源图像名称重新启动客户端将导致失败。

The 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可选参数传递,或通过文件或 STDIN 通过--source-spec-path可选参数传递:

$ rbd migration prepare --import-only --source-spec "<JSON>" migration_target

The rbd migration prepare命令接受与rbd create command.

The 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 JSON is as follows:

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

目前支持的以下格式:native, qcow, and raw. 目前支持以下流:file, http, s3, and nbd.

格式

The native格式可以用于描述 Ceph 集群中的原生 RBD 图像作为源图像。其source-specJSON 编码如下:

{
    "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@snap1source-spec导入,可以编码为:

{
    "type": "native",
    "pool_name": "rbd",
    "pool_namespace": "ns1",
    "image_name": "image1",
    "snap_name": "snap1"
}

The qcow格式可以用于描述 QCOW(QEMU 写时复制)块设备。目前支持 QCOW(v1)和 QCOW2 格式,但除外高级功能,如压缩、加密、支撑文件和外部数据文件。这些缺失功能的支持可能在未来的版本中添加。其qcow格式数据可以链接到下面描述的任何支持的流源。例如,其基本source-specJSON 编码如下:

{
    "type": "qcow",
    "stream": {
        <stream unique parameters>
    }
}

The raw格式可以用于描述厚置备的原始块设备导出(即rbd export --export-format 1 <snap-spec>应该是 ASCII 字符串(如 Python 的raw格式数据可以链接到下面描述的任何支持的流源。例如,其基本source-specJSON 编码如下:

{
    "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 导出差异快照。

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

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

例如,要从位于/mnt/image.raw,其source-specJSON 编码如下:

{
    "type": "raw",
    "stream": {
        "type": "file",
        "file_path": "/mnt/image.raw"
    }
}

The http流可以用于从远程 HTTP 或 HTTPS 网络服务器导入。其source-specJSON 编码如下:

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

例如,要从位于https://download.ceph.com/image.raw,其source-specJSON 编码如下:

{
    "type": "raw",
    "stream": {
        "type": "http",
        "url": "https://download.ceph.com/image.raw"
    }
}

The s3流可以用于从远程 S3 桶导入。其source-specJSON 编码如下:

{
    <format unique parameters>
    "stream": {
        "type": "s3",
        "url": "<url-path>",
        "access_key": "<access-key>",
        "secret_key": "<secret-key>"
    }
}

例如,要从位于https://s3.ceph.com/bucket/image.raw,其source-specJSON 编码如下:

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

Note

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

The nbd流可以用于从远程 NBD 导出导入。其source-specJSON 编码如下:

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

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

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

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

执行迁移

准备实时迁移后,必须将源图像的图像块复制到目标图像。这是通过运行rbd migration execute command:

$ rbd migration execute migration_target
Image migration: 100% complete...done.

The 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 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.