Share replication

在云环境中,数据复制有多种用例。一个用例是共享文件系统中数据的可用性,例如,用于支持生产数据库。另一个用例是确保数据保护;即,通过拥有一个准备好备份您的主要数据源的复制位置来为灾难做好准备。

共享文件系统服务支持用户面向的 API,允许用户创建支持复制的共享,添加和删除共享副本以及管理它们的快照和访问规则。目前支持三种复制类型,它们在主共享和辅助副本相关的语义上有所不同。

重要提示

Share replication 是 Mitaka 版本中一个 实验性的 共享文件系统 API。贡献者可以在后续版本中更改或删除共享文件系统 API 的实验部分,而无需保持向后兼容性。实验性 API 在其 HTTP 请求中具有 X-OpenStack-Manila-API-Experimental: true 头部。

支持的复制类型

在使用共享复制之前,请确保您正在运行的共享文件系统驱动程序支持此功能。您可以在 manila-scheduler 服务报告中进行检查。报告的 replication_type 功能可以具有以下值之一

可写

驱动程序支持创建 writable 共享副本。所有共享副本都可以被赋予读/写访问权限,并且将同步镜像。

可读

驱动程序支持创建 read-only 共享副本。所有辅助共享副本都可以被赋予读取权限。只有主副本(或 active 共享副本)可以写入。

dr

驱动程序支持创建 dr(灾难恢复的缩写)共享副本。辅助共享副本在 promotion 之后才能访问。

驱动程序不支持共享复制。

注意

术语 active 共享副本指的是 primary 共享。在 writable 复制风格中,所有共享副本都是 active,并且可能没有 primary 共享的区别。在 readabledr 复制风格中,secondary 共享副本可以被称为 passivenon-active 或简单地,replica

配置

已经引入了两个新的配置选项来支持共享复制。

replica_state_update_interval

在您的 manila.confDEFAULT 部分中指定此选项。共享文件系统服务会定期请求更新所有 non-active 共享副本的 replica_state。更新相对于此选项对应的时间间隔进行。如果未指定,则默认值为 300 秒。

replication_domain

在使用多后端风格配置时,在后端段中指定此选项。该值可以是任何 ASCII 字符串。可以相互复制的两个后端将具有相同的 replication_domain。这是基于共享文件系统服务期望在对称后端之间执行共享复制的前提。使用共享复制功能需要此选项。

共享副本的健康状况

除了 status 属性之外,共享副本还具有 replica_state 属性,用于指示存储后端上数据复制的状态。 primary 共享副本的 replica_state 属性将被设置为 activesecondary 共享副本可以将其 replica_state 设置为以下之一

in_sync

共享副本与 active 共享副本同步(可能在后端特定的 recovery point objective 范围内)。

out_of_sync

共享副本已过时(所有新的共享副本都从这个 replica_state 开始)。

error

当调度程序无法调度此共享副本,或者与更新此副本的数据有关的可能无法恢复的错误发生时。

提升或故障转移

对于 readabledr 类型的复制,我们将切换 non-active 共享副本与 active 副本的任务称为 promotion。对于 writable 复制风格,提升没有意义,因为所有共享副本始终都是 active(或可写)。

正在提升的非活动副本的 status 属性将被设置为 replication_change。这被归类为 busy 状态,因此在其中一个共享副本处于此状态时,对共享的 API 交互受到限制。

共享复制工作流程

以下示例使用 ZFSonLinux 驱动程序实现,它是共享文件系统服务中的参考实现。它以 driver_handles_share_servers=False 模式运行,并支持 readable 类型的复制。在示例中,我们假设有两个可用性区域 [1],分别称为 availability_zone_1availability_zone_2

从 Train 版本开始,以 driver_handles_share_server=True 模式运行的一些驱动程序支持共享复制。

使用复制功能不需要多个可用性区域。但是,鼓励将可用性区域用作 failure domain

请注意 ZFS 驱动程序的网络配置。在这里,我们假设 zfs_service_ipzfs_share_export_ip 来自两个单独的网络。服务网络可以从运行 manila-share 服务的宿主机访问。共享导出 IP 来自允许用户访问的网络。

有关如何设置 ZFSonLinux 驱动程序的更多信息,请参阅 配置 ZFSonLinux 驱动程序

创建支持复制的共享

创建一个新的共享类型,并将 replication_type 作为正在使用的共享类型中的一个 extra-spec 指定。

使用 manila type-create 命令创建一个新的共享类型。指定名称和 extra-spec driver_handles_share_servers 的值。

