
新鈦雲服已累計為您分享842篇技術乾貨

在本系列的第四部分中,我們深入探討了RGW S3端點的負載均衡技術。在第五部分中,我們將詳細介紹多站點同步策略功能。
在從 Quincy 開始的 Ceph 版本中,Ceph 物件儲存提供了細粒度的儲存桶級複製,提供了很多有用的功能。使用者可以啟用或停用每個儲存桶的同步,從而實現對複製工作流程的精確控制。這支援全區域複製,同時可以排除特定儲存桶的複製、將單個源儲存桶複製到多目標儲存桶,並實現對稱和定向資料流配置。下圖顯示了正在執行的同步策略功能的示例:

在我們之前的同步模型中,採用的是全區域同步(full zone sync),即所有資料和元資料都會在區域之間同步。而新的同步策略功能為我們提供了更高的靈活性和細粒度控制,允許我們按儲存桶(bucket)配置複製。
儲存桶同步策略主要應用於歸檔區域(archive zones)。從歸檔區域的資料移動是單向的,即所有物件可以從活躍區域(active zone)移動到歸檔區域,但不能從歸檔區域移動到活躍區域,因為歸檔區域是隻讀的。我們將在部落格系列的第六部分詳細討論歸檔區域。
以下是Quincy和Reef版本中提供的一些功能列表:
Quincy 版本功能:
-
一對一儲存桶複製
-
區域組(Zonegroup)級別的策略配置
-
儲存桶(Bucket)級別的策略配置
-
可配置的資料流 – 對稱模式
-
僅支援全新的多站點部署(Greenfield/New Multisite Deployments)
Reef 版本功能:
-
物件名稱過濾
-
從傳統的多站點同步(全區域複製)遷移到同步策略(區域組或儲存桶級別)
-
歸檔區域同步策略(按儲存桶啟用/停用複製到歸檔區域)
-
資料流 – 對稱或定向模式
-
部分使用者 S3 複製 API(GetBucketReplication、PutBucketReplication、DeleteBucketReplication)
-
支援不同儲存桶之間的同步(一對一或一對多)
-
目標引數修改:儲存類別(Storage Class)、目標所有者轉換、使用者模式
同步策略的核心概念:
在深入操作之前,我們需要理解以下同步策略的核心概念。同步策略由以下元件構成:
-
組(Groups):包含一個或多個組,每個組可以包含資料流配置列表。
-
資料流(Data-flow):定義區域之間複製資料的流向。可以配置為對稱資料流(多個區域同步資料),也可以配置為定向資料流(資料從一個區域單向傳輸到另一個區域)。
-
管道(Pipes):定義可以使用這些資料流的區域和儲存桶及其相關屬性。
同步策略組的三種狀態:
-
啟用(Enabled):同步被允許並啟用。啟用後,複製將開始。例如,我們可以啟用全區域組同步,然後按儲存桶停用(禁止)同步。
-
允許(Allowed):同步被允許,但不會自動開始。例如,我們可以將區域組策略配置為“允許”,然後按儲存桶啟用同步策略。
-
禁止(Forbidden):該組定義的同步不被允許。
配置級別:
同步策略(組、資料流和管道)可以在區域組和儲存桶級別配置。儲存桶的同步策略始終是其所屬區域組定義策略的子集。例如,如果在區域組級別不允許某種資料流,即使在儲存桶級別允許,該資料流也不會生效。更多關於預期行為的詳細資訊,請參考官方文件。
以下部分將解釋如何使用新的多站點同步策略功能。預設情況下,正如我們在本系列的第一篇文章中設定的那樣,多站點複製會將所有元資料和資料在區域組(zonegroup)內的所有區域之間進行復制。在本文的剩餘部分中,我們將這種同步方法稱為“傳統同步”。
正如我們在上一節中解釋的那樣,同步策略由組(group)、資料流(flow)和管道(pipe)組成。我們首先配置一個非常寬鬆的區域組策略,允許所有區域上的所有儲存桶進行雙向流量傳輸。配置完成後,我們將新增按儲存桶的同步策略,這些策略在設計上是區域組策略的子集,並具有更嚴格的規則集。
新增區域組策略
我們首先建立一個名為
group1
的新組,並將其狀態設定為“允許”(allowed)。回顧上一節的內容,區域組將允許同步流量流動。策略將被設定為“允許”而非“啟用”(enabled)。在“允許”狀態下,資料同步不會在區域組級別發生,目的是在按儲存桶的基礎上啟用同步。[root@ceph-node-00~]# radosgw-admin sync groupcreate--group-id=group1 --status=allowed --rgw-realm=multisite --rgw-zonegroup=multizg
建立對稱/雙向資料流
接下來,我們建立一個對稱/雙向資料流,允許資料在
zone1
和 zone2
之間雙向同步。[root@ceph-node-00~]# radosgw-admin sync group flow create--group-id=group1 --flow-id=flow-mirror --flow-type=symmetrical --zones=zone1,zone2
建立管道
最後,我們建立一個管道。在管道中,我們指定要使用的組 ID(
group-id
),然後為源和目標儲存桶及區域設定萬用字元 *
,這意味著所有區域和儲存桶都可以作為資料的源和目標進行復制。[root@ceph-node-00 ~]
更新區域組同步策略
區域組同步策略的修改需要更新週期(period),而儲存桶同步策略的修改則不需要更新週期。
[root@ceph-node-00~]# radosgw-admin periodupdate--commit
提交新週期(period)後,區域組內的所有資料同步將停止,因為我們的區域組策略設定為“允許”。如果將其設定為“啟用”,同步將繼續以與初始多站點配置相同的方式進行。
區域間的單儲存桶雙向同步
現在,我們可以按儲存桶啟用同步。我們將為現有的儲存桶
testbucket
建立一個儲存桶級別的策略規則。請注意,儲存桶必須在設定此策略之前存在,並且修改儲存桶策略的管理命令必須在主區域(master zone)上執行。不過,儲存桶同步策略不需要更新週期。資料流無需更改,因為它繼承自區域組策略。儲存桶策略的資料流只能是區域組策略中定義的流的子集,管道也是如此。
建立儲存桶:
[ ]
make_bucket: testbucket
建立一個bucket同步組,使用–bucket引數指定bucket並將狀態設定為enabled以便為我們的bucket testbucket啟用複製
[root@ceph-node-00~]# radosgw-admin sync groupcreate--bucket=testbucket --group-id=testbucket-1 --status=enabled
無需指定流,因為我們將從 zonegroup 繼承流,因此我們只需為儲存桶同步策略組定義一個名為testbucket-1管道。一旦應用此命令,該儲存桶的資料同步複製就會開始。
[root@ceph-node-00~]# radosgw-admin sync group pipe create--bucket=testbucket --group-id=testbucket-1 --pipe-id=test-pipe1 --source-zones='*' --dest-zones='*'
[!CAUTION]注意:您可以安全地忽略以下警告:WARNING: cannot find source zone id for name=*
使用
sync group get
命令,可以檢視組、流和管道配置。我們在區域組級別執行該命令,我們可以看到狀態是allowed
。"allowed"
我們在儲存桶級別執行sync group get命令並提供–bucket引數。在這種情況下, testbucket的狀態為Enabled :
[root@ceph-node-00~]# radosgw-admin sync groupget--bucket testbucket | jq .[0].val.status
"Enabled"
另一個有用的命令是sync info 。透過sync info ,我們可以預覽當前配置將實現的同步複製。因此,例如,在我們當前的區域組同步策略處於allowed狀態的情況下,區域組級別不會發生同步,因此同步資訊命令將不會顯示配置的任何源或目標。
[ ]
{
"sources": [],
"dests": [],
"hints": {
"sources": [],
"dests": []
},
"resolved-hints-1": {
"sources": [],
"dests": []
},
"resolved-hints": {
"sources": [],
"dests": []
}
}
我們還可以在儲存桶級別使用sync info命令,使用–bucket引數,因為我們已經配置了雙向管道。我們將使用zone2 -> zone1作為源,將zone1 -> zone2作為目的地。這意味著testbucket儲存桶上的複製發生在兩個方向。如果我們將一個物件從zone1放入testbucket ,它將被複制到zone2 ,如果我們將物件放入zone2它將被複制到zone1 。
[root@ceph-node-00 ~]# radosgw-admin sync info --bucket testbucket
{
"sources": [
{
"id": "test-pipe1",
"source": {
"zone": "zone2",
"bucket": "testbucket:89c43fae-cd94-4f93-b21c-76cd1a64788d.34553.1"
},
"dest": {
"zone": "zone1",
"bucket": "testbucket:89c43fae-cd94-4f93-b21c-76cd1a64788d.34553.1"
},
"params": {
"source": {
"filter": {
"tags": []
}
},
"dest": {},
"priority": 0,
"mode": "system",
"user": "user1"
}
}
],
"dests": [
{
"id": "test-pipe1",
"source": {
"zone": "zone1",
"bucket": "testbucket:89c43fae-cd94-4f93-b21c-76cd1a64788d.34553.1"
},
"dest": {
"zone": "zone2",
"bucket": "testbucket:89c43fae-cd94-4f93-b21c-76cd1a64788d.34553.1"
},
"params": {
"source": {
"filter": {
"tags": []
}
},
"dest": {},
"priority": 0,
"mode": "system",
"user": "user1"
}
}
],
因此,例如,如果我們只檢視源,可以看到它們會根據執行radosgw-admin命令的叢集而有所不同。例如,從cluster2 ( ceph-node04 ) 中,我們將zone1視為源:
[root@ceph-node-00 ~]# ssh ceph-node-04 radosgw-admin sync info --bucket testbucket | jq '.sources[].source, .sources[].dest'
{
"zone": "zone1",
"bucket": "testbucket:66df8c0a-c67d-4bd7-9975-bc02a549f13e.45330.2"
}
{
"zone": "zone2",
"bucket": "testbucket:66df8c0a-c67d-4bd7-9975-bc02a549f13e.45330.2"
}
在cluster1 ( ceph-node-00 ) 中,我們將zone2視為源:
[root@ceph-node-00 ~]# radosgw-admin sync info --bucket testbucket | jq '.sources[].source, .sources[].dest'
{
"zone": "zone2",
"bucket": "testbucket:66df8c0a-c67d-4bd7-9975-bc02a549f13e.45330.2"
}
{
"zone": "zone1",
"bucket": "testbucket:66df8c0a-c67d-4bd7-9975-bc02a549f13e.45330.2"
}
讓我們使用 AWS CLI 執行快速測試,以驗證配置並確認複製適用於testbucket 。我們將一個物件放入zone1並檢查它是否已複製到zone2 :
[root-node-00~]# aws --endpoint https://s3.zone1.cephlab.com:443 s3 cp /etc/hosts s3://testbucket/firsfile
upload: ../etc/hosts to s3://testbucket/firsfile
我們可以檢查同步是否已完成 radosgw-admin bucket sync checkpoint 命令:
[root@ceph-node-00 ~]# ssh ceph-node-04 radosgw-admin bucket sync checkpoint --bucket testbucket
2024-02-02T02:17:26.858-0500 7f3f38729800 1 bucket sync caught up with source:
local status: [, , , 00000000004.531.6, , , , , , , ]
remote markers: [, , , 00000000004.531.6, , , , , , , ]
2024-02-02T02:17:26.858-0500 7f3f38729800 0 bucket checkpoint complete
檢查同步狀態的另一種方法是使用 radosgw-admin bucket sync status 命令:
[root@ceph-node-00 ~]# radosgw-admin bucket sync status --bucket=testbucket
realm beeea955-8341-41cc-a046-46de2d5ddeb9 (multisite)
zonegroup 2761ad42-fd71-4170-87c6-74c20dd1e334 (multizg)
zone 66df8c0a-c67d-4bd7-9975-bc02a549f13e (zone1)
bucket :testbucket[66df8c0a-c67d-4bd7-9975-bc02a549f13e.37124.2])
current time 2024-02-02T09:07:42Z
source zone 7b9273a9-eb59-413d-a465-3029664c73d7 (zone2)
source bucket :testbucket[66df8c0a-c67d-4bd7-9975-bc02a549f13e.37124.2])
incremental sync on 11 shards
bucket is caught up with source
我們看到該物件在zone2中可用。
[ ]
2024-01-0906:27:24233 firsfile
由於複製是雙向的,我們將一個物件放入zone2中,並將其複製到zone1 :
[root-node-00~]# aws --endpoint https://object.s3.zone2.dan.ceph.blue:443 s3 cp /etc/hosts s3://testbucket/secondfile
upload: ../etc/hosts to s3://testbucket/secondfile
[root-node-00~]# aws --endpoint https://object.s3.zone1.dan.ceph.blue:443 s3 ls s3://testbucket/
2024-01-0906:27:24233 firsfile
2024-02-0200:40:15233 secondfile
在本系列的第五部分中,我們討論了多站點同步策略並分享了一些配置粒度儲存桶雙向複製的實踐示例。在第六部分中,我們將繼續配置多站點同步策略,包括從一個源到多個目標儲存桶的單向複製。
如有相關問題,請在文章後面給小編留言,小編安排作者第一時間和您聯絡,為您答疑解惑。
推薦閱讀


推薦影片