Ceph 對象存儲多站點復制:多站點同步策略
多站點同步策略介紹
在從 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):定義區域之間復制數據的流向??梢耘渲脼閷ΨQ數據流(多個區域同步數據),也可以配置為定向數據流(數據從一個區域單向傳輸到另一個區域)。
- 管道(Pipes):定義可以使用這些數據流的區域和存儲桶及其相關屬性。
同步策略組的三種狀態:
- 啟用(Enabled):同步被允許并啟用。啟用后,復制將開始。例如,我們可以啟用全區域組同步,然后按存儲桶禁用(禁止)同步。
- 允許(Allowed):同步被允許,但不會自動開始。例如,我們可以將區域組策略配置為“允許”,然后按存儲桶啟用同步策略。
- 禁止(Forbidden):該組定義的同步不被允許。
配置級別:
同步策略(組、數據流和管道)可以在區域組和存儲桶級別配置。存儲桶的同步策略始終是其所屬區域組定義策略的子集。例如,如果在區域組級別不允許某種數據流,即使在存儲桶級別允許,該數據流也不會生效。更多關于預期行為的詳細信息,請參考官方文檔。
多站點同步策略配置
以下部分將解釋如何使用新的多站點同步策略功能。默認情況下,正如我們在本系列的第一篇文章中設置的那樣,多站點復制會將所有元數據和數據在區域組(zonegroup)內的所有區域之間進行復制。在本文的剩余部分中,我們將這種同步方法稱為“傳統同步”。
正如我們在上一節中解釋的那樣,同步策略由組(group)、數據流(flow)和管道(pipe)組成。我們首先配置一個非常寬松的區域組策略,允許所有區域上的所有存儲桶進行雙向流量傳輸。配置完成后,我們將添加按存儲桶的同步策略,這些策略在設計上是區域組策略的子集,并具有更嚴格的規則集。
添加區域組策略
我們首先創建一個名為 group1 的新組,并將其狀態設置為“允許”(allowed)?;仡櫳弦还澋膬热?,區域組將允許同步流量流動。策略將被設置為“允許”而非“啟用”(enabled)。在“允許”狀態下,數據同步不會在區域組級別發生,目的是在按存儲桶的基礎上啟用同步。
[root@ceph-node-00 ~]# radosgw-admin sync group create --group-id=group1 --status=allowed --rgw-realm=multisite --rgw-znotallow=multizg
創建對稱/雙向數據流
接下來,我們創建一個對稱/雙向數據流,允許數據在 zone1 和 zone2 之間雙向同步。
[root@ceph-node-00 ~]# radosgw-admin sync group flow create --group-id=group1 --flow-id=flow-mirror --flow-type=symmetrical --znotallow=zone1,zone2
創建管道
最后,我們創建一個管道。在管道中,我們指定要使用的組 ID(group-id),然后為源和目標存儲桶及區域設置通配符 *,這意味著所有區域和存儲桶都可以作為數據的源和目標進行復制。
[root@ceph-node-00 ~]# radosgw-admin sync group pipe create --group-id=group1 --pipe-id=pipe1 --source-znotallow='*' --source-bucket='*' --dest-znotallow='*' --dest-bucket='*'
更新區域組同步策略
區域組同步策略的修改需要更新周期(period),而存儲桶同步策略的修改則不需要更新周期。
[root@ceph-node-00 ~]# radosgw-admin period update --commit
提交新周期(period)后,區域組內的所有數據同步將停止,因為我們的區域組策略設置為“允許”。如果將其設置為“啟用”,同步將繼續以與初始多站點配置相同的方式進行。
區域間的單存儲桶雙向同步
現在,我們可以按存儲桶啟用同步。我們將為現有的存儲桶 testbucket 創建一個存儲桶級別的策略規則。請注意,存儲桶必須在設置此策略之前存在,并且修改存儲桶策略的管理命令必須在主區域(master zone)上運行。不過,存儲桶同步策略不需要更新周期。數據流無需更改,因為它繼承自區域組策略。存儲桶策略的數據流只能是區域組策略中定義的流的子集,管道也是如此。
圖片
創建存儲桶:
[root@ceph-node-00 ~]# aws --endpoint https://s3.zone1.cephlab.com:443 s3 mb s3://testbucket
make_bucket: testbucket
創建一個bucket同步組,使用--bucket參數指定bucket并將狀態設置為enabled以便為我們的bucket testbucket啟用復制
[root@ceph-node-00 ~]# radosgw-admin sync group create --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-znotallow='*' --dest-znotallow='*'
[!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 group get --bucket testbucket | jq .[0].val.status
"Enabled"
另一個有用的命令是sync info 。通過sync info ,我們可以預覽當前配置將實現的同步復制。因此,例如,在我們當前的區域組同步策略處于allowed狀態的情況下,區域組級別不會發生同步,因此同步信息命令將不會顯示配置的任何源或目標。
[root@ceph-node-00 ~]# radosgw-admin sync info
{
"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@ceph-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中可用。
[root@ceph-node-00 ~]# aws --endpoint https://object.s3.zone2.dan.ceph.blue:443 s3 ls s3://testbucket/
2024-01-09 06:27:24 233 firsfile
由于復制是雙向的,我們將一個對象放入zone2中,并將其復制到zone1 :
[root@ceph-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@ceph-node-00 ~]# aws --endpoint https://object.s3.zone1.dan.ceph.blue:443 s3 ls s3://testbucket/
2024-01-09 06:27:24 233 firsfile
2024-02-02 00:40:15 233 secondfile