Ceph 對象存儲多站點復制:歸檔區域(Archive Zone)的概念和架構
功能概述
歸檔區域功能利用多站點復制和S3對象版本控制特性,確保即使生產區域中的對象被刪除,歸檔區域仍保留所有對象版本。通過這種方式,即使從生產站點中刪除,它也將保持每個對象的所有版本可用。
通過歸檔區域,我們可以獲得對象不變性,而無需在生產區域中啟用對象版本控制,降低資源消耗,從而節省了版本化 S3 對象的副本在非歸檔區域中消耗的空間,這適合在硬件成本比較高的環境中。
圖片
這可以保護您的數據免受邏輯或物理錯誤的影響。例如,它可以防止用戶因邏輯故障(如在生產區域意外刪除存儲桶)而丟失數據,同時也能保護數據免受大規模硬件故障或整個生產站點故障的影響。
由于歸檔區域提供了生產數據的不可變副本,它可以作為勒索軟件防護策略的關鍵組成部分。
可以通過生產存儲桶的生命周期策略來控制歸檔區域的存儲空間使用情況,例如定義要為對象保留的版本數量。
我們可以按存儲桶選擇要發送/復制到歸檔區域的數據。例如,如果我們有一些預生產存儲桶,其中沒有重要數據,我們可以禁用這些存儲桶的歸檔區域復制。
歸檔區域架構
歸檔區域作為多站點區域組(multisite zonegroup)中的一個區域,可以擁有與生產區域不同的配置,包括其自己的存儲池和復制規則。
Ceph 歸檔區域具有以下主要特性:
- 版本控制:RGW 歸檔區域中的所有存儲桶都啟用了版本控制。
- 異步復制:每次用戶上傳新對象時,該對象都會異步復制到歸檔區域。
- 版本生成:在生產區域中每次修改對象時,歸檔區域都會生成一個新的對象版本。
- 數據不可變性:如果生產區域中的對象被刪除,歸檔區域中的對象將保持完整。但需要注意的是,歸檔區域不會鎖定其接收的對象。如果用戶具有適當的權限并訪問 S3 端點,仍然可以刪除歸檔區域中的對象。
- 私有網絡配置:歸檔區域的 S3 端點可以配置在僅對運維管理員團隊開放的私有網絡中。如果需要恢復生產對象,請求必須通過該團隊處理。
我們可以將歸檔區域添加到 Ceph 對象存儲的單站點配置中。通過這種配置,我們可以將歸檔區域附加到運行中的單區域、單 Ceph 集群中,如下圖所示:
圖片
或者,我們可以將歸檔區域附加到 Ceph 對象存儲的多站點配置中。例如,如果我們有一個在兩個區域之間進行復制的領域(realm)/區域組(zonegroup),我們可以添加第三個區域,代表第三個 Ceph 集群。這是我們將在示例中使用的架構,基于我們在之前文章中設置的 Ceph 多站點復制集群?,F在,我們將在區域組中添加第三個區域,并將其配置為不可變的歸檔區域。以下圖表展示了這種架構的示例。
圖片
讓我們從歸檔區域配置開始。我們有一個新部署的第三個 Ceph 集群,在四個名為ceph-node-[08-11].cephlab.com節點上運行。
[root@ceph-node-08 ~]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph-node-08.cephlab.com ceph-node-08 _admin,osd,mon,mgr,rgwsync
ceph-node-09.cephlab.com 192.168.122.135 osd,mon,mgr,rgwsync
ceph-node-10.cephlab.com 192.168.122.204 osd,mon,mgr,rgw
ceph-node-11.cephlab.com 192.168.122.194 osd,rgw
4 hosts in cluster
目前無法使用 Manager rgw模塊配置歸檔區域,因此我們必須運行radosgw-admin命令來配置它。首先,我們從已經部署的multisite領域中提取信息。我們使用區域組端點以及 RGW 多站點同步用戶的訪問秘鑰。如果您需要檢查同步用戶的詳細信息,您可以運行: radosgw-admin user info --uid sysuser-multisite 。
[root@ceph-node-08]# radosgw-admin realm pull --rgw-realm=multisite --url=http://ceph-node-01.cephlab.com:8000 --access-key=X1BLKQE3VJ1QQ27ORQP4 --secret=kEam3Fq5Wgf24Ns1PZXQPdqb5CL3GlsAwpKJqRjg --default
[root@ceph-node-08]# radosgw-admin period pull --url=http://ceph-node-01.cephlab.com:8000 --access-key=X1BLKQE3VJ1QQ27ORQP4 --secret=kEam3Fq5Wgf24Ns1PZXQPdqb5CL3GlsAwpKJqRjg
一旦我們在本地拉取了領域(realm)和周期(period),我們的第三個集群將擁有所有必需的領域和區域組配置。如果我們運行 radosgw-admin zonegroup get命令,就可以查看當前多站點設置的所有詳細信息。接下來,我們將配置一個名為 archive的新區域。我們需要提供以下信息:
- 端點列表:這些是將在新集群上部署的專用同步 RGW(Rados Gateway)的地址。
- 同步用戶的訪問密鑰和密鑰:用于同步操作的認證信息。
- 區域類型:通過設置 tier type 標志,明確該新區域將被創建為歸檔區域。
這一步驟是確保新區域能夠正確配置并作為歸檔區域運行的關鍵。
[root@ceph-node-08]# radosgw-admin zone create --rgw-znotallow=archive --rgw-znotallow=multizg --endpoints=http://ceph-node-08.cephlab.com:8000,http://ceph-node-09.cephlab.com:8000 --access-key=X1BLKQE3VJ1QQ27ORQP4 --secret=kEam3Fq5Wgf24Ns1PZXQPdqb5CL3GlsAwpKJqRjg --tier-type=archive --default
新區域到位后,我們可以更新周期以將新區域配置推送到區域組中的其余區域
[root@ceph-node-08]# radosgw-admin period update --commit
我們使用 cephadm 部署了兩個 RGW(Rados Gateway)服務,這些服務將從生產區域復制數據。在本示例中,我們使用 cephadm 的 RGW CLI 而不是規格文件(spec file)來展示另一種配置 Ceph 服務的方式。我們啟動的兩個新 RGW 服務都將屬于歸檔區域。通過 --placement 參數,我們配置了兩個 RGW 服務,它們將運行在 ceph-node-08 和 ceph-node-09 上,這兩個節點也是我們之前通過命令配置為區域復制端點的節點。
[root@ceph-node-08 ~]# ceph orch apply rgw multi.archive --realm=multisite --znotallow=archive --placement="2 ceph-node-08.cephlab.com ceph-node-09.cephlab.com" --port=8000
Scheduled rgw.multi.archive update...
我們可以檢查 RGW 是否已正確啟動:
[root@ceph-node-08]# ceph orch ps | grep archive
[root@ceph-node-08]# ceph orch ps | grep archive
rgw.multi.archive.ceph-node-08.hratsi ceph-node-08.cephlab.com *:8000 running (10m) 10m ago 10m 80.5M - 18.2.0-131.el9cp 463bf5538482 44608611b391
rgw.multi.archive.ceph-node-09.lubyaa ceph-node-09.cephlab.com *:8000 running (10m) 10m ago 10m 80.7M - 18.2.0-131.el9cp 463bf5538482 d39dbc9b3351
一旦新的 RGW 啟動,就會為我們創建歸檔區域的新池。請記住,如果我們想對 RGW 數據池使用糾刪碼,那么在
[root@ceph-node-08]# ceph osd lspools | grep archive
8 archive.rgw.log
9 archive.rgw.control
10 archive.rgw.meta
11 archive.rgw.buckets.index
現在,當我們檢查歸檔區域節點之一的同步狀態時,我們發現當前沒有配置復制。這是因為我們使用的是 sync policy ,并且沒有為歸檔區域配置區域組同步策略:
[root@ceph-node-08]# radosgw-admin sync status --rgw-znotallow=archive
realm beeea955-8341-41cc-a046-46de2d5ddeb9 (multisite)
zonegroup 2761ad42-fd71-4170-87c6-74c20dd1e334 (multizg)
zone bac4e4d7-c568-4676-a64c-f375014620ae (archive)
current time 2024-02-12T17:19:24Z
zonegroup features enabled: resharding
disabled: compress-encrypted
metadata sync syncing
full sync: 0/64 shards
incremental sync: 64/64 shards
metadata is caught up with master
data sync source: 66df8c0a-c67d-4bd7-9975-bc02a549f13e (zone1)
not syncing from zone
source: 7b9273a9-eb59-413d-a465-3029664c73d7 (zone2)
not syncing from zone
現在我們要開始將數據復制到歸檔區域,因此我們需要創建區域組策略?;叵胍幌挛覀冎暗奈恼?,我們配置了一個區域組策略以allow在區域組級別進行復制,然后我們在每個存儲桶的基礎上配置了復制。
在這種情況下,我們將對歸檔區域采取不同的方法。我們將在區域組級別配置單向同步,并將策略狀態設置為enabled ,因此默認情況下,區域zone1中的所有存儲桶都將復制到archive歸檔區域。
和以前一樣,要創建同步策略,我們需要一個組、一個流和一個管道。讓我們創建一個名為grouparchive的新 zonegroup 組策略:
[root@ceph-node-00 ~]# radosgw-admin sync group create --group-id=grouparchive --status=enabled
我們正在創建一個“directional”(unidirectional)流,它將所有數據從 zone1 復制到 archive 區域:
[root@ceph-node-00 ~]# radosgw-admin sync group flow create --group-id=grouparchive --flow-id=flow-archive --flow-type=directional --source-znotallow=zone1 --dest-znotallow=archive
最后,我們創建一個管道,在其中對所有字段使用*通配符,以避免輸入完整的區域名稱。 代表流程中配置的所有區域。我們可以在區域字段中輸入zone1和archive 。此處使用通配符有助于避免拼寫錯誤并概括該過程。
[root@ceph-node-00 ~]# radosgw-admin sync group pipe create --group-id=grouparchive --pipe-id=pipe-archive --source-znotallow='*' --source-bucket='*' --dest-znotallow='*' --dest-bucket='*'
始終需要提交區域組同步策略:
[root@ceph-node-00 ~]# radosgw-admin period update --commit
當我們檢查配置的區域組策略時,我們現在看到兩個組,即我們之前文章中的group1和我們剛才創建和配置的grouparchive :
[root@ceph-node-00 ~]# radosgw-admin sync group get
[
{
"key": "group1",
"val": {
"id": "group1",
"data_flow": {
"symmetrical": [
{
"id": "flow-mirror",
"zones": [
"zone1",
"zone2"
]
}
]
},
"pipes": [
{
"id": "pipe1",
"source": {
"bucket": "*",
"zones": [
"*"
]
},
"dest": {
"bucket": "*",
"zones": [
"*"
]
},
"params": {
"source": {
"filter": {
"tags": []
}
},
"dest": {},
"priority": 0,
"mode": "system",
"user": ""
}
}
],
"status": "allowed"
}
},
{
"key": "grouparchive",
"val": {
"id": "grouparchive",
"data_flow": {
"directional": [
{
"source_zone": "zone1",
"dest_zone": "archive"
}
]
},
"pipes": [
{
"id": "pipe-archive",
"source": {
"bucket": "*",
"zones": [
"*"
]
},
"dest": {
"bucket": "*",
"zones": [
"*"
]
},
"params": {
"source": {
"filter": {
"tags": []
}
},
"dest": {},
"priority": 0,
"mode": "system",
"user": ""
}
}
],
"status": "enabled"
}
}
]
當我們檢查來自 zone1 的任意存儲桶時(這里我們選擇了單向同步的存儲桶,但也可以是其他存儲桶),可以看到現在配置了一個新的同步策略,其 ID 為 pipe-archive。這一策略源自我們剛剛應用的區域組策略,因為這是單向同步的配置。我們在 zone1 的 ceph-node-00 節點上運行命令,發現只有 dests 字段被填充,其中源區域為 zone1,目標區域為歸檔區域。
代碼
當我們再次運行radosgw-admin sync status命令時,我們看到zone1的狀態已not syncing from zone更改為已啟用同步,并且data is caught up with source 。
[root@ceph-node-00 ~]# radosgw-admin sync info --bucket unidirectional
{
"sources": [],
"dests": [
{
"id": "pipe-archive",
"source": {
"zone": "zone1",
"bucket": "unidirectional:66df8c0a-c67d-4bd7-9975-bc02a549f13e.36430.1"
},
"dest": {
"zone": "archive",
"bucket": "unidirectional:66df8c0a-c67d-4bd7-9975-bc02a549f13e.36430.1"
},
"params": {
"source": {
"filter": {
"tags": []
}
},
"dest": {},
"priority": 0,
"mode": "system",
"user": ""
}
},
{
"id": "test-pipe1",
"source": {
"zone": "zone1",
"bucket": "unidirectional:66df8c0a-c67d-4bd7-9975-bc02a549f13e.36430.1"
},
"dest": {
"zone": "zone2",
"bucket": "unidirectional:66df8c0a-c67d-4bd7-9975-bc02a549f13e.36430.1"
},
"params": {
"source": {
"filter": {
"tags": []
}
},
"dest": {},
"priority": 0,
"mode": "system",
"user": "user1"
}
},
現在,所有寫入 zone1 的數據都將被復制到歸檔區域。在這種配置下,我們只需設置從 zone1 到歸檔區域的單向數據流。例如,如果在 zone2 中寫入了新對象,由于我們為 unidirectionalbucket 配置了雙向存儲桶同步策略,對象復制的流向將如下所示:
zone2 → zone1 → 歸檔區域
總 結
我們介紹了歸檔區域(Archive Zone)功能,并分享了一個在實際運行的 Ceph 對象存儲多站點集群中配置歸檔區域的實操示例。