$ manila type-create readable_type_replication False
+----------------------+--------------------------------------+
| Property             | Value                                |
+----------------------+--------------------------------------+
| required_extra_specs | driver_handles_share_servers : False |
| Name                 | readable_type_replication            |
| Visibility           | public                               |
| is_default           | -                                    |
| ID                   | 3b3ee3f7-6e43-4aa1-859d-0b0511c43074 |
| optional_extra_specs | snapshot_support : True              |
+----------------------+--------------------------------------+

使用 manila type-key 命令将 extra-spec 设置为共享类型。

$ manila type-key readable_type_replication set replication_type=readable

注意

此命令没有输出。要验证 extra-spec,请使用 manila extra-specs-list 命令,并将共享类型的名称或 ID 作为参数指定。

使用共享类型创建共享

使用 manila create 命令创建共享。指定共享协议、大小和可用性区域。

$ manila create NFS 1 --share_type readable_type_replication --name my_share --description "This share will have replicas" --az availability_zone_1
+-----------------------------+--------------------------------------+
| Property                    | Value                                |
+-----------------------------+--------------------------------------+
| status                      | creating                             |
| share_type_name             | readable_type_replication            |
| description                 | This share will have replicas        |
| availability_zone           | availability_zone_1                  |
| share_network_id            | None                                 |
| share_server_id             | None                                 |
| share_group_id              | None                                 |
| host                        |                                      |
| access_rules_status         | active                               |
| snapshot_id                 | None                                 |
| is_public                   | False                                |
| task_state                  | None                                 |
| snapshot_support            | True                                 |
| id                          | e496ed61-8f2e-436b-b299-32c3e90991cc |
| size                        | 1                                    |
| name                        | my_share                             |
| share_type                  | 3b3ee3f7-6e43-4aa1-859d-0b0511c43074 |
| has_replicas                | False                                |
| replication_type            | readable                             |
| created_at                  | 2016-03-29T20:22:18.000000           |
| share_proto                 | NFS                                  |
| project_id                  | 48a5ca76ac69405e99dc1c13c5195186     |
| metadata                    | {}                                   |
+-----------------------------+--------------------------------------+

注意

如果您正在使用具有共享类型规范 driver_handles_share_servers=True 的共享,则需要共享网络参数才能执行该操作。

使用 manila show 命令检索共享的详细信息。指定共享 ID 或名称作为参数。

$ manila show my_share
+-----------------------------+--------------------------------------------------------------------+
| Property                    | Value                                                              |
+-----------------------------+--------------------------------------------------------------------+
| status                      | available                                                          |
| share_type_name             | readable_type_replication                                          |
| description                 | This share will have replicas                                      |
| availability_zone           | availability_zone_1                                                |
| share_network_id            | None                                                               |
| export_locations            |                                                                    |
|                             | path =                                                             |
|                             |10.32.62.26:/alpha/manila_share_38efc042_50c2_4825_a6d8_cba2a8277b28|
|                             | preferred = False                                                  |
|                             | is_admin_only = False                                              |
|                             | id = e1d754b5-ec06-42d2-afff-3e98c0013faf                          |
|                             | share_instance_id = 38efc042-50c2-4825-a6d8-cba2a8277b28           |
|                             | path =                                                             |
|                             |172.21.0.23:/alpha/manila_share_38efc042_50c2_4825_a6d8_cba2a8277b28|
|                             | preferred = False                                                  |
|                             | is_admin_only = True                                               |
|                             | id = 6f843ecd-a7ea-4939-86de-e1e01d9e8672                          |
|                             | share_instance_id = 38efc042-50c2-4825-a6d8-cba2a8277b28           |
| share_server_id             | None                                                               |
| share_group_id       | None                                                                     |
| host                        | openstack4@zfsonlinux_1#alpha                                      |
| access_rules_status         | active                                                             |
| snapshot_id                 | None                                                               |
| is_public                   | False                                                              |
| task_state                  | None                                                               |
| snapshot_support            | True                                                               |
| id                          | e496ed61-8f2e-436b-b299-32c3e90991cc                               |
| size                        | 1                                                                  |
| name                        | my_share                                                           |
| share_type                  | 3b3ee3f7-6e43-4aa1-859d-0b0511c43074                               |
| has_replicas                | False                                                              |
| replication_type            | readable                                                           |
| created_at                  | 2016-03-29T20:22:18.000000                                         |
| share_proto                 | NFS                                                                |
| project_id                  | 48a5ca76ac69405e99dc1c13c5195186                                   |
| metadata                    | {}                                                                 |
+-----------------------------+--------------------------------------------------------------------+

注意

当您创建支持复制的共享时,会为您创建一个 active 副本。您可以使用 manila share-replica-list 命令进行验证。

