跟踪复制事件
复制允许您定义规则,以自动异步将对象从源存储区复制到 同一帐户 中的目标存储区。 此外,您可以将对象从一个存储区复制到 不同帐户 中的另一个存储区。
什么是复制?
复制将新创建的对象和对象更新从源存储区复制到目标存储区。
- 仅将新对象或现有对象的新版本 (在将复制规则添加到存储区之后创建) 复制到目标存储区。 可以 通过将现有对象复制到它们自己 来复制这些对象,从而创建复制的新版本。
- 源对象的元数据将应用于复制的对象。
- 两个存储区之间的双向复制要求规则在两个存储区上都处于活动状态。
- 过滤器 (由前缀和/或标记组成) 可用于将复制规则的作用域限定为仅应用于对象子集。 可以在单个策略中定义多个规则,并且这些规则可以指定不同的目标。 通过这种方式,可以将同一存储区中的不同对象复制到不同的目标。
为何使用复制?
- 将数据副本保存在不同地理位置的存储区中。
- 通过定义仅在允许的位置中存储副本的复制规则,满足数据主权合规性法规。
- 使生产和测试数据保持同步,因为复制会保留对象元数据,例如上次修改时间,版本标识等。
- 通过为目标存储区定义不同的存储类和/或生命周期规则,管理独立于源的复制对象的存储类和生命周期策略。 同样,您可以将副本存储在独立服务实例或甚至 IBM Cloud 帐户中的存储区中,还可以独立控制对副本的访问。
复制入门
要开始使用,必须满足以下一些先决条件:
- 在源存储区上设置
Writer
或Manager
平台角色,或者在分配了相应复制操作 (例如cloud-object-storage.bucket.put_replication
) 的情况下设置定制角色。 - 您不需要具有对目标存储区的访问权,但需要具有足够的平台角色来创建允许源存储区写入目标存储区的 新 IAM 策略。
- 目标存储区不得启用旧存储区防火墙,但可以使用 基于上下文的限制。
- 无法复制已加密的对象 使用 SSE-C,尽管 受管加密(SSE-KMS),例如 Key Protect 与复制完全兼容。
- 无法复制处于已归档状态的对象。
- 如果源存储区和目标存储区位于不同的 IBM 帐户中,请确保在每个帐户中创建存储区。
- 在源存储区和目标存储区上都启用 版本控制。
由于版本控制是复制的要求,因此无法复制使用 不可变 Object Storage 策略 配置的存储区中的对象。
使用一个 IBM 帐户
要在同一 IBM 帐户中的存储区之间复制对象,请执行以下操作:
- 浏览到所选源存储区后,单击 配置 选项卡。
- 查找 存储区复制,然后单击 设置复制 按钮。
- 选择 复制源,然后单击 下一步。
- 从下拉菜单中选择实例和存储区。 或者,将单选按钮切换为 否 并粘贴到目标存储区的 CRN 中。
- 单击 检查许可权 按钮。
现在,您需要授予源存储区 Writer
对目标存储区的许可权。 有多种方法可以执行此操作,但最简单的方法是使用 IBM Cloud Shell 和 IBM Cloud CLI。
- 在新窗口或选项卡中打开 IBM Cloud Shell。
- 复制对象存储控制台中显示的 IBM Cloud CLI 命令,并将其粘贴到新 shell 中。
- 返回到存储区配置窗口或选项卡,然后再次单击 检查许可权 按钮。
现在,您将创建复制规则。
- 确保规则状态单选按钮设置为 已启用。
- 为规则提供名称和优先级,以及将限制受复制规则约束的对象的任何前缀或标记过滤器。
- 单击完成。
使用不同的 IBM 帐户
要在不同 IBM 帐户中的存储区之间复制对象,请执行以下操作:
- 在目标 IBM 帐户上设置 IAM 策略。 有关创建 IAM 策略的信息,请参阅 哪些是 IAM 策略以及谁可以分配这些策略。
- 在“存储区配置”页面上查找 CRN 格式的帐户标识和服务实例标识。
- 使用目标帐户的 IBM Cloud UI,单击 管理>访问权 (IAM)。
- 单击左侧面板中的 认证。
- 单击 创建 以创建新的 IAM 策略。
- 授予服务授权页面配置。 这是您在创建新的 IAM 策略后将在其中使用的页面。
- 选择 其他帐户 并提供源帐户的帐户标识。
- 以 Cloud Object Storage 身份提供服务访问权。
- 在“访问范围”中,选择 特定资源。
- 选择 源服务实例,然后输入源存储区的服务实例标识。
- 在“目标”下,选择 Cloud Object Storage 以进行源存储区访问。
- 对于“目标作用域”,选择 特定资源> * *Service Instance。
- 从下拉菜单中选择目标帐户的服务实例标识。
- 根据需要选择角色 对象写程序 或 写程序。
对象写程序 角色足以启用复制。
术语
源存储区: 为其配置复制策略的存储区。 它是复制对象的源。
目标存储区: 定义为源存储区复制策略中的目标的存储区。 它是复制对象的目标。 也称为“目标”存储区。
副本: 由于向源存储区发出请求而在目标存储区中创建的新对象。
复制了哪些内容?
通过 CopyObject
,PutObject
或 CompleteMultipartUpload
创建的新对象将从源存储区复制到目标存储区。 复制的对象将从源对象继承以下元数据字段: Etag
,Last Modified Time
,Version ID
,user-attributes
和 Tags
。
如果由复制策略配置,那么将复制删除标记。
对版本标记的更新将从源存储区复制到目标存储区。
未复制以下内容:
- 由生命周期事件启动的操作
- 直接写入归档的对象
- 从归档层复原的对象
- 通过 SSE-C 加密的对象
- 对象 ACL
- 对象-锁定状态
使用复制实现业务连续性和灾难恢复
在发生中断时,可以使用复制来提供服务的连续性:
- 确保源存储区和目标存储区位于不同的位置。
- 验证两个存储区之间是否同步了最新版本的对象。
Rclone
(rclone check
命令) 之类的工具可用于从命令行检查同步性。 - 发生中断时,可以将应用程序的流量重定向到目标存储区。
一致性和数据完整性
虽然 IBM Cloud Object Storage 为所有数据 IO 操作提供强大的一致性,但存储区配置最终是一致的。 首次在存储区上启用复制规则后,配置可能需要一些时间才能在系统和新对象之间进行传播以开始复制。
IAM 操作
存在与复制关联的新 IAM 操作。
IAM 操作 | 角色 |
---|---|
cloud-object-storage.bucket.get_replication |
管理者、写入者和读取者 |
cloud-object-storage.bucket.put_replication |
管理者和写入者 |
cloud-object-storage.bucket.delete_replication |
管理者和写入者 |
Activity Tracker 事件
复制会生成其他事件。
cloud-object-storage.bucket-replication.create
cloud-object-storage.bucket-replication.read
cloud-object-storage.bucket-replication.delete
cloud-object-storage.object-replication.sync
(在源中生成)cloud-object-storage.object-replication.create
(在目标上生成)
对于 cloud-object-storage.bucket-replication.create
事件,以下字段提供额外的信息:
字段 | 描述 |
---|---|
requestData.replication.num_sync_remote_buckets |
在存储区复制规则中指定的目标存储区数。 |
requestData.replication.failed_remote_sync |
复制检查失败的存储区的 CRN。 |
当复制处于活动状态时,对对象执行的操作可能会生成以下额外信息:
字段 | 描述 |
---|---|
requestData.replication.replication_throttled |
指示对象的复制是否由于调速机制而在源上延迟。 |
requestData.replication.destination_bucket_id |
目标存储区的 CRN。 |
requestData.replication.sync_type |
同步操作的类型。 content 同步指示已将对象数据 和 任何元数据写入目标,metadata 同步指示仅将元数据写入目标,delete 同步指示仅将删除标记写入目标。 |
responseData.replication.source_bucket_id |
源存储区的 CRN。 |
responseData.replication.result |
值可以是 success ,failure (指示服务器错误),user (指示用户错误)。 |
responseData.replication.message |
HTTP 响应消息 (例如 OK )。 |
您可以从将对象写入源时开始跟踪该对象,直到在目标上写入该对象为止。 搜索与对象写相关联的请求标识,应显示三个事件:
- 原始
PUT
。 - 来自源的同步请求。
- 目标上的
PUT
请求。
这三个缺失值中的任何一个表示发生故障。
使用情况和会计
所有副本都是对象本身,并且 添加用法 与任何其他数据一样。 成功复制会导致计费 PUT
,GET
和 HEAD
请求,但不会对复制过程中使用的任何带宽进行计费。
复制会生成用于 IBM Cloud Monitoring的其他度量值:
ibm_cos_bucket_replication_sync_requests_issued
ibm_cos_bucket_replication_sync_requests_received
交互
版本控制
必须进行版本控制才能启用复制。 在源存储区和目标存储区上 启用版本控制 并在源存储区上配置复制后,可能会迂到以下问题:
- 如果尝试在源存储区上禁用版本控制,那么 Object Storage 将返回错误。 必须先除去复制配置,然后才能在源存储区上禁用版本控制。
- 如果在目标存储区上禁用版本控制,那么复制将失败。
Key Protect 加密
源对象将 使用源存储区的根密钥进行加密,副本将使用目标存储区的根密钥进行加密。
生命周期配置
如果在目标存储区上启用了 生命周期策略,那么生命周期操作将基于源对象的原始创建时间,而不是基于副本在目标存储区中变为可用的时间。
不可变对象存储器
在启用了 版本控制 的存储区上不可能使用保留策略,并且由于版本控制是复制的需求,因此无法在启用了不可变 Object Storage 的存储区中复制对象。
旧存储区防火墙
使用 旧防火墙来限制基于 IP 地址的访问 的存储区无法使用复制,因为复制对象的后台服务没有固定 IP 地址,并且无法通过防火墙。
建议改为 使用基于上下文的限制 来根据网络信息控制访问。
Cloud Functions 和 Code Engine
此时配置复制不会提供 Cloud Functions 的触发器 或 Code Engine 事件,但对象写入和删除将为源存储区和目标存储区创建 Object:Write
和 Object:Delete
通知。 这些事件使用 notifications.replication_type
字段进行注释,该字段指示事件是触发了同步,还是由同步触发。
复制现有对象
复制规则只能对 在 配置规则并将其应用于存储区之后写入的对象执行操作。 如果存储区中存在应复制的现有对象,那么需要使复制过程了解这些对象是否存在。 通过使用 PUT copy
操作将对象复制到自身,可以轻松完成此操作。
此过程将重置一些对象元数据,包括创建时间戳记。 这将影响生命周期策略以及使用创建或修改时间戳记 (例如内容交付网络) 的任何其他服务。 确保适当处理重置对象元数据可能引起的任何中断。
这一进程涉及:
- 创建存储区中应遵循复制规则的所有对象的列表,
- 对该列表进行迭代,对每个对象执行
PUT copy
操作,其中源与请求的目标相同。
此示例将仅复制由 PUT copy
请求创建的对象的新版本。 为了复制对象的所有版本,还需要复制每个单独的版本。
以下示例使用 Python编写,但可以在任何编程语言或上下文中应用该算法。
import os
import sys
import ibm_boto3
from ibm_botocore.config import Config
# Create client connection
cos = ibm_boto3.client("s3",
ibm_api_key_id=os.environ.get('IBMCLOUD_API_KEY'),
ibm_service_instance_id=os.environ['SERVICE_INSTANCE_ID'],
config=Config(signature_version="oauth"),
endpoint_url=os.environ['US_GEO']
)
# Define the bucket with existing objects for replication
bucket = os.environ['BUCKET']
def copy_in_place(BUCKET_NAME):
print("Priming existing objects in " + bucket + " for replication...")
paginator = cos.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=bucket)
for page in pages:
for obj in page['Contents']:
key = obj['Key']
print(" * Copying " + key + " in place...")
try:
headers = cos.head_object(
Bucket=bucket,
Key=key
)
md = headers["Metadata"]
cos.copy_object(
CopySource={
'Bucket': bucket,
'Key': key
},
Bucket=bucket,
Key=key,
TaggingDirective='COPY',
MetadataDirective='REPLACE',
Metadata=md
)
print(" Success!")
except Exception as e:
print(" Unable to copy object: {0}".format(e))
print("Existing objects in " + bucket + " are now subject to replication rules.")
copy_in_place(bucket)
REST API 示例
使用 cURL 显示了以下示例以方便使用。 环境变量用于表示特定于用户的元素,例如 $BUCKET
,$TOKEN
和 $REGION
。 请注意,$REGION
还将包含任何网络类型规范,因此使用专用网络向 us-south
中的存储区发送请求将需要将变量设置为 private.us-south
。
在存储区上启用复制
复制配置在请求主体中以 XML 形式提供。 新请求将覆盖存储区上存在的任何现有复制规则。
复制配置必须至少包含一个规则,并且最多可以包含 1,000 个规则。 每个规则通过过滤源存储区中的对象来标识要复制的对象子集。 要选择要复制的其他对象子集,请为每个子集添加规则。
要指定源存储区中要应用复制规则的对象的子集,请添加 Filter
元素作为 Rule
元素的子代。 您可以根据对象键前缀和/或一个或多个对象标记来过滤对象。 在配置中添加 Filter
元素时,还必须添加以下元素: DeleteMarkerReplication
,Status
和 Priority
。
头 | 类型 | 描述 |
---|---|---|
Content-MD5 |
字符串 | 必需:有效内容的 Base64 编码的 128 位 MD5 散列,用作完整性检查,可确保有效内容在传输中未变更。 |
请求主体必须包含具有以下模式的 XML 块:
元素 | 类型 | 子代 | 祖代 | 约束 |
---|---|---|---|---|
ReplicationConfiguration |
容器 | Rule |
无 | 限制为 1。 |
Rule |
容器 | ID , Status , Filter , DeleteMarkerReplication , Destination , Priority |
ReplicationConfiguration |
限制为 1000。 |
ID |
字符串 | 无 | Rule |
必须由 (a-z,A-Z0-9 ) 和以下符号组成: ! _ . * ' ( ) - |
Destination |
容器 | Bucket |
Rule |
限制为 1。 |
Bucket |
字符串 | 无 | Destination |
目标存储区的 CRN。 |
Priority |
整数 | 无 | Rule |
优先级与每个规则相关联。 可能存在多个规则可能适用于上载的对象的情况。 在这些情况下,对象存储器将在复制该对象时应用具有较高优先级的适用规则。 因此,只能将单个复制规则应用于任何对象,而不管复制策略中有多少规则可能与该对象匹配。 请注意,数字越大,优先级越高。 |
Status |
字符串 | 无 | Rule |
指定是否启用规则。 有效值为 Enabled 或 Disabled 。 |
DeleteMarkerReplication |
容器 | Status |
Rule |
限制为 1。 |
Status |
字符串 | 无 | DeleteMarkerReplication |
指定对象存储器是否复制删除标记。 有效值为 Enabled 或 Disabled 。 |
Filter |
字符串 | Prefix , Tag , AND |
Rule |
用于标识复制规则所应用于的对象子集的过滤器。 Filter 必须正好指定一个 Prefix ,Tag 或 And 子元素。 |
Prefix |
字符串 | 无 | Filter |
对象键名称前缀,用于标识应用规则的对象子集。 |
Tag |
字符串 | 无 | Filter |
用于指定标记键和值的容器。 此规则仅适用于在其标记集中具有该标记的对象。 |
And |
字符串 | 无 | Filter |
用于指定规则过滤器的容器。 过滤器确定应用规则的对象子集。 仅当指定了多个过滤器时,此元素才是必需的。 |
Key |
字符串 | 无 | Tag |
标记键。 |
Value |
字符串 | 无 | Tag |
标记值。 |
此示例将复制任何新对象,但不会复制删除标记。
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Priority>1</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Disabled</Status>
</DeleteMarkerReplication>
<Filter/>
<Destination>
<Bucket>$DESTINATION_CRN</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
此示例将具有以 project_a/
开头的键 (名称) 的任何对象复制到以 $DESTINATION_CRN_A
标识的存储区,具有以 project_b/
开头的键 (名称) 的任何对象复制到以 $DESTINATION_CRN_B
标识的存储区,具有具有键 Client
和值 ACME
的对象标记的任何对象复制到以
$DESTINATION_CRN_C
标识的第三个存储区,并且将在所有情况下复制删除标记。
假定将以下四个对象添加到源存储区。 它们将复制到目标存储区,如下所述:
project_a/foo.mp4
project_a/bar.mp4
project_b/baz.pdf
project_b/acme.pdf
。此第四个对象还具有键为Client
且值为ACME
的对象标记。
由于以下规则,对象 1 和 2 将复制到 $DESTINATION_CRN_A
。 对象 3 将复制到 $DESTINATION_CRN_B
。 对象 4 将仅复制到 $DESTINATION_CRN_C
,因为标识为 AcmeCorp
的规则具有比标识为 ProjectB
的规则更高的优先级值,并且当它满足这两个规则的需求时,将仅受前者的约束。
curl -X "PUT" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN' \
-H 'Content-MD5: exuBoz2kFBykNwqu64JZuA==' \
-H 'Content-Type: text/plain; charset=utf-8' \
-d $'<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>ProjectA</ID>
<Priority>10</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_a/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_A</Bucket>
</Destination>
</Rule>
<Rule>
<ID>ProjectB</ID>
<Priority>5</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Prefix>project_b/</prefix>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_B</Bucket>
</Destination>
</Rule>
<Rule>
<ID>AcmeCorp</ID>
<Priority>20</Priority>
<Status>Enabled</Status>
<DeleteMarkerReplication>
<Status>Enabled</Status>
</DeleteMarkerReplication>
<Filter>
<Tag>
<Key>Client</Key>
<Value>ACME</Value>
</Tag>
</Filter>
<Destination>
<Bucket>$DESTINATION_CRN_C</Bucket>
</Destination>
</Rule>
</ReplicationConfiguration>'
成功的请求返回 200
响应。
查看存储区的复制配置
curl -X "GET" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
这将返回具有相应模式的 XML 响应主体:
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Rule>
<ID>SimpleReplication</ID>
<Status>ENABLED</Status>
<DeleteMarkerReplication>
<Status>DISABLED</Status>
</DeleteMarkerReplication>
<Destination>
<Bucket>crn:v1:bluemix:public:cloud-object-storage:global:a/9978e07eXXXXXXXX66c89c428028654:ef1c725e-XXXX-4967-bcc1-734c03a2b846:bucket:replication-destination</Bucket>
</Destination>
<Priority>1</Priority>
<Filter/>
</Rule>
</ReplicationConfiguration>
删除存储区的复制配置
curl -X "DELETE" "https://$BUCKET.s3.$REGION.cloud-object-storage.appdomain.cloud/?replication" \
-H 'Authorization: bearer $TOKEN'
成功的请求返回 204
响应。
SDK 示例
以下示例使用 IBM COS SDK for Python 和 Node.js,尽管对象版本控制的实现应该与允许设置定制端点的任何 S3-compatible 库或工具完全兼容。 使用第三方工具需要 HMAC 凭证来计算 AWS V4 签名。 有关 HMAC 凭证的更多信息,请参阅 文档。
Python
可以使用 低级客户机 语法来启用使用 IBM COS SDK for Python 的版本控制。
使用客户机:
#!/usr/bin/env python3
import ibm_boto3
from ibm_botocore.config import Config
from ibm_botocore.exceptions import ClientError
# Define constants
API_KEY = os.environ.get('IBMCLOUD_API_KEY')
SERVICE_INSTANCE = os.environ.get('SERVICE_INSTANCE_ID')
ENDPOINT = os.environ.get('ENDPOINT')
BUCKET = "my-replication-bucket" # The bucket that will enable replication.
# Create resource client with configuration info pulled from environment variables.
cosClient = ibm_boto3.client("s3",
ibm_api_key_id=API_KEY,
ibm_service_instance_id=SERVICE_INSTANCE,
config=Config(signature_version="oauth"),
endpoint_url=ENDPOINT
)
response = cosClient.put_bucket_versioning(
Bucket=BUCKET,
ReplicationConfiguration={
'Rules': [
{
'ID': 'string',
'Priority': 123,
'Filter': {
'Prefix': 'string',
'Tag': {
'Key': 'string',
'Value': 'string'
},
'And': {
'Prefix': 'string',
'Tags': [
{
'Key': 'string',
'Value': 'string'
},
]
}
},
'Status': 'Enabled'|'Disabled',
'Destination': {
'Bucket': 'string',
},
'DeleteMarkerReplication': {
'Status': 'Enabled'|'Disabled'
}
},
]
}
)
使用同一客户机列出对象的版本:
resp = cosClient.list_object_versions(Prefix='some-prefix', Bucket=BUCKET)
请注意,Python API 非常灵活,并且有许多不同的方法来完成同一任务。
Node.js
使用 IBM COS SDK for Node.js 启用版本控制:
const IBM = require('ibm-cos-sdk');
var config = {
endpoint: '<endpoint>',
apiKeyId: '<api-key>',
serviceInstanceId: '<resource-instance-id>',
};
var cos = new IBM.S3(config);
var params = {
Bucket: 'STRING_VALUE', /* required */
ReplicationConfiguration: { /* required */
Role: 'STRING_VALUE', /* required */
Rules: [ /* required */
{
Destination: { /* required */
Bucket: 'STRING_VALUE', /* required */
},
Status: Enabled | Disabled, /* required */
Filter: {
And: {
Prefix: 'STRING_VALUE',
Tags: [
{
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
},
/* more items */
]
},
Prefix: 'STRING_VALUE',
Tag: {
Key: 'STRING_VALUE', /* required */
Value: 'STRING_VALUE' /* required */
}
},
ID: 'STRING_VALUE',
Prefix: 'STRING_VALUE',
Priority: 'NUMBER_VALUE',
}
}
]
},
ContentMD5: 'STRING_VALUE',
};
cos.putBucketReplication(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});