注意

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

Multisite Sync Policy

Octopus 版本中的新增功能。

多站点存储桶粒度同步策略提供在不同区域的存储桶之间数据移动的细粒度控制。它扩展了区域同步机制。以前存储桶是对称处理的,即每个(数据)区域都持有该存储桶的镜像,该镜像应与其他所有区域相同。而利用存储桶粒度同步策略,存储桶可以出现分歧,并且一个存储桶可以从不共享其名称或其 ID 的其他存储桶(位于不同区域)中拉取数据。因此,同步过程假设存储桶同步源和存储桶同步目标始终引用相同的存储桶,现在情况已不再如此。

同步策略取代了旧的区域组粗配置(sync_from*)。同步策略可以在区域组级别配置(如果配置了它,则替换旧样式配置),也可以在存储桶级别配置。

在同步策略中可以定义多个组,这些组可以包含数据流配置列表和管道配置列表。数据流定义了不同区域之间的数据流。它可以定义对称数据流,其中多个区域相互同步数据,也可以定义方向性数据流,其中数据从一个区域单向移动到另一个区域。

管道定义了可以使用这些数据流的实际存储桶及其相关属性(例如:源对象前缀)。

同步策略组可以有 3 种状态:

描述

enabled

允许并启用同步

allowed

允许同步

forbidden

不允许同步(由此组定义的同步),可以覆盖其他组

策略可以在存储桶级别定义。存储桶级别的同步策略继承区域组策略的数据流,并且只能定义区域组允许的子集。

通配符区域和政策中的通配符存储桶参数定义所有相关区域或所有相关存储桶。在存储桶策略的上下文中,它表示当前的存储桶实例。整个区域镜像的灾难恢复配置不需要在存储桶上配置任何内容。但是,对于细粒度的存储桶同步,最好在区域组级别(例如,使用通配符)允许管道被同步,但在存储桶级别启用特定的同步()。如果需要,存储桶级别的策略可以将数据移动限制到特定的相关区域。status=allowed) them at the zonegroup level (e.g., using wildcards), but only enable the specific sync at the bucket level (status=enabled). If needed, the policy at the bucket level can limit the data movement to specific relevant zones.

重要

对区域组策略的任何更改都需要在区域组主区域应用,并且需要定期更新和提交。对存储桶策略的更改需要在区域组主区域应用。更改由 RGW 动态处理。

S3 复制 API

S3 存储桶复制 API 也已实现,并允许用户在不同存储桶之间创建复制规则。请注意,虽然 AWS 复制功能允许在同一区域内复制存储桶,但 RGW 目前不允许这样做。然而,RGW API 还添加了一个新的“区域”数组,允许用户选择将特定存储桶同步到哪些区域。

同步策略控制参考

获取同步策略

要检索当前的区域组同步策略或特定存储桶策略:

radosgw-admin sync policy get [--bucket=<bucket>]

创建同步策略组

要创建同步策略组:

radosgw-admin sync group create [--bucket=<bucket>] \
                                  --group-id=<group-id> \
                                  --status=<enabled | allowed | forbidden>

修改同步策略组

要修改同步策略组:

radosgw-admin sync group modify [--bucket=<bucket>] \
                                  --group-id=<group-id> \
                                  --status=<enabled | allowed | forbidden>

显示同步策略组

要显示同步策略组:

radosgw-admin sync group get [--bucket=<bucket>] \
                               --group-id=<group-id>

删除同步策略组

要删除同步策略组:

radosgw-admin sync group remove [--bucket=<bucket>] \
                                  --group-id=<group-id>

创建同步流

要创建或更新方向性同步流:

