rgw裡面使用者、bucket、使用者資料之間關係
概覽
本篇文章介紹了ceph rgw元件裡面,使用者、bucket和使用者資料物件之間的關係,以及它們和底層rados物件之間的關係,我們希望達到以下目的:
- 理解一個使用者的資訊是如何儲存在底層rados中的
- 理解一個bucket的資訊是如何儲存在底層rados中的
- 理解一個使用者和該使用者所擁有的bucket之間的關係
- 理解一個bucket和該bucket裡面的使用者資料之間的關係
理解了上面這些關係之後,然後做一個小實驗:通過s3cmd把上傳檔案到radosgw,然後直接通過拼接底層的rados物件來得到使用者資料。
1、配置一個radosgw服務
首先要準備一個radosgw環境,這裡為了演示方便,使用了最簡的配置。
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服務自動會建立相關的儲存池
2、準備資料
下面為了達到我們列出的目標,我們需要建立一個rgw使用者,然後使用該使用者建立一個bucket。
2.1、建立一個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
可以看到建立使用者之後,自動建立了default.rgw.users.uid這個池。
2.2、建立bucket
使用s3cmd客戶端建立一個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
可以看到建立使用者之後,自動建立了default.rgw.buckets.index這個池
3、理解使用者、bucket、使用者物件之間的關係,以及它們和rados物件的對應關係
3.1、使用者和rados物件對應關係
我們上面建立了一個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就是我們建立的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
可以看到上傳物件之後,自動建立了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
然後再次檢視,發現確實是這樣的
[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
為啥要整理成這種順序,仔細觀察下就會發現,所有和使用者資料物件messages相關的rados物件,都有規律的。
這裡簡單粗暴說下:首先所有物件都是以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上是怎麼組織和存放的。
好了,到這裡就弄清楚了開始在目標裡面列出的幾個問題,動手試試吧。
相關文章
- PostgreSQL-表空間、資料庫、使用者之間的關係(七)SQL資料庫
- 資料結構之資料、資料元素、資料項、資料物件之間的關係資料結構物件
- 大資料與Hadoop之間是什麼關係?大資料Hadoop
- 大資料技術與Hadoop之間的關係大資料Hadoop
- 效能分析之使用者數(執行緒數)/響應時間/TPS的關係執行緒
- 頁面中多個script塊之間的關係
- 這些著名資料庫之間的“關係”,你知道嗎?資料庫
- 探討PostgreSQL例項中資料庫之間的關係SQL資料庫
- 資料結構與演算法之間有何關係?資料結構演算法
- 關係型資料庫之SQL資料庫SQL
- 關係型資料庫之索引資料庫索引
- TLS與SSL之間關係TLS
- 【java】類之間的關係Java
- 微服務?資料庫?它們之間到底是啥關係?微服務資料庫
- Fluent API 配置實體和資料庫之間的對映關係API資料庫
- Linux和大資料雲端計算之間有什麼關係?Linux大資料
- Window、WindowManager、View 之間的關係View
- git、github、gitlab之間的關係GithubGitlab
- Python分析44130條使用者觀影資料,挖掘使用者與電影之間的隱藏資訊!Python
- Stimulsoft Reports使用者手冊:如何建立關係
- 雲端計算、大資料和物聯網之間,之間有什麼關係與區別?大資料
- nodejs之MongoDB 非關係型資料庫NodeJSMongoDB資料庫
- 反DDD模式之關係型資料庫模式資料庫
- 頁面之間傳遞資料
- 解決excel兩表之間資料關聯關係,知道這幾招就夠了Excel
- React、Ant Design、DvaJS之間的關係ReactJS
- Activity、View、Window之間關係的分析View
- UML類圖--類之間的關係
- 思考 TPS 與 RT 之間的關係
- Window, WindowManager和WindowManagerService之間的關係
- 類與類之間的基本關係
- Maven專案之間關係介紹Maven
- 虛擬主機資料庫與空間關係資料庫
- 資料庫入門之3張表對比關係型與非關係型資料庫資料庫
- gateway(二)微服務之間傳遞使用者資訊Gateway微服務
- 融雲IM資訊託管服務,使用者資料、好友關係、群組資訊全覆蓋
- 資料結構-邏輯關係&物理關係、時間複雜度、空間複雜度、順序表資料結構時間複雜度
- react、redux、react-redux之間的關係ReactRedux