rgw里面用戶百揭、bucket、用戶數據之間關系

概覽

本篇文章介紹了ceph rgw組件里面蜓席,用戶器一、bucket和用戶數據對象之間的關系,以及它們和底層rados對象之間的關系厨内,我們希望達到以下目的:

  • 理解一個用戶的信息是如何保存在底層rados中的
  • 理解一個bucket的信息是如何保存在底層rados中的
  • 理解一個用戶和該用戶所擁有的bucket之間的關系
  • 理解一個bucket和該bucket里面的用戶數據之間的關系

理解了上面這些關系之后祈秕,然后做一個小實驗:通過s3cmd把上傳文件到radosgw,然后直接通過拼接底層的rados對象來得到用戶數據雏胃。

1请毛、配置一個radosgw服務

首先要準備一個radosgw環(huán)境,這里為了演示方便瞭亮,使用了最簡的配置方仿。

1.1、準備radosgw配置文件

[root@ceph01 tmp]# cat /etc/ceph/ceph.conf
···
[client.rgw.inst01]
rgw_frontends = civetweb port=9001

1.2仙蚜、啟動radosgw服務

[root@ceph01 tmp]# systemctl start ceph-radosgw@rgw.inst01

查看rados里面的存儲池

[root@ceph01 tmp]# ceph osd pool ls
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.keys

可以看到啟動radosgw服務時此洲,radosgw服務自動會創(chuàng)建相關的存儲池

2鳍征、準備數據

下面為了達到我們列出的目標,我們需要創(chuàng)建一個rgw用戶氮双,然后使用該用戶創(chuàng)建一個bucket。

2.1暖释、創(chuàng)建一個radosgw用戶