radosgw-admin sync group flow create [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --flow-id=<flow-id> \
                                       --flow-type=directional \
                                       --source-zone=<source_zone> \
                                       --dest-zone=<dest_zone>

要创建或更新对称同步流:

radosgw-admin sync group flow create [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --flow-id=<flow-id> \
                                       --flow-type=symmetrical \
                                       --zones=<zones>

其中区域是逗号分隔的需要添加到流的所有区域的列表。

删除同步流区域

要删除方向性同步流:

radosgw-admin sync group flow remove [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --flow-id=<flow-id> \
                                       --flow-type=directional \
                                       --source-zone=<source_zone> \
                                       --dest-zone=<dest_zone>

要从对称同步流中删除特定区域:

radosgw-admin sync group flow remove [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --flow-id=<flow-id> \
                                       --flow-type=symmetrical \
                                       --zones=<zones>

其中区域是需要从流中删除的所有区域的逗号分隔列表。

要删除对称同步流:

radosgw-admin sync group flow remove [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --flow-id=<flow-id> \
                                       --flow-type=symmetrical

创建同步管道

要创建同步组管道或更新其参数:

radosgw-admin sync group pipe create [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --pipe-id=<pipe-id> \
                                       --source-zones=<source_zones> \
                                       [--source-bucket=<source_buckets>] \
                                       [--source-bucket-id=<source_bucket_id>] \
                                       --dest-zones=<dest_zones> \
                                       [--dest-bucket=<dest_buckets>] \
                                       [--dest-bucket-id=<dest_bucket_id>] \
                                       [--prefix=<source_prefix>] \
                                       [--prefix-rm] \
                                       [--tags-add=<tags>] \
                                       [--tags-rm=<tags>] \
                                       [--dest-owner=<owner>] \
                                       [--storage-class=<storage_class>] \
                                       [--mode=<system | user>] \
                                       [--uid=<user_id>]

区域是区域列表,或“*”(通配符)。通配符区域表示任何匹配同步流规则的区域。存储桶是存储桶名称,或“*”(通配符)。通配符存储桶表示当前存储桶。前缀可以定义以过滤源对象。标签通过逗号分隔的“key=value”列表传递。目标所有者可以设置为强制对象的目标所有者。如果选择用户模式,则只能设置目标存储桶的所有者。目标存储类别也可以配置。用户 ID 可以设置为用户模式,并且将是执行同步操作的用户(用于权限验证)。

删除同步管道

要删除特定的同步组管道参数或整个管道:

radosgw-admin sync group pipe remove [--bucket=<bucket>] \
                                       --group-id=<group-id> \
                                       --pipe-id=<pipe-id> \
                                       [--source-zones=<source_zones>] \
                                       [--source-bucket=<source_buckets>] \
                                       [--source-bucket-id=<source_bucket_id>] \
                                       [--dest-zones=<dest_zones>] \
                                       [--dest-bucket=<dest_buckets>] \
                                       [--dest-bucket-id=<dest_bucket_id>]

同步信息

要获取有关预期同步源和目标的(由同步策略定义的)信息:

radosgw-admin sync info [--bucket=<bucket>] \
                          [--effective-zone-name=<zone>]

由于存储桶可以定义一个策略,该策略定义了从其向不同区域的另一个存储桶的数据移动,因此在创建策略时,我们还会生成一个存储桶依赖列表,这些列表在同步任何特定存储桶时用作提示。存储桶引用另一个存储桶并不意味着它实际上同步到/来自它,因为数据流可能不允许这样做。

示例

这些示例中的系统包括 3 个区域:us-east(主区域),us-west, us-west-2.

示例 1:两个区域,完全镜像

这与旧的(Octopus 之前的)同步功能类似,但通过新的同步策略引擎完成。请注意,对区域组同步策略的更改需要定期更新和提交。

radosgw-admin sync group create --group-id=group1 --status=allowed
radosgw-admin sync group flow create --group-id=group1 \
                                                --flow-id=flow-mirror --flow-type=symmetrical \
                                                --zones=us-east,us-west
radosgw-admin sync group pipe create --group-id=group1 \
                                                --pipe-id=pipe1 --source-zones='*' \
                                                --source-bucket='*' --dest-zones='*' \
                                                --dest-bucket='*'
radosgw-admin sync group modify --group-id=group1 --status=enabled
radosgw-admin period update --commit
radosgw-admin sync info --bucket=buck
{
    "sources": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-east",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "params": {
                ...
            }
        }
    ],
    "dests": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-east",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        }
    ],
    ...
    }
}

请注意,输出中的“id”字段反映了生成该条目的管道规则,单个规则可以生成多个同步条目,如示例所示。

radosgw-admin sync info --bucket=buck
{
    "sources": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-east",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        }
    ],
    "dests": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-east",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        }
    ],
    ...
}