从 API 版本 2.53 开始,在创建复制的共享时,manila 配额系统将为两个额外的配额预留和消耗资源:share_replicasreplica_gigabytes

创建和提升共享副本

创建共享副本

使用 manila share-replica-create 命令创建共享副本。指定共享 ID 或名称作为参数。您可以选择提供 availability_zonescheduler_hints

对于调度器提示,only_host 参数的值必须是 manila-share 服务主机,格式为 host@backend#POOL

$ manila share-replica-create my_share --az availability_zone_2 --scheduler_hints only_host=openstack4@zfsonlinux_2#beta
+-------------------+--------------------------------------+
| Property          | Value                                |
+-------------------+--------------------------------------+
| status            | creating                             |
| share_id          | e496ed61-8f2e-436b-b299-32c3e90991cc |
| availability_zone | availability_zone_2                  |
| created_at        | 2016-03-29T20:24:53.148992           |
| updated_at        | None                                 |
| share_network_id  | None                                 |
| share_server_id   | None                                 |
| host              |                                      |
| replica_state     | None                                 |
| id                | 78a5ef96-6c36-42e0-b50b-44efe7c1807e |
+-------------------+--------------------------------------+

查看新创建的共享副本的详细信息

注意

从 API 版本 2.51(Train 版本)开始,共享网络能够在不同可用性区域的多个子网中扩展。因此,当使用具有规范 driver_handles_share_servers=True 的共享类型时,用户必须确保共享网络在他们希望创建共享副本的可用性区域中具有子网。

注意

调度器提示仅适用于 API 版本 >= 2.67。

使用 manila share-replica-show 命令查看新创建的共享副本的详细信息。指定共享副本的 ID 作为参数。

$ manila share-replica-show 78a5ef96-6c36-42e0-b50b-44efe7c1807e
+-------------------+--------------------------------------+
| Property          | Value                                |
+-------------------+--------------------------------------+
| status            | available                            |
| share_id          | e496ed61-8f2e-436b-b299-32c3e90991cc |
| availability_zone | availability_zone_2                  |
| created_at        | 2016-03-29T20:24:53.000000           |
| updated_at        | 2016-03-29T20:24:58.000000           |
| share_network_id  | None                                 |
| share_server_id   | None                                 |
| host              | openstack4@zfsonlinux_2#beta         |
| replica_state     | in_sync                              |
| id                | 78a5ef96-6c36-42e0-b50b-44efe7c1807e |
+-------------------+--------------------------------------+

查看共享的所有副本

使用 manila share-replica-list 命令查看共享的所有副本。指定共享 ID 或名称作为可选参数。

$ manila share-replica-list --share-id my_share
+--------------------------------------+-----------+---------------+--------------------------------------+-------------------------------+---------------------+----------------------------+
| ID                                   | Status    | Replica State | Share ID                             | Host                          | Availability Zone   | Updated At                 |
+--------------------------------------+-----------+---------------+--------------------------------------+-------------------------------+---------------------+----------------------------+
| 38efc042-50c2-4825-a6d8-cba2a8277b28 | available | active        | e496ed61-8f2e-436b-b299-32c3e90991cc | openstack4@zfsonlinux_1#alpha | availability_zone_1 | 2016-03-29T20:22:19.000000 |
| 78a5ef96-6c36-42e0-b50b-44efe7c1807e | available | in_sync       | e496ed61-8f2e-436b-b299-32c3e90991cc | openstack4@zfsonlinux_2#beta  | availability_zone_2 | 2016-03-29T20:24:58.000000 |
+--------------------------------------+-----------+---------------+--------------------------------------+-------------------------------+---------------------+----------------------------+

提升辅助共享副本以成为新的活动副本

使用 manila share-replica-promote 命令提升非活动共享副本以成为 active 副本。指定非活动副本的 ID 作为参数。

$ manila share-replica-promote 78a5ef96-6c36-42e0-b50b-44efe7c1807e

注意

此命令没有输出。

提升可能需要一些时间。在提升期间,正在提升的共享副本的 replica_state 属性将被设置为 replication_change

