Ceph 對(duì)象存儲(chǔ)多站點(diǎn)復(fù)制:從歸檔區(qū)域恢復(fù)數(shù)據(jù)
功能概述
讓我們從歸檔區(qū)域恢復(fù)流程的可視化表示開(kāi)始。了解流程后,我們將通過(guò)一個(gè)實(shí)操示例來(lái)逐步演示。
下圖展示了當(dāng)用戶(hù)向生產(chǎn)區(qū)域上傳(PUT)對(duì)象時(shí),歸檔區(qū)域的行為:
- 第一次上傳:當(dāng)用戶(hù)首次將 object1 上傳到生產(chǎn)區(qū)域時(shí),該對(duì)象會(huì)作為當(dāng)前版本復(fù)制到歸檔區(qū)域。
 - 第二次上傳:當(dāng)用戶(hù)第二次上傳并更新 object1 時(shí),修改后的對(duì)象會(huì)復(fù)制到歸檔區(qū)域。此時(shí),修改后的對(duì)象成為當(dāng)前版本,而舊的(初始的、原始的)對(duì)象仍然保留在歸檔區(qū)域中,這得益于 S3 版本控制功能。
 - 第三次上傳:如果用戶(hù)第三次上傳并更新 object1,將重復(fù)步驟 2 的過(guò)程,歸檔區(qū)域中將保存該對(duì)象的三個(gè)版本。
 
通過(guò)這種方式,歸檔區(qū)域不僅保留了對(duì)象的最新版本,還保留了歷史版本,為數(shù)據(jù)恢復(fù)提供了更多可能性。
圖片
繼續(xù)上面的示例,讓我們看看如何從邏輯故障中恢復(fù)數(shù)據(jù)。
- 誤刪除操作:在應(yīng)用程序 X 的部署過(guò)程中,用戶(hù)誤操作刪除了生產(chǎn)區(qū)域中的 object1。然而,該對(duì)象并未從歸檔區(qū)域中刪除。
 - 應(yīng)用程序故障:當(dāng)生產(chǎn)應(yīng)用程序 X 嘗試訪問(wèn) object1 時(shí),操作失敗。應(yīng)用程序因此宕機(jī),引發(fā)了緊急情況。
 - 問(wèn)題排查與請(qǐng)求:應(yīng)用程序團(tuán)隊(duì)對(duì)問(wèn)題進(jìn)行了根本原因分析(RCA),并迅速聯(lián)系存儲(chǔ)團(tuán)隊(duì),指定需要恢復(fù)的對(duì)象及其版本(日期/時(shí)間)。為了加快處理速度,可能還會(huì)承諾一些素食布朗尼作為感謝。
 - 數(shù)據(jù)恢復(fù):存儲(chǔ)團(tuán)隊(duì)從歸檔區(qū)域復(fù)制 object1 的最新版本到生產(chǎn)集群中。
 