示例 2:方向性,整个区域备份

这也与旧的同步功能类似。在这里我们添加了第三个区域,us-west-2它将是us-west的副本,但数据不会从它复制回来。

radosgw-admin sync group flow create --group-id=group1 \
                                                --flow-id=us-west-backup --flow-type=directional \
                                                --source-zone=us-west --dest-zone=us-west-2
radosgw-admin period update --commit

注意us-west有两个目标:

radosgw-admin sync info --bucket=buck
{
    "sources": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-east",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        }
    ],
    "dests": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-east",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        },
        {
            "id": "pipe1",
            "source": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-west-2",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        }
    ],
    ...
}

us-west-2只有源而没有目标:

radosgw-admin sync info --bucket=buck
{
    "sources": [
        {
            "id": "pipe1",
            "source": {
                "zone": "us-west",
                "bucket": "buck:115b12b3-....4409.1"
            },
            "dest": {
                "zone": "us-west-2",
                "bucket": "buck:115b12b3-....4409.1"
            },
            ...
        }
    ],
    "dests": [],
    ...
}

示例 3:镜像特定存储桶

使用相同的组配置,但这次将其切换到allowed状态,这意味着允许同步但未启用。

radosgw-admin sync group modify --group-id=group1 --status=allowed
radosgw-admin period update --commit

我们将为现有存储桶buck2创建存储桶级别策略规则。请注意,在设置此策略之前,存储桶必须存在,修改存储桶策略的管理命令需要在主区域运行,但是,它们不需要定期更新。不需要更改数据流,因为它继承自区域组策略。存储桶策略流将仅是区域组策略中定义的流的子集。管道也是如此,尽管存储桶策略可以启用在区域组策略中未启用(尽管未禁止)的管道。

radosgw-admin sync group create --bucket=buck2 \
                                           --group-id=buck2-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck2 \
                                                --group-id=buck2-default --pipe-id=pipe1 \
                                                --source-zones='*' --dest-zones='*'

示例 4:限制存储桶同步到特定区域

这将仅同步buck3tous-east(从任何允许同步到us-east).

radosgw-admin sync group create --bucket=buck3 \
                                           --group-id=buck3-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck3 \
                                                --group-id=buck3-default --pipe-id=pipe1 \
                                                --source-zones='*' --dest-zones=us-east

示例 5:从不同存储桶同步

请注意,存储桶同步目前仅在区域之间工作,而在同一区域内不工作。

buck4buck5:

radosgw-admin sync group create --bucket=buck4 \
                                           --group-id=buck4-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck4 \
                                                --group-id=buck4-default --pipe-id=pipe1 \
                                                --source-zones='*' --source-bucket=buck5 \
                                                --dest-zones='*'

拉取数据也可以限制到特定区域,例如,以下内容将仅同步来自us-west:

radosgw-admin sync group pipe modify --bucket=buck4 \
                                                --group-id=buck4-default --pipe-id=pipe1 \
                                                --source-zones=us-west --source-bucket=buck5 \
                                                --dest-zones='*'

检查buck5onus-west的同步信息很有趣:

radosgw-admin sync info --bucket=buck5
{
    "sources": [],
    "dests": [],
    "hints": {
        "sources": [],
        "dests": [
            "buck4:115b12b3-....14433.2"
        ]
    },
    "resolved-hints-1": {
        "sources": [],
        "dests": [
            {
                "id": "pipe1",
                "source": {
                    "zone": "us-west",
                    "bucket": "buck5"
                },
                "dest": {
                    "zone": "us-east",
                    "bucket": "buck4:115b12b3-....14433.2"
                },
                ...
            },
            {
                "id": "pipe1",
                "source": {
                    "zone": "us-west",
                    "bucket": "buck5"
                },
                "dest": {
                    "zone": "us-west-2",
                    "bucket": "buck4:115b12b3-....14433.2"
                },
                ...
            }
        ]
    },
    "resolved-hints": {
        "sources": [],
        "dests": []
    }
}

请注意,存在解析提示,这意味着存储桶buck5发现关于buck4从它间接同步,而不是从自己的策略(buck5自身的策略为空)。