$ manila share-replica-list --share-id my_share
+--------------------------------------+-----------+--------------------+--------------------------------------+-------------------------------+---------------------+----------------------------+
| ID                                   | Status    |    Replica State   | Share ID                             | Host                          | Availability Zone   | Updated At                 |
+--------------------------------------+-----------+--------------------+--------------------------------------+-------------------------------+---------------------+----------------------------+
| 38efc042-50c2-4825-a6d8-cba2a8277b28 | available |       active       | e496ed61-8f2e-436b-b299-32c3e90991cc | openstack4@zfsonlinux_1#alpha | availability_zone_1 | 2016-03-29T20:32:19.000000 |
| 78a5ef96-6c36-42e0-b50b-44efe7c1807e | available | replication_change | e496ed61-8f2e-436b-b299-32c3e90991cc | openstack4@zfsonlinux_2#beta  | availability_zone_2 | 2016-03-29T20:32:19.000000 |
+--------------------------------------+-----------+--------------------+--------------------------------------+-------------------------------+---------------------+----------------------------+

提升完成后,replica_state 将被设置为 active

$ manila share-replica-list --share-id my_share
+--------------------------------------+-----------+---------------+--------------------------------------+-------------------------------+---------------------+----------------------------+
| ID                                   | Status    | Replica State | Share ID                             | Host                          | Availability Zone   | Updated At                 |
+--------------------------------------+-----------+---------------+--------------------------------------+-------------------------------+---------------------+----------------------------+
| 38efc042-50c2-4825-a6d8-cba2a8277b28 | available | in_sync       | e496ed61-8f2e-436b-b299-32c3e90991cc | openstack4@zfsonlinux_1#alpha | availability_zone_1 | 2016-03-29T20:32:19.000000 |
| 78a5ef96-6c36-42e0-b50b-44efe7c1807e | available | active        | e496ed61-8f2e-436b-b299-32c3e90991cc | openstack4@zfsonlinux_2#beta  | availability_zone_2 | 2016-03-29T20:32:19.000000 |
+--------------------------------------+-----------+---------------+--------------------------------------+-------------------------------+---------------------+----------------------------+

访问规则

为共享创建一个 IP 访问规则

使用 manila access-allow 命令添加访问规则。指定共享 ID 或名称、协议和目标作为参数。

$ manila access-allow my_share ip 0.0.0.0/0 --access-level rw
+--------------+--------------------------------------+
| Property     | Value                                |
+--------------+--------------------------------------+
| share_id     | e496ed61-8f2e-436b-b299-32c3e90991cc |
| access_type  | ip                                   |
| access_to    | 0.0.0.0/0                            |
| access_level | rw                                   |
| state        | new                                  |
| id           | 8b339cdc-c1e0-448f-bf6d-f068ee6e8f45 |
+--------------+--------------------------------------+

注意

访问规则不应在共享的副本之间不同。但是,根据复制类型,驱动程序可以选择修改规定的访问级别。在上面的示例中,即使请求了共享的读/写访问权限,由于复制类型(readable)的语义,驱动程序将为相同的目标提供对非活动副本的只读访问权限。但是,当它被提升为成为 active 副本时,目标将对(当前)非活动副本具有读/写访问权限。

可以使用 manila access-deny 命令删除先前应用的访问规则。

列出共享的导出位置

使用 manila share-export-locations-list 命令列出共享的导出位置。

$ manila share-export-location-list my_share
+--------------------------------------+---------------------------------------------------------------------------+-----------+
| ID                                   | Path                                                                      | Preferred |
+--------------------------------------+---------------------------------------------------------------------------+-----------+
| 3ed3fbf5-2fa1-4dc0-8440-a0af72398cb6 | 10.32.62.21:/beta/subdir/manila_share_78a5ef96_6c36_42e0_b50b_44efe7c1807e| False     |
| 6f843ecd-a7ea-4939-86de-e1e01d9e8672 | 172.21.0.23:/alpha/manila_share_38efc042_50c2_4825_a6d8_cba2a8277b28      | False     |
| e1d754b5-ec06-42d2-afff-3e98c0013faf | 10.32.62.26:/alpha/manila_share_38efc042_50c2_4825_a6d8_cba2a8277b28      | False     |
| f3c5585f-c2f7-4264-91a7-a4a1e754e686 | 172.21.0.29:/beta/subdir/manila_share_78a5ef96_6c36_42e0_b50b_44efe7c1807e| False     |
+--------------------------------------+---------------------------------------------------------------------------+-----------+

识别用户可访问网络上共享副本的导出位置,您可以在目标节点上挂载它。

注意

作为管理员,您可以使用 manila share-instance-export-location-list 命令并指定共享副本的 ID 作为参数来列出特定共享的导出位置。

快照

创建共享的快照

使用 manila snapshot-create 命令创建共享的快照。指定共享 ID 或名称作为参数。