[root@ceph01 tmp]# radosgw-admin user create --uid=rgwuser01 --display-name=rgwuser01 --access-key=rgwuser01 --secret=rgwuser01
{
    "user_id": "rgwuser01",
    "display_name": "rgwuser01",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "auid": 0,
    "subusers": [],
    "keys": [
        {
            "user": "rgwuser01",
            "access_key": "rgwuser01",
            "secret_key": "rgwuser01"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "temp_url_keys": []
}

再次查看rados里面的存儲池

[root@ceph01 tmp]# ceph osd pool ls
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.keys
default.rgw.users.uid   

可以看到創(chuàng)建用戶之后,自動創(chuàng)建了default.rgw.users.uid這個池墨吓。

2.2球匕、創(chuàng)建bucket

使用s3cmd客戶端創(chuàng)建一個bucket

[root@ceph07 ~]# s3cmd mb s3://bk01
Bucket 's3://bk01/' created

再次查看rados里面的存儲池

[root@ceph01 tmp]# ceph osd pool ls
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.keys
default.rgw.users.uid
default.rgw.buckets.index

可以看到創(chuàng)建用戶之后,自動創(chuàng)建了default.rgw.buckets.index這個池

3帖烘、理解用戶亮曹、bucket、用戶對象之間的關系秘症,以及它們和rados對象的對應關系

3.1照卦、用戶和rados對象對應關系

我們上面創(chuàng)建了一個radosgw用戶rgwuser01,這個用戶相關數據保存在哪里呢乡摹?

[root@ceph01 tmp]# rados -p default.rgw.users.uid ls
rgwuser01.buckets
rgwuser01

通過上面命令可以看到役耕,在default.rgw.users.uid池里面有兩個rados對象,rgwuser01對象和我們用戶的id名稱一致聪廉,這個對象就是用來保存用戶信息的rados對象蹄葱。每個radosgw用戶在這個池里面都對應一個rados對象,對象名就是用戶id名稱锄列。

3.2图云、bucket和rados對象的對應關系

[root@ceph01 tmp]# rados -p default.rgw.data.root ls
.bucket.meta.bk01:475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1
bk01

可以看到,bk01這個bucket在default.rgw.data.root池里面有個rados對象.bucket.meta.bk01:475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1與之對應邻邮,這個rados對象就是對應bk01 bucket的竣况,這個rados對象里面存放了一些關于bk01 bucket元數據信息:

[root@ceph01 tmp]# rados -p default.rgw.data.root get .bucket.meta.bk01:475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1 bucket.meta.bk01

[root@ceph01 tmp]# ll
total 8
-rw-r--r--. 1 root root 341 Oct 25 17:19 bucket.meta.bk01
···

[root@ceph01 tmp]# ceph-dencoder type RGWBucketInfo import bucket.meta.bk01 decode dump_json
{
    "bucket": {
        "name": "bk01",
        "pool": "default.rgw.buckets.data",
        "data_extra_pool": "default.rgw.buckets.non-ec",
        "index_pool": "default.rgw.buckets.index",
        "marker": "475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1",
        "bucket_id": "475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1",
        "tenant": ""
    },
    "creation_time": "2018-10-25 09:05:06.249973Z",
    "owner": "rgwuser01",
    "flags": 0,
    "zonegroup": "3a55c2fa-805b-4166-961b-907654e76cb6",
    "placement_rule": "default-placement",
    "has_instance_obj": "true",
    "quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "num_shards": 0,
    "bi_shard_hash_type": 0,
    "requester_pays": "false",
    "has_website": "false",
    "swift_versioning": "false",
    "swift_ver_location": "",
    "index_type": 0
}

通過查詢bk01這個bucket的元數據信息,可以知道bk01這個bucket的id為475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1筒严。

另外丹泉,bucket的acl信息保存在元數據對象的xattr里面:

[root@ceph01 tmp]# rados -p default.rgw.data.root getxattr .bucket.meta.bk01:475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1 user.rgw.acl > encode.bk01.bucket.acl
[root@ceph01 tmp]# ceph-dencoder type RGWAccessControlPolicy import encode.bk01.bucket.acl decode dump_json
{
    "acl": {
        "acl_user_map": [
            {
                "user": "rgwuser01",
                "acl": 15
            }
        ],
        "acl_group_map": [],
        "grant_map": [
            {
                "id": "rgwuser01",
                "grant": {
                    "type": {
                        "type": 0
                    },
                    "id": "rgwuser01",
                    "email": "",
                    "permission": {
                        "flags": 15
                    },
                    "name": "rgwuser01",
                    "group": 0
                }
            }
        ]
    },
    "owner": {
        "id": "rgwuser01",
        "display_name": "rgwuser01"
    }
}

3.3情萤、用戶和bucket的對應關系

我們都知道一個用戶可以有屬于自己的多個bucket,那用戶和bucket的對應關系是怎么建立的呢摹恨?

在上面通過rados -p default.rgw.users.uid ls命令查詢的結果里面除了用戶對象以外筋岛,還有一個rgwuser01.buckets對象,這個對應的命令格式就是{uid}.buckets晒哄,用戶和bucket的對應關系就保存在這個對象的omap里面睁宰,key值就是bucket的名稱,讓我們來驗證下:

查看rgwuser01.buckets這個對象有哪些key

[root@ceph01 tmp]# rados -p default.rgw.users.uid listomapkeys rgwuser01.buckets
bk01

可以看到有bk01這個key寝凌,bk01就是我們創(chuàng)建的bucket名稱柒傻,這點沒問題了。再來獲取下bk01這個key對應的value值

[root@ceph01 tmp]# rados -p default.rgw.users.uid getomapval rgwuser01.buckets bk01 encode_bk01
Writing to encode_bk01

[root@ceph01 tmp]# ll
total 4
-rw-r--r--. 1 root root 244 Oct 25 17:13 encode_bk01

[root@ceph01 tmp]# ceph-dencoder type RGWBucketEnt import encode_bk01 decode dump_json
{
    "bucket": {
        "name": "bk01",
        "pool": "default.rgw.buckets.data",
        "data_extra_pool": "default.rgw.buckets.non-ec",
        "index_pool": "default.rgw.buckets.index",
        "marker": "475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1",
        "bucket_id": "475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1",
        "tenant": ""
    },
    "size": 0,
    "size_rounded": 0,
    "mtime": "2081-05-24 08:53:24.863590Z",
    "count": 0
}

可以看到bk01這個key所對應的value值就是bk01這個bucket的信息较木。這樣我們知道了uid红符,然后通過{uid}.buckets這個rados對象就可以查詢到該用戶下有哪些bucket了。

3.4伐债、bucket和bucket里面數據的對應關系

使用s3cmd客戶端上傳一個對象

[root@ceph07 ~]# s3cmd put anaconda-ks.cfg s3://bk01
upload: 'anaconda-ks.cfg' -> 's3://bk01/anaconda-ks.cfg'  [1 of 1]
 1021 of 1021   100% in    1s   677.26 B/s  done

查看rados里面的存儲池信息

[root@ceph01 tmp]# ceph osd pool ls
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.keys
default.rgw.users.uid
default.rgw.buckets.index
default.rgw.buckets.data

可以看到上傳對象之后预侯,自動創(chuàng)建了default.rgw.buckets.data這個池,看下這個池里面的對象

[root@ceph01 tmp]# rados -p default.rgw.buckets.data ls
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1_anaconda-ks.cfg

那么bucket是如何知道自己包含了哪些對象呢峰锁?其實是每個bucket在default.rgw.buckets.index這個池里面有一個rados對象萎馅,我們叫這個rados對象為索引對象

[root@ceph01 tmp]# rados -p default.rgw.buckets.index ls
.dir.475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1

可以看到一個.dir.475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1對象,這個對象的名稱和我們上面看到的bucket id相比祖今,在前面多了.dir.這個字符校坑,這個對象就是每個bucket在rados里面的索引對象,命名格式就是.dir.{bucket-id}千诬。這個對象的omap里面就保存了這個bucket下所包含的所有對象信息耍目,我們驗證下

[root@ceph01 tmp]# rados -p default.rgw.buckets.index listomapkeys .dir.475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1
anaconda-ks.cfg

可以看到輸出里面和我們上傳的對象名一致,我們再上傳一個對象看看是不是這樣

[root@ceph07 ~]# cp anaconda-ks.cfg anaconda-ks.cfg2
[root@ceph07 ~]# s3cmd put anaconda-ks.cfg2 s3://bk01
upload: 'anaconda-ks.cfg2' -> 's3://bk01/anaconda-ks.cfg2'  [1 of 1]
 1021 of 1021   100% in    0s    18.55 kB/s  done

然后再次查看徐绑,發(fā)現確實是這樣的

[root@ceph01 tmp]# rados -p default.rgw.buckets.index listomapkeys .dir.475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1
anaconda-ks.cfg
anaconda-ks.cfg2

這樣我們就知道了bucket是怎么知道自己包含了哪些用戶數據對象的邪驮。要說明一點的是,bucket的索引對象個數可以去更改傲茄,默認只有一個毅访。

4、根據底層的rados對象拼接用戶文件

這個實驗大概過程就是盘榨,用戶通過radosgw的客戶端(s3cmd)喻粹,上傳一個文件,然后我們在rados層面獲取該文件對應的rados對象草巡,然后通過這些rados對象直接拼接成用戶上傳的文件守呜。

首先準備一個文件,這里特意準備了一個稍大的文件是為了讓s3cmd分段上傳(默認15M一段),小文件雖然不用分段查乒,但是原理也一樣

[root@ceph07 ~]# ll
total 85576
···
-rw-r--r--. 1 root root 87581279 Oct 26 15:24 messages-20180722

計算該文件的md5值弥喉,用于驗證后面我們拼接出來的文件的正確性

[root@ceph07 ~]# md5sum messages-20180722 
b4a6227030352dcc3318684789fda6e1  messages-20180722

然后使用s3cmd上傳到radosgw中(radosgw最終會將數據存到rados中)

[root@ceph07 ~]# s3cmd put messages-20180722 s3://bk01
upload: 'messages-20180722' -> 's3://bk01/messages-20180722'  [part 1 of 6, 15MB] [1 of 1]
 15728640 of 15728640   100% in    0s    23.46 MB/s  done
upload: 'messages-20180722' -> 's3://bk01/messages-20180722'  [part 2 of 6, 15MB] [1 of 1]
 15728640 of 15728640   100% in    0s    31.34 MB/s  done
upload: 'messages-20180722' -> 's3://bk01/messages-20180722'  [part 3 of 6, 15MB] [1 of 1]
 15728640 of 15728640   100% in    2s     5.05 MB/s  done
upload: 'messages-20180722' -> 's3://bk01/messages-20180722'  [part 4 of 6, 15MB] [1 of 1]
 15728640 of 15728640   100% in    1s     9.08 MB/s  done
upload: 'messages-20180722' -> 's3://bk01/messages-20180722'  [part 5 of 6, 15MB] [1 of 1]
 15728640 of 15728640   100% in    1s    11.20 MB/s  done
upload: 'messages-20180722' -> 's3://bk01/messages-20180722'  [part 6 of 6, 8MB] [1 of 1]
 8938079 of 8938079   100% in    0s    11.76 MB/s  done

可以看到s3cmd將文件分成了6段來上傳,每段的大小是15M玛迄,最后一段是8M由境,因為文件最后只剩8M了嘛。
根據前面我們的講述蓖议,我們知道radosgw將用戶數據保存在了default.rgw.buckets.data池中维咸,我們來看下剛才上傳的文件在rados中的分布情況

[root@ceph01 ~]# rados -p default.rgw.buckets.data ls|grep messages-20180722
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.6_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1_messages-20180722
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.6_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.6
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3

radosgw默認將用戶數據按照4M大卸㈦纭(有參數可以控制切分大辛藁埂)來切好乒省,然后放到rados里面的评肆,所以我們上傳的文件最終就是切分成了上面的這些對象漓雅。

接下來我們就是要把這些對象get出來怜森,然后拼接成我們的用戶數據(就是我們使用s3cmd put上去的文件)仍律。

首先我們把上面的對象整理成下面的順序钧栖,然后放入一個文本文件中:

[root@ceph01 messagesobj]# cat messages-obj 
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1_messages-20180722
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.1_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.2_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.3_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.4_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5_2
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.5_3
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__multipart_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.6
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.6_1
475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1__shadow_messages-20180722.2~5-WOTuK85AHNkHUOZdTbLBQqCAzYoeW.6_2

為啥要整理成這種順序低零,仔細觀察下就會發(fā)現,所有和用戶數據對象messages相關的rados對象拯杠,都有規(guī)律的掏婶。

這里簡單粗暴說下:首先所有對象都是以bk01這個bucket的id開頭,然后我們知道分成了6段潭陪,看下包含__multipart_messages字符的對象有6個雄妥,然后每個結尾都有數字標識,從1-6依溯。
再看每段里面又包含__shadow_messages字符的對象老厌,也是每個結尾都有數字標識,從1-3黎炉。最后是一個475caa43-5052-4d27-8ffb-897db2b8a2ec.34271.1_messages-20180722這樣的對象枝秤,這個對象里面就是保存了整個用戶數據對象的元數據和分段的信息。

然后從rados中獲取這些對象慷嗜,并拼接

[root@ceph01 messagesobj]# for i in `cat messages-obj`;do rados -p default.rgw.buckets.data get $i $i; cat $i >> message.txt;done

最后我們看下我們拼接文件的md5值淀弹,看是否和開始我們使用s3cmd上傳的文件的md5一樣

[root@ceph01 messagesobj]# md5sum message.txt 
b4a6227030352dcc3318684789fda6e1  message.txt

可以看到,md5值是一樣的庆械。這樣我們就完成了薇溃,直接通過底層的rados對象來重組出用戶的數據,實際上我們正常情況下不需要這么去做缭乘,這里只是為了更好的理解用戶數據在底層rados上是怎么組織和存放的沐序。

好了,到這里就弄清楚了開始在目標里面列出的幾個問題,動手試試吧薄啥。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末辕羽,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子垄惧,更是在濱河造成了極大的恐慌刁愿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件到逊,死亡現場離奇詭異铣口,居然都是意外死亡,警方通過查閱死者的電腦和手機觉壶,發(fā)現死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門脑题,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铜靶,你說我怎么就攤上這事叔遂。” “怎么了争剿?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵已艰,是天一觀的道長。 經常有香客問我蚕苇,道長哩掺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任涩笤,我火速辦了婚禮嚼吞,結果婚禮上,老公的妹妹穿的比我還像新娘蹬碧。我一直安慰自己舱禽,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布锰茉。 她就那樣靜靜地躺著呢蔫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飒筑。 梳的紋絲不亂的頭發(fā)上片吊,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音协屡,去河邊找鬼俏脊。 笑死,一個胖子當著我的面吹牛肤晓,可吹牛的內容都是我干的爷贫。 我是一名探鬼主播认然,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漫萄!你這毒婦竟也來了卷员?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腾务,失蹤者是張志新(化名)和其女友劉穎毕骡,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體岩瘦,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡未巫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了启昧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叙凡。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖密末,靈堂內的尸體忽然破棺而出握爷,到底是詐尸還是另有隱情,我是刑警寧澤苏遥,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布饼拍,位于F島的核電站赡模,受9級特大地震影響田炭,放射性物質發(fā)生泄漏。R本人自食惡果不足惜漓柑,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一教硫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辆布,春花似錦瞬矩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惭蹂,卻和暖如春伞插,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盾碗。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工媚污, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廷雅。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓耗美,卻偏偏與公主長得像京髓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子商架,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容