示例 6:同步到不同存储桶

相同的机制可以用于配置要同步到的数据(与之前的示例中的同步来自数据相反)。请注意,内部数据仍然从目标区域中的源拉取:

buck6buck5:

radosgw-admin sync group create --bucket=buck6 \
                                           --group-id=buck6-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck6 \
                                                --group-id=buck6-default --pipe-id=pipe1 \
                                                --source-zones='*' --source-bucket='*' \
                                                --dest-zones='*' --dest-bucket=buck5

“推送”数据 A wildcard bucket name means the current bucket in the context of bucket sync policy.

结合示例 5 中的配置,我们现在可以写入buck6onus-east,数据将同步到buck5onus-west,然后从那里将数据分布到buck4onus-east,并在us-west-2.

示例 7:源过滤器

buck8tobuck9同步,但仅当对象以foo/:

radosgw-admin sync group create --bucket=buck8 \
                                           --group-id=buck8-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck8 \
                                                --group-id=buck8-default --pipe-id=pipe-prefix \
                                                --prefix=foo/ --source-zones='*' --dest-zones='*' \
                                                --dest-bucket=buck9

开头时。 Also sync frombuck8tobuck9任何具有标签color=bluecolor=red:

radosgw-admin sync group pipe create --bucket=buck8 \
                                                --group-id=buck8-default --pipe-id=pipe-tags \
                                                --tags-add=color=blue,color=red --source-zones='*' \
                                                --dest-zones='*' --dest-bucket=buck9

的对象。 And we can check the expected sync inus-east(例如):

radosgw-admin sync info --bucket=buck8
{
    "sources": [],
    "dests": [
        {
            "id": "pipe-prefix",
            "source": {
                "zone": "us-east",
                "bucket": "buck8:115b12b3-....14433.5"
            },
            "dest": {
                "zone": "us-west",
                "bucket": "buck9"
            },
            "params": {
                "source": {
                    "filter": {
                        "prefix": "foo/",
                        "tags": []
                    }
                },
                ...
            }
        },
        {
            "id": "pipe-tags",
            "source": {
                "zone": "us-east",
                "bucket": "buck8:115b12b3-....14433.5"
            },
            "dest": {
                "zone": "us-west",
                "bucket": "buck9"
            },
            "params": {
                "source": {
                    "filter": {
                        "tags": [
                            {
                                "key": "color",
                                "value": "blue"
                            },
                            {
                                "key": "color",
                                "value": "red"
                            }
                        ]
                    }
                },
                ...
            }
        }
    ],
    ...
}

请注意,没有源,只有两个不同的目标(每个配置一个)。当同步过程发生时,它将为每个同步的对象选择相关的规则。

前缀和标签可以组合,其中对象需要同时具有两者才能同步。还可以传递优先级参数,并且可以用来确定当有多个不同的规则匹配(并且具有相同的源和目标)时,使用哪个规则。

示例 8:目标参数:存储类别

可以配置目标对象的存储类别:

radosgw-admin sync group create --bucket=buck10 \
                                           --group-id=buck10-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck10 \
                                                --group-id=buck10-default \
                                                --pipe-id=pipe-storage-class \
                                                --source-zones='*' --dest-zones=us-west-2 \
                                                --storage-class=CHEAP_AND_SLOW

示例 9:目标参数:目标所有者转换

将目标对象的所有者设置为目标存储桶的所有者。这需要指定目标存储桶的 uid:

radosgw-admin sync group create --bucket=buck11 \
                                           --group-id=buck11-default --status=enabled
radosgw-admin sync group pipe create --bucket=buck11 \
                                                --group-id=buck11-default --pipe-id=pipe-dest-owner \
                                                --source-zones='*' --dest-zones='*' \
                                                --dest-bucket=buck12 --dest-owner=joe

示例 10:目标参数:用户模式

用户模式确保用户有权限读取对象,并将数据写入目标存储桶。这要求指定用户(在其上下文中执行操作)的 uid。

radosgw-admin sync group pipe modify --bucket=buck11 \
                                                --group-id=buck11-default --pipe-id=pipe-dest-owner \
                                                --mode=user --uid=jenny

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.