Ceph 對象存儲多站點(diǎn)復(fù)制:多站點(diǎn)同步策略
多站點(diǎn)同步策略介紹
在從 Quincy 開始的 Ceph 版本中,Ceph 對象存儲提供了細(xì)粒度的存儲桶級復(fù)制,提供了很多有用的功能。用戶可以啟用或禁用每個存儲桶的同步,從而實(shí)現(xiàn)對復(fù)制工作流程的精確控制。這支持全區(qū)域復(fù)制,同時可以排除特定存儲桶的復(fù)制、將單個源存儲桶復(fù)制到多目標(biāo)存儲桶,并實(shí)現(xiàn)對稱和定向數(shù)據(jù)流配置。下圖顯示了正在運(yùn)行的同步策略功能的示例:
圖片
在我們之前的同步模型中,采用的是全區(qū)域同步(full zone sync),即所有數(shù)據(jù)和元數(shù)據(jù)都會在區(qū)域之間同步。而新的同步策略功能為我們提供了更高的靈活性和細(xì)粒度控制,允許我們按存儲桶(bucket)配置復(fù)制。
存儲桶同步策略主要應(yīng)用于歸檔區(qū)域(archive zones)。從歸檔區(qū)域的數(shù)據(jù)移動是單向的,即所有對象可以從活躍區(qū)域(active zone)移動到歸檔區(qū)域,但不能從歸檔區(qū)域移動到活躍區(qū)域,因?yàn)闅w檔區(qū)域是只讀的。我們將在博客系列的第六部分詳細(xì)討論歸檔區(qū)域。
以下是Quincy和Reef版本中提供的一些功能列表:
Quincy 版本功能:
- 一對一存儲桶復(fù)制
- 區(qū)域組(Zonegroup)級別的策略配置
- 存儲桶(Bucket)級別的策略配置
- 可配置的數(shù)據(jù)流 - 對稱模式
- 僅支持全新的多站點(diǎn)部署(Greenfield/New Multisite Deployments)
Reef 版本功能:
- 對象名稱過濾
- 從傳統(tǒng)的多站點(diǎn)同步(全區(qū)域復(fù)制)遷移到同步策略(區(qū)域組或存儲桶級別)
- 歸檔區(qū)域同步策略(按存儲桶啟用/禁用復(fù)制到歸檔區(qū)域)
- 數(shù)據(jù)流 - 對稱或定向模式
- 部分用戶 S3 復(fù)制 API(GetBucketReplication、PutBucketReplication、DeleteBucketReplication)
- 支持不同存儲桶之間的同步(一對一或一對多)
- 目標(biāo)參數(shù)修改:存儲類別(Storage Class)、目標(biāo)所有者轉(zhuǎn)換、用戶模式
同步策略的核心概念:
在深入操作之前,我們需要理解以下同步策略的核心概念。同步策略由以下組件構(gòu)成:
- 組(Groups):包含一個或多個組,每個組可以包含數(shù)據(jù)流配置列表。
- 數(shù)據(jù)流(Data-flow):定義區(qū)域之間復(fù)制數(shù)據(jù)的流向。可以配置為對稱數(shù)據(jù)流(多個區(qū)域同步數(shù)據(jù)),也可以配置為定向數(shù)據(jù)流(數(shù)據(jù)從一個區(qū)域單向傳輸?shù)搅硪粋€區(qū)域)。
- 管道(Pipes):定義可以使用這些數(shù)據(jù)流的區(qū)域和存儲桶及其相關(guān)屬性。
同步策略組的三種狀態(tài):
- 啟用(Enabled):同步被允許并啟用。啟用后,復(fù)制將開始。例如,我們可以啟用全區(qū)域組同步,然后按存儲桶禁用(禁止)同步。
- 允許(Allowed):同步被允許,但不會自動開始。例如,我們可以將區(qū)域組策略配置為“允許”,然后按存儲桶啟用同步策略。
- 禁止(Forbidden):該組定義的同步不被允許。
配置級別:
同步策略(組、數(shù)據(jù)流和管道)可以在區(qū)域組和存儲桶級別配置。存儲桶的同步策略始終是其所屬區(qū)域組定義策略的子集。例如,如果在區(qū)域組級別不允許某種數(shù)據(jù)流,即使在存儲桶級別允許,該數(shù)據(jù)流也不會生效。更多關(guān)于預(yù)期行為的詳細(xì)信息,請參考官方文檔。
多站點(diǎn)同步策略配置
以下部分將解釋如何使用新的多站點(diǎn)同步策略功能。默認(rèn)情況下,正如我們在本系列的第一篇文章中設(shè)置的那樣,多站點(diǎn)復(fù)制會將所有元數(shù)據(jù)和數(shù)據(jù)在區(qū)域組(zonegroup)內(nèi)的所有區(qū)域之間進(jìn)行復(fù)制。在本文的剩余部分中,我們將這種同步方法稱為“傳統(tǒng)同步”。
正如我們在上一節(jié)中解釋的那樣,同步策略由組(group)、數(shù)據(jù)流(flow)和管道(pipe)組成。我們首先配置一個非常寬松的區(qū)域組策略,允許所有區(qū)域上的所有存儲桶進(jìn)行雙向流量傳輸。配置完成后,我們將添加按存儲桶的同步策略,這些策略在設(shè)計(jì)上是區(qū)域組策略的子集,并具有更嚴(yán)格的規(guī)則集。
添加區(qū)域組策略
我們首先創(chuàng)建一個名為 group1 的新組,并將其狀態(tài)設(shè)置為“允許”(allowed)?;仡櫳弦还?jié)的內(nèi)容,區(qū)域組將允許同步流量流動。策略將被設(shè)置為“允許”而非“啟用”(enabled)。在“允許”狀態(tài)下,數(shù)據(jù)同步不會在區(qū)域組級別發(fā)生,目的是在按存儲桶的基礎(chǔ)上啟用同步。
[root@ceph-node-00 ~]# radosgw-admin sync group create --group-id=group1 --status=allowed --rgw-realm=multisite --rgw-znotallow=multizg
創(chuàng)建對稱/雙向數(shù)據(jù)流
接下來,我們創(chuàng)建一個對稱/雙向數(shù)據(jù)流,允許數(shù)據(jù)在 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
創(chuàng)建管道
最后,我們創(chuàng)建一個管道。在管道中,我們指定要使用的組 ID(group-id),然后為源和目標(biāo)存儲桶及區(qū)域設(shè)置通配符 *,這意味著所有區(qū)域和存儲桶都可以作為數(shù)據(jù)的源和目標(biāo)進(jìn)行復(fù)制。
[root@ceph-node-00 ~]# radosgw-admin sync group pipe create --group-id=group1 --pipe-id=pipe1 --source-znotallow='*' --source-bucket='*' --dest-znotallow='*' --dest-bucket='*'
更新區(qū)域組同步策略
區(qū)域組同步策略的修改需要更新周期(period),而存儲桶同步策略的修改則不需要更新周期。
[root@ceph-node-00 ~]# radosgw-admin period update --commit
提交新周期(period)后,區(qū)域組內(nèi)的所有數(shù)據(jù)同步將停止,因?yàn)槲覀兊膮^(qū)域組策略設(shè)置為“允許”。如果將其設(shè)置為“啟用”,同步將繼續(xù)以與初始多站點(diǎn)配置相同的方式進(jìn)行。
區(qū)域間的單存儲桶雙向同步
現(xiàn)在,我們可以按存儲桶啟用同步。我們將為現(xiàn)有的存儲桶 testbucket 創(chuàng)建一個存儲桶級別的策略規(guī)則。請注意,存儲桶必須在設(shè)置此策略之前存在,并且修改存儲桶策略的管理命令必須在主區(qū)域(master zone)上運(yùn)行。不過,存儲桶同步策略不需要更新周期。數(shù)據(jù)流無需更改,因?yàn)樗^承自區(qū)域組策略。存儲桶策略的數(shù)據(jù)流只能是區(qū)域組策略中定義的流的子集,管道也是如此。
圖片
創(chuàng)建存儲桶:
[root@ceph-node-00 ~]# aws --endpoint https://s3.zone1.cephlab.com:443 s3 mb s3://testbucket
make_bucket: testbucket
創(chuàng)建一個bucket同步組,使用--bucket參數(shù)指定bucket并將狀態(tài)設(shè)置為enabled以便為我們的bucket testbucket啟用復(fù)制
[root@ceph-node-00 ~]# radosgw-admin sync group create --bucket=testbucket --group-id=testbucket-1 --status=enabled
無需指定流,因?yàn)槲覀儗?zonegroup 繼承流,因此我們只需為存儲桶同步策略組定義一個名為testbucket-1管道。一旦應(yīng)用此命令,該存儲桶的數(shù)據(jù)同步復(fù)制就會開始。
[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命令,可以查看組、流和管道配置。我們在區(qū)域組級別運(yùn)行該命令,我們可以看到狀態(tài)是allowed 。
"allowed"
我們在存儲桶級別運(yùn)行sync group get命令并提供--bucket參數(shù)。在這種情況下, testbucket的狀態(tài)為Enabled :
[root@ceph-node-00 ~]# radosgw-admin sync group get --bucket testbucket | jq .[0].val.status
"Enabled"
另一個有用的命令是sync info 。通過sync info ,我們可以預(yù)覽當(dāng)前配置將實(shí)現(xiàn)的同步復(fù)制。因此,例如,在我們當(dāng)前的區(qū)域組同步策略處于allowed狀態(tài)的情況下,區(qū)域組級別不會發(fā)生同步,因此同步信息命令將不會顯示配置的任何源或目標(biāo)。
[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參數(shù),因?yàn)槲覀円呀?jīng)配置了雙向管道。我們將使用zone2 -> zone1作為源,將zone1 -> zone2作為目的地。這意味著testbucket存儲桶上的復(fù)制發(fā)生在兩個方向。如果我們將一個對象從zone1放入testbucket ,它將被復(fù)制到zone2 ,如果我們將對象放入zone2它將被復(fù)制到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"
}
}
],
因此,例如,如果我們只查看源,可以看到它們會根據(jù)運(yùn)行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 執(zhí)行快速測試,以驗(yàn)證配置并確認(rèn)復(fù)制適用于testbucket 。我們將一個對象放入zone1并檢查它是否已復(fù)制到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
檢查同步狀態(tài)的另一種方法是使用 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
由于復(fù)制是雙向的,我們將一個對象放入zone2中,并將其復(fù)制到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