$ manila snapshot-create my_share --name "my_snapshot"
+-------------------+--------------------------------------+
| Property          | Value                                |
+-------------------+--------------------------------------+
| status            | creating                             |
| share_id          | e496ed61-8f2e-436b-b299-32c3e90991cc |
| user_id           | 5c7bdb6eb0504d54a619acf8375c08ce     |
| description       | None                                 |
| created_at        | 2016-03-29T21:14:03.000000           |
| share_proto       | NFS                                  |
| provider_location | None                                 |
| id                | 06cdccaf-93a0-4e57-9a39-79fb1929c649 |
| project_id        | cadd7139bc3148b8973df097c0911016     |
| size              | 1                                    |
| share_size        | 1                                    |
| name              | my_snapshot                          |
+-------------------+--------------------------------------+

显示快照的详细信息

使用 manila snapshot-show 查看快照的详细信息。指定快照 ID 或名称作为参数。

$ manila snapshot-show my_snapshot
+-------------------+--------------------------------------+
| Property          | Value                                |
+-------------------+--------------------------------------+
| status            | available                            |
| share_id          | e496ed61-8f2e-436b-b299-32c3e90991cc |
| user_id           | 5c7bdb6eb0504d54a619acf8375c08ce     |
| description       | None                                 |
| created_at        | 2016-03-29T21:14:03.000000           |
| share_proto       | NFS                                  |
| provider_location | None                                 |
| id                | 06cdccaf-93a0-4e57-9a39-79fb1929c649 |
| project_id        | cadd7139bc3148b8973df097c0911016     |
| size              | 1                                    |
| share_size        | 1                                    |
| name              | my_snapshot                          |
+-------------------+--------------------------------------+

注意

快照的 status 属性将从 creating 变为 available,只有当它存在于所有具有其 replica_state 属性设置为 activein_sync 的共享副本上时才会发生。

同样,共享副本的 replica_state 属性将从 out_of_sync 变为 in_sync,只有当所有 available 快照都存在于该副本上时才会发生。

计划故障转移

作为管理员,您可以使用 manila share-replica-resync 命令尝试在提升之前同步共享的 activenon-active 共享副本之间的数据。这将确保共享副本拥有最新的数据,并且可以安全地切换它们的关系。

$ manila share-replica-resync 38efc042-50c2-4825-a6d8-cba2a8277b28

注意

此命令没有输出。

更新属性

如果在更新数据或复制关系时发生错误(在 promotion 期间),共享文件系统服务可能无法确定共享副本的一致性或健康状况。可能需要管理员干预,以便根据需要对存储后端进行任何修复。在这种情况下,可以在共享文件系统服务内进行状态校正。

作为管理员,您可以

重置共享副本的 status 属性

使用 manila share-replica-reset-state 命令重置 status 属性。将共享副本的 ID 作为参数指定,并使用 --state 选项指定所需的状态。

$ manila share-replica-reset-state 38efc042-50c2-4825-a6d8-cba2a8277b28 --state=available

注意

此命令没有输出。

重置 replica_state 属性

使用 manila share-replica-reset-replica-state 命令重置 replica_state 属性。指定共享副本的 ID,并使用 --state 选项指定所需的状态。

$ manila share-replica-reset-replica-state 38efc042-50c2-4825-a6d8-cba2a8277b28 --state=out_of_sync

注意

此命令没有输出。

强制删除处于任何状态的指定共享副本

使用带有 ‘–force’ 键的 manila share-replica-delete 命令删除共享副本,无论其处于何种状态。

$ manila share-replica-show 9513de5d-0384-4528-89fb-957dd9b57680
+-------------------+--------------------------------------+
| Property          | Value                                |
+-------------------+--------------------------------------+
| status            | error                                |
| share_id          | e496ed61-8f2e-436b-b299-32c3e90991cc |
| availability_zone | availability_zone_1                  |
| created_at        | 2016-03-30T01:32:47.000000           |
| updated_at        | 2016-03-30T01:34:25.000000           |
| share_network_id  | None                                 |
| share_server_id   | None                                 |
| host              | openstack4@zfsonlinux_1#alpha        |
| replica_state     | out_of_sync                          |
| id                | 38efc042-50c2-4825-a6d8-cba2a8277b28 |
+-------------------+--------------------------------------+

$ manila share-replica-delete --force 38efc042-50c2-4825-a6d8-cba2a8277b28

注意

此命令没有输出。

使用 policy.yaml 文件授予其他角色执行这些操作的权限。

删除共享副本

使用带有共享副本 ID 的 manila share-replica-delete 命令删除共享副本。

$ manila share-replica-delete 38efc042-50c2-4825-a6d8-cba2a8277b28

注意

此命令没有输出。

注意

您不能使用此命令删除最后一个 active 副本。您应该使用 manila delete 命令删除共享。