注意
本文档适用于 Ceph 的开发版本。
多站点同步策略
自 Octopus 版本起新增。
多站点存储桶粒度同步策略提供了对不同区域中存储桶之间数据移动的精细控制。它扩展了区域同步机制。以前,存储桶被对称对待,即每个(数据)区域都拥有该存储桶的镜像,并且该镜像应与所有其他区域相同。而利用存储桶粒度同步策略,存储桶可以不同步,并且存储桶可以从不同区域中的其他存储桶(不共享其名称或 ID 的存储桶)拉取数据。因此,同步过程以前假设存储桶同步源和存储桶同步目标始终引用同一个存储桶,现在情况不再如此。
同步策略取代了旧的区域组粗略配置(sync_from*)。同步策略可以在区域组级别配置(如果配置了,它将替换旧式配置),但也可以在存储桶级别配置。
在同步策略中,可以定义多个组,这些组可以包含数据流配置列表,以及管道配置列表。数据流定义了不同区域之间的数据流。它可以定义对称数据流,其中多个区域相互同步数据;它也可以定义定向数据流,其中数据从一个区域单向移动到另一个区域。
管道定义了可以使用这些数据流的实际存储桶,以及与其关联的属性(例如:源对象前缀)。
同步策略组可以处于 3 种状态
值 |
描述 |
|---|---|
|
允许并启用同步 |
|
允许同步 |
|
不允许同步(由该组定义)并且可以覆盖其他组 |
策略可以在存储桶级别定义。存储桶级别同步策略继承区域组策略的数据流,并且只能定义区域组允许的子集。
策略中的通配符区域和通配符存储桶参数定义所有相关区域或所有相关存储桶。在存储桶策略的上下文中,它表示当前的存储桶实例。整个区域镜像的灾难恢复配置不需要在存储桶上配置任何内容。但是,对于精细的存储桶同步,最好通过在区域组级别允许(status=allowed)同步管道(例如,使用通配符),但只在存储桶级别启用特定同步(status=enabled)来配置要同步的管道。如果需要,存储桶级别的策略可以将数据移动限制到特定的相关区域。
重要
对区域组策略的任何更改都需要在区域组主区域上应用,并且需要定期更新和提交。对存储桶策略的更改需要在区域组主区域上应用。这些更改由 RGW 动态处理。
S3 复制 API
S3 存储桶复制 API 也已实现,允许用户在不同存储桶之间创建复制规则。但请注意,虽然 AWS 复制功能允许在同一区域内进行存储桶复制,但 RGW 目前不允许。然而,RGW API 还添加了一个新的“Zone”数组,允许用户选择特定存储桶将同步到哪些区域。
同步策略控制参考
获取同步策略
检索当前的区域组同步策略,或特定的存储桶策略
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>
其中 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>
其中 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>]
Zones 是区域列表,或 '*'(通配符)。通配符区域表示符合同步流规则的任何区域。Buckets 是存储桶名称,或 '*'(通配符)。通配符存储桶表示当前的存储桶。可以定义 Prefix 来过滤源对象。Tags 通过逗号分隔的 'key=value' 列表传递。可以设置 Destination owner 来强制执行对象的目的地所有者。如果选择了用户模式,则只能设置目的地存储桶所有者。还可以配置 Destination storage class。可以为用户模式设置 User 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:限制存储桶同步到特定区域
这将只同步 buck3 到 us-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:从不同的存储桶同步
请注意,存储桶同步目前仅在区域之间工作,而不是在同一区域内工作。
设置 buck4 从 buck5 拉取数据
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='*'
检查 us-west 上的 buck5 的同步信息很有趣
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:同步到不同的存储桶
相同的机制可以用于配置数据同步到(与上一个示例中的从同步相反)。请注意,在内部,数据仍然从目标区域的源拉取
设置 buck6 “推送”数据到 buck5
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
通配符存储桶名称在存储桶同步策略的上下文中表示当前存储桶。
结合示例 5 中的配置,我们现在可以将数据写入 us-east 上的 buck6,数据将同步到 us-west 上的 buck5,然后从那里分发到 us-east 上的 buck4 和 us-west-2。
示例 7:源过滤器
从 buck8 同步到 buck9,但只同步以 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
同时从 buck8 同步到 buck9 任何具有标签 color=blue 或 color=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
我们可以检查 us-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"
}
]
}
},
...
}
}
],
...
}
请注意,没有任何源,只有两个不同的目的地(每个配置一个)。当同步过程发生时,它将为它同步的每个对象选择相关的规则。
前缀和标签可以组合,在这种情况下,对象需要同时具备两者才能同步。还可以传递 priority 参数,当匹配到多个不同规则(并且具有相同的源和目标)时,可用于确定使用哪个规则。
示例 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