通過(guò)這種方式,歸檔區(qū)域?yàn)閼?yīng)對(duì)邏輯故障提供了可靠的數(shù)據(jù)恢復(fù)機(jī)制,確保關(guān)鍵數(shù)據(jù)不會(huì)因誤操作而永久丟失。
圖片
從歸檔區(qū)WorKflow 中恢復(fù)對(duì)象中的實(shí)踐操作
準(zhǔn)備客戶(hù)端環(huán)境
我們將使用rclone CLI 工具進(jìn)行測(cè)試。首先,我們?yōu)闇y(cè)試創(chuàng)建一個(gè)特定用戶(hù),因此在zone1集群中,我們運(yùn)行:
# radosgw-admin user create --uid=archuser --display-name="S3 user to test the archive zone" --access-key=archuser --secret-key=archuser
{
    "user_id": "archuser",
    "display_name": "S3 user to test the archive zone",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "archuser",
            "access_key": "archuser",
            "secret_key": "archuser"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {現(xiàn)在我們使用該用戶(hù)配置 AWS 客戶(hù)端:
# aws configure
AWS Access Key ID [None]: archuser
AWS Secret Access Key [None]: archuser
Default region name [None]: multizg
Default output format [None]: text我們還將創(chuàng)建幾個(gè)別名,以簡(jiǎn)化我們的命令。
zone 和 archive 區(qū)域的別名:
# alias s3apiarchive='aws --endpoint=https://object.s3.archive.dan.ceph.blue:443 s3api'
# alias s3apizone1='aws --endpoint=https://object.s3.zone1.dan.ceph.blue:443 s3api'我們希望使用rclone ,所以讓我們下載并安裝對(duì)應(yīng)的rclone軟件包:
# yum install https://downloads.rclone.org/v1.62.0/rclone-v1.62.0-linux-amd64.rpm -y接下來(lái),我們使用生產(chǎn)區(qū)域端點(diǎn)和歸檔區(qū)域端點(diǎn)配置rclone客戶(hù)端。這樣,如果需要,我們可以使用rclone從歸檔區(qū)域恢復(fù)數(shù)據(jù):
cat <<EOF >rclone.conf
[zone1]
type = s3
provider = Other
access_key_id = archuser
secret_access_key = archuser
endpoint = https://object.s3.zone1.dan.ceph.blue:443
location_constraint = multizg
acl = bucket-owner-full-control
[archive]
type = s3
provider = Ceph
access_key_id = archuser
secret_access_key = archuser
endpoint =  https://object.s3.archive.dan.ceph.blue:443
location_constraint = multizg
acl = bucket-owner-full-control
EOF接下來(lái),我們創(chuàng)建一些測(cè)試文件并捕獲它們的 MD5 校驗(yàn)和,以便稍后進(jìn)行比較:
# echo "This is file 1" > /tmp/test-file-1
# echo "This is file 2" > /tmp/test-file-2
# echo "This is file 3" > /tmp/test-file-3
# md5sum /tmp/test-file-1
88c16a56754e0f17a93d269ae74dde9b  /tmp/test-file-1
# md5sum /tmp/test-file-2
db06069ef1c9f40986ffa06db4fe8fd7  /tmp/test-file-2
# md5sum /tmp/test-file-3
95227e10e2c33771e1c1379b17330c86  /tmp/test-file-3歸檔區(qū)測(cè)試
我們的客戶(hù)端已準(zhǔn)備就緒,現(xiàn)在來(lái)檢查歸檔區(qū)。
創(chuàng)建一個(gè)新的存儲(chǔ)桶,并驗(yàn)證該存儲(chǔ)桶是否已在所有 RGW 區(qū)域中創(chuàng)建:
# s3apizone1 create-bucket --bucket my-bucket
# s3apizone1 list-buckets
BUCKETS 2023-03-15T12:03:54.315000+00:00        my-bucket
OWNER   S3 user to test the archive zone        archuser
# s3apiarchive list-buckets
BUCKETS 2023-03-15T12:03:54.315000+00:00        my-bucket
OWNER   S3 user to test the archive zone        archuser驗(yàn)證是否尚未配置對(duì)象版本控制,因?yàn)樵摴δ苁茄舆t執(zhí)行的
# s3apizone1 get-bucket-versioning --bucket my-bucket
# s3apiarchive get-bucket-versioning --bucket my-bucket將新對(duì)象上傳到我們的存儲(chǔ)桶my-bucket 。
# rclone copy /tmp/test-file-1 zone1:my-bucket驗(yàn)證歸檔區(qū)是否已啟用 S3 版本管理,但 zone1未啟用:
# s3apiarchive get-bucket-versioning --bucket my-bucket
{
    "Status": "Enabled",
    "MFADelete": "Disabled"
}
# s3apizone1 get-bucket-versioning --bucket my-bucket驗(yàn)證主備區(qū)中的對(duì)象版本 ID 是否為空,但歸檔區(qū)中的對(duì)象版本 ID 不為空:
# s3apizone1 list-object-versions --bucket my-bucket
{
    "Versions": [
        {
            "ETag": "\"88c16a56754e0f17a93d269ae74dde9b\"",
            "Size": 15,
            "StorageClass": "STANDARD",
            "Key": "test-file-1",
            "VersionId": "null",
            "IsLatest": true,
            "LastModified": "2023-03-15T12:07:12.914000+00:00",
            "Owner": {
                "DisplayName": "S3 user to test the archive zone",
                "ID": "archuser"
            }
        }
    ]
}
# s3apiarchive list-object-versions --bucket my-bucket
{
    "Versions": [
        {
            "ETag": "\"88c16a56754e0f17a93d269ae74dde9b\"",
            "Size": 15,
            "StorageClass": "STANDARD",
            "Key": "test-file-1",
            "VersionId": "6DRlC7fKtpmkvHA9zknhFA87RjyilTV",
            "IsLatest": true,
            "LastModified": "2023-03-15T12:07:12.914000+00:00",
            "Owner": {
                "DisplayName": "S3 user to test the archive zone",
                "ID": "archuser"
            }
        }
    ]
}修改主區(qū)域中的對(duì)象并驗(yàn)證是否在 RGW 歸檔區(qū)域中創(chuàng)建了新版本:
# rclone copyto /tmp/test-file-2 zone1:my-bucket/test-file-1
# rclone ls zone1:my-bucket
       15 test-file-1驗(yàn)證 RGW 歸檔區(qū)域中已創(chuàng)建新版本:
# s3apiarchive list-object-versions --bucket my-bucket
{
    "Versions": [
        {
            "ETag": "\"db06069ef1c9f40986ffa06db4fe8fd7\"",
            "Size": 15,
            "StorageClass": "STANDARD",
            "Key": "test-file-1",
            "VersionId": "mXoINEnZsSCDNaWwCDELVysUbnMqNqx",
            "IsLatest": true,
            "LastModified": "2023-03-15T12:13:27.057000+00:00",
            "Owner": {
                "DisplayName": "S3 user to test the archive zone",
                "ID": "archuser"
            }
        },
        {
            "ETag": "\"88c16a56754e0f17a93d269ae74dde9b\"",
            "Size": 15,
            "StorageClass": "STANDARD",
            "Key": "test-file-1",
            "VersionId": "6DRlC7fKtpmkvHA9zknhFA87RjyilTV",
            "IsLatest": false,
            "LastModified": "2023-03-15T12:07:12.914000+00:00",
            "Owner": {
                "DisplayName": "S3 user to test the archive zone",
                "ID": "archuser"
            }
        }
    ]
}我們可以檢查 ETag:它將與對(duì)象的 MD5sum 匹配。僅當(dāng)未配置分段上傳和對(duì)象加密時(shí)才會(huì)出現(xiàn)這種情況。
# md5sum /tmp/test-file-2
db06069ef1c9f40986ffa06db4fe8fd7  /tmp/test-file-2
# md5sum /tmp/test-file-1
88c16a56754e0f17a93d269ae74dde9b  /tmp/test-file-1從 Rgw 歸檔區(qū)恢復(fù) S3 對(duì)象文件
讓我們上傳該對(duì)象的另一個(gè)版本
# rclone copyto /tmp/test-file-3 zone1:my-bucket/test-file-1在主區(qū)域中,我們只有一個(gè)版本,即對(duì)象的當(dāng)前版本:
# rclone --s3-versions lsl zone1:my-bucket
       15 2023-03-15 07:59:10.779573336 test-file-1但在歸檔區(qū),我們提供了所有三個(gè)版本:
# rclone --s3-versions lsl archive:my-bucket
       15 2023-03-15 07:59:10.779573336 test-file-1
       15 2023-03-15 07:59:03.782438991 test-file-1-v2023-03-15-121327-057
       15 2023-03-15 07:58:58.135330567 test-file-1-v2023-03-15-120712-914現(xiàn)在讓我們從zone1的my-bucket中刪除test-file1 ,然后從歸檔區(qū)域恢復(fù)該對(duì)象:
# rclone delete zone1:my-bucket/test-file-1
# rclone --s3-versions lsl zone1:my-bucket
# rclone --s3-versions lsl archive:my-bucket
       15 2023-03-15 07:59:10.779573336 test-file-1
       15 2023-03-15 07:59:03.782438991 test-file-1-v2023-03-15-121327-057
       15 2023-03-15 07:58:58.135330567 test-file-1-v2023-03-15-120712-914該對(duì)象已從zone1中刪除,但所有版本在歸檔區(qū)域中仍然可用。如果我們恢復(fù)最新版本test-file-1它應(yīng)該與我們的test-file-3的 MD5 校驗(yàn)和匹配:
# rclone copyto archive:my-bucket/test-file-1 zone1:my-bucket/test-file-1
# rclone copyto zone1:my-bucket/test-file-1 /tmp/recovered-file1
# md5sum /tmp/recovered-file1
95227e10e2c33771e1c1379b17330c86  /tmp/recovered-file1
# md5sum /tmp/test-file-3
95227e10e2c33771e1c1379b17330c86  /tmp/test-file-3現(xiàn)在讓我們探討一下我們想要恢復(fù)具有特定時(shí)間戳的版本的對(duì)象的情況,例如2023-03-15-121327-057 。
# rclone --s3-versions copyto archive:my-bucket/test-file-1-v2023-03-15-121327-057 zone1:my-bucket/test-file-1
# rclone copyto zone1:my-bucket/test-file-1 /tmp/recovered-file1
# md5sum /tmp/recovered-file1
db06069ef1c9f40986ffa06db4fe8fd7  /tmp/recovered-file1
# md5sum /tmp/test-file-2
db06069ef1c9f40986ffa06db4fe8fd7  /tmp/test-file-2至此,我們完成了關(guān)于歸檔區(qū)域的實(shí)操示例,并通過(guò) `rclone` 工具無(wú)縫恢復(fù)了數(shù)據(jù)。















 
 
 









 
 
 
 