Last updated on 8 months ago
*背景*
这里主要介绍 与rgw 相关的pool ,对象网关使用几个池来满足其各种存储需求( radosgw-admin zone get 可以看到,如下图) , 这里从 zone get 里展示出来的 各种pool 出发,介绍下各个pool的功能,以及里面包含了什么
池的命名规则
首先我们用 rados lspool 看这个集群有那些 pool ,发现带有rgw 字眼的的只有三个,而我们用 zone get 发现是有个很多个;
(至于 et_uos_master_zone 则是这zone 名称)
以gc_pool 为例
字面意思是 gc_pool 对应的池 是 et_uos_master_zone.rgw.log:gc
而我们 查看的池子的时候 发现只有 et_uos_master_zone.rgw.log 池
这里是为了复用一个池,使一个池具有多个功能,ceph 使用了命名空间来分割这些池,我们可以用 命令 rados ls -p et_uos_master_zone.rgw.meta –all 可以看池有那些命名空间 如果你知道有那些 命名空间也可以直接用-N 指定 rados ls -p et_uos_master_zone.rgw.log -N gc
*各个池的用途*
*.rgw.root*
这池用来存储realm,period,zonegroup,zone的信息,下面逐个介绍
realms_names.expondata
default.realm
- 创建 realm的时候,如果添加 –default 参数,创建流程上 会创建一个 默认的 realm
radosgw-admin realm create –rgw-realm=expondata –default
- 内容同 realms_names.expondata 一样都是保存 realm ID
realms.655e14cb-a61b-469f-be4f-abe21280ef7f
创建 realm 的时候生成
命名方式: realms.
内容是 realm 的元数据信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| [root@7c31c0c6784c build]# rados -p .rgw.root get realms.7d94f248-98c1-49f7-8567-9ba01a19794c realms.7d94f248-98c1-49f7-8567-9ba01a19794c
[root@7c31c0c6784c build]# ceph-dencoder import realms.7d94f248-98c1-49f7-8567-9ba01a19794c type RGWRealm decode dump_json
{
"id": "7d94f248-98c1-49f7-8567-9ba01a19794c",
"name": "expondata",
"current_period": "30dcf503-df25-479e-8f27-d0f64a7d9d39",
"epoch": 1
}
[root@7c31c0c6784c build]#
|
realms.655e14cb-a61b-469f-be4f-abe21280ef7f.control
- 创建 realm 的时候生成, 该对象提供 watch-notify 机制,realm 信息变更的时候 通知其他节点的客户端
periods.52470633-db3c-4205-86b6-bef9830c63bf.1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| [root@node85 tmp]# ceph-dencoder import periods.4734ae69-b34e-406b-bdb2-8bb07545560d.1 type RGWPeriod decode dump_json
{
//perio ID
"id": "4734ae69-b34e-406b-bdb2-8bb07545560d",
// 可以理解为一个版本号,每次状态变更都会+1
"epoch": 1,
"predecessor_uuid": "aa7f8da8-d147-4870-9dba-1c035b12b5e0",
"sync_status": [],
//描述 zonegroup 和 zone 状态信息
"period_map": {
"id": "4734ae69-b34e-406b-bdb2-8bb07545560d",
"zonegroups": [
{
"id": "3dd507a4-288e-45de-a4ac-2287172a1ea1",
"name": "et_uos_master_zonegroup_name",
"api_name": "et_uos_master_zonegroup_name",
"is_master": "true",
"endpoints": [],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "60293779-abc2-430f-b0dd-fa301fa90702",
"zones": [
{
"id": "60293779-abc2-430f-b0dd-fa301fa90702",
"name": "et_uos_master_zone",
"endpoints": [],
"log_meta": "false",
"log_data": "false",
"bucket_index_max_shards": 0,
"read_only": "false",
"tier_type": "",
"sync_from_all": "true",
"sync_from": [],
"redirect_zone": ""
}
],
"placement_targets": [
{
"name": "policy",
"tags": [],
"storage_classes": [
"STANDARD"
],
"data_force_encrypt": "false"
}
],
"default_placement": "policy",
"realm_id": "d6689a75-f22e-4f4a-aa66-45c0c15f420a"
}
],
"short_zone_ids": [
{
"key": "60293779-abc2-430f-b0dd-fa301fa90702",
"val": 520533588
}
]
},
"master_zonegroup": "3dd507a4-288e-45de-a4ac-2287172a1ea1",
"master_zone": "60293779-abc2-430f-b0dd-fa301fa90702",
"period_config": {
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
}
},
"realm_id": "d6689a75-f22e-4f4a-aa66-45c0c15f420a",
"realm_name": "et_uos_master_realm",
"realm_epoch": 2
}
[root@node85 tmp]#
|
periods.502c06f3-700a-4484-a813-fd928841dbea.latest_epoch
创建 realm 的时候生成
里面存放 的最新period epcoh(每次 realm 信息变更都会递增)
命名方式: realms..latest_epoch
该对象的后缀 latest_epoch 可由参数 rgw_period_latest_epoch_info_oid 指定
period_config.0cce92dc-0cba-44d2-ae34-673d3f787093
period_config.
存放桶和用户的配额参数
zonegroups_names.expondata
zonegroup_info.38e50b67-8655-4094-b632-1e97c1100439
- 创建zonegroup 时生成的,用来保存 zonegroup 信息
- *保存了 zonegroup 的元数据信息,对象命名规则**: zonegroup .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| //获取对象信息
[root@7c31c0c6784c build]# rados get -p .rgw.root zonegroups_names.expondata zonegroup_info.38e50b67-8655-4094-b632-1e97c1100439 zonegroup_info.38e50b67-8655-4094-b632-1e97c1100439
//解码
[root@7c31c0c6784c build]# ceph-dencoder import zonegroup_info.38e50b67-8655-4094-b632-1e97c1100439 type RGWZoneGroup decode dump_json
{
"id": "38e50b67-8655-4094-b632-1e97c1100439",
"name": "expondata_rui",
"api_name": "expondata_rui",
"is_master": "true",
"endpoints": [],
"hostnames": [],
"hostnames_s3website": [],
"master_zone": "",
"zones": [],
"placement_targets": [],
"default_placement": "",
"realm_id": "2dbb2f6b-06ea-44bc-b66b-d18c46205746"
}
|
zone_names.et_uos_master_zone
zone_info.60293779-abc2-430f-b0dd-fa301fa90702
- 创建zone 时生成的,用来保存 zone 信息
- 保存了 zone 的元数据信息,对象命名规则**: **zone_info.
*domain_root*
“domain_root”: “et_uos_master_zone.rgw.meta:root”
当我们创建了一个桶后,et_uos_master_zone.rgw.meta:root 多了 两个对象
*命名规则:*
.bucket.meta.hrp:adbdbd21-2aab-49c8-8682-51ab72ff20e2.4224.1
- .bucket.meta.[bucket_name]:[桶id]
- 桶id 构成:[全局唯一的实例id].[num] 其中num在当前RGW实例中单调递增
HRP:
-{bucket name}
*包含内容以及作用*
.bucket.meta.hrp:adbdbd21-2aab-49c8-8682-51ab72ff20e2.4224.1
用 rados 命令导出来(是看不了的,还需要 用 ceph-dump 解析下)
rados get -p expondata.rgw.meta -N root .bucket.meta.HRP:da7eeaa4-fbfc-4254-8a0b-bcff352f32c7.4210.1 HRP
这里内容是ceph 代码里面的一个类decode 而成(至于为什么知道 是这个类,只有看代码知道)
从下面内容可以 看到该信息是记录 桶的元数据信息
展开源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
| [root@7c31c0c6784c build]
{
"bucket": {
"name": "HRP", //
"marker": "da7eeaa4-fbfc-4254-8a0b-bcff352f32c7.4210.1",
"bucket_id": "da7eeaa4-fbfc-4254-8a0b-bcff352f32c7.4210.1",
"tenant": "", //租户
//明确指定那个改桶数据数据要放在那个池子
"explicit_placement": {
"data_pool": "",
"data_extra_pool": "",
"index_pool": ""
}
},
"creation_time": "2023-08-11 06:47:15.151663Z",
//桶是由那个用户创建的
"owner": "testid",
//该falg 与桶的状态有关系
BUCKET_SUSPENDED = 0x1,
BUCKET_VERSIONED = 0x2,
BUCKET_VERSIONS_SUSPENDED = 0x4,
BUCKET_DATASYNC_DISABLED = 0X8,
BUCKET_MFA_ENABLED = 0X10,
BUCKET_OBJ_LOCK_ENABLED = 0X20,
BUCKET_WORM_ENABLED = 0X40, //worm功能开启标识
"flags": 0,
//所属的 zongroup
"zonegroup": "bc1df498-d35f-41db-84bd-0c60407058c3",
"placement_rule": "default-placement/STANDARD",
//桶信息现在驻留在实例特定的对象中,即 .bucket.meta.HRP:...
"has_instance_obj": "true",
//桶的quota
"quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
//回源规则
"redirection_rules": [],
//桶的分片
"num_shards": 0,
"bi_shard_hash_type": 0,
"requester_pays": "false",
"has_website": "false",
"swift_versioning": "false",
"swift_ver_location": "",
"index_type": 0,
"mdsearch_config": [],
"reshard_status": 0,
"new_bucket_instance_id": "",
"merge_flag": 1,
// 桶策略
"policy_rule": {
"policy_id": "",
"policy_info": [],
"ctime": "0.000000"
},
"obj_lock": {
"enabled": "true",
"rule_exist": "false",
"rule": {
"defaultRetention": {
"mode": "",
"days": 0,
"years": 0
}
}
},
"version": 7,
"redirect_mon": "false",
"tagsearch_config": []
}
[root@7c31c0c6784c build]
|
HRP
rados get -p expondata.rgw.meta -N root HRP hrp_bucket
*gc_pool*
“gc_pool”: “expondata.rgw.log:gc”
在删除桶里的对象时,数据并不是马上清除,而是过了一段时间才删除,等待时间 默认为 2h( 由参数 rgw_gc_obj_min_wait 限定),待删除的对象信息就存放在gc_pool的 对象里面
可以看到 gc 池中有32个对象,称为 gc shard ,这样可以为rgw 提供并发删除
*命名规则*
gc.0
· gc.[shardnumber]
shard number 由 参数 rgw_gc_max_objs 控制,默认是32个,所以你能看到 gc的obj数量
*包含内容以及作用*
看下 gc对象有什么数据,下图可见 size为0
从一个桶里删除数据后,待删除信息都会持久话到底层 ,我们可以用 radosgw-admin gc list –include-all
展开源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
[root@node85 09cf5f5d-a79d-4a6e-8e04-135ba48a3b18]# s3cmd put ceph.log.20230807-22-1691416861.gz s3:
upload: 'ceph.log.20230807-22-1691416861.gz' -> 's3://hrp/ceph.log.20230807-22-1691416861.gz' [1 of 1]
10835114 of 10835114 100% in 0s 24.47 MB/s done
[root@node85 09cf5f5d-a79d-4a6e-8e04-135ba48a3b18]# s3cmd ls s3:
2023-08-14 11:51 10835114 s3:
[root@node85 09cf5f5d-a79d-4a6e-8e04-135ba48a3b18]# radosgw-admin gc list --include-all
[]
[root@node85 09cf5f5d-a79d-4a6e-8e04-135ba48a3b18]# s3cmd del s3:
delete: 's3://hrp/ceph.log.20230807-22-1691416861.gz'
[root@node85 09cf5f5d-a79d-4a6e-8e04-135ba48a3b18]# radosgw-admin gc list --include-all
[
{
"tag": "60293779-abc2-430f-b0dd-fa301fa90702.1515771.585\u0000",
"time": "2023-08-14 21:52:43.0.116715s",
"objs": [
{
"pool": "c0a1606f-867c-45db-b41e-4b41d64e0972",
"oid": "60293779-abc2-430f-b0dd-fa301fa90702.78088.1__shadow_ceph.log.20230807-22-1691416861.gz.fXZygoPuf13I95dswoRcwI0o8dndqfZ_0",
"key": "",
"instance": ""
},
{
"pool": "c0a1606f-867c-45db-b41e-4b41d64e0972",
"oid": "60293779-abc2-430f-b0dd-fa301fa90702.78088.1__shadow_ceph.log.20230807-22-1691416861.gz.fXZygoPuf13I95dswoRcwI0o8dndqfZ_1",
"key": "",
"instance": ""
},
{
"pool": "c0a1606f-867c-45db-b41e-4b41d64e0972",
"oid": "60293779-abc2-430f-b0dd-fa301fa90702.78088.1__shadow_ceph.log.20230807-22-1691416861.gz.fXZygoPuf13I95dswoRcwI0o8dndqfZ_2",
"key": "",
"instance": ""
}
]
}
]
|
//验证下 刚才删除的桶里的数据,再底层是否存在 ( 从上面gc 信息可以知道 对象的oid和pool)
1 2 3 4 5
| [root@node85 09cf5f5d-a79d-4a6e-8e04-135ba48a3b18]# rados stat -p c0a1606f-867c-45db-b41e-4b41d64e0972 60293779-abc2-430f-b0dd-fa301fa90702.78088.1__shadow_ceph.log.20230807-22-1691416861.gz.fXZygoPuf13I95dswoRcwI0o8dndqfZ_0
c0a1606f-867c-45db-b41e-4b41d64e0972/60293779-abc2-430f-b0dd-fa301fa90702.78088.1__shadow_ceph.log.20230807-22-1691416861.gz.fXZygoPuf13I95dswoRcwI0o8dndqfZ_0 mtime 2023-08-14 19:51:58.000000, size 4194304
|
这些数据持久化到哪里呢?
gc数据 持久化到对象的omap中 ,每条gc信息 都以kv值性质 存放在 rocksdb中,( 这也说明了 为什么 对象存储批量删除数据,omap 数据会增大)
下图是 刚才删除对象 信息, 可以看到 value 包含了包含了 刚才删除的数据
*control_pool** *
在RGW上启动时候, 在control pool创建若干个对象(默认是8个,由 (rgw_num_control_oids 控制 ) 用于参与 watch-notify 机制;
RGW使用 control pool 下的对象在运行在同一个zone 中的不同RGW进程之间发送消息;这些消息包括元数据缓存失效信息
这些信息在 元数据被修改时 被发送(例如用户或桶信息)。控制对象的数量越多,这些消息的并发性就越好,但代价是资源利用率更高。
// 场景
*命名规则*
· notify.[shardnumber]
shardnumber 由 参数 rgw_num_control_oids 控制 默认为8
·
*包含内容以及作用*
notify 对象再 control池,共有八个obj
可以通过 rados listwatchers 观察到notify obj的监听客户端
举个例子:
85节点上 用rados watch 命令 监听一个 notify对象
86节点上 用rados notify 命令 往一个 notify对象 发消息
*lc_pool*
*log_pool*
*intent_log_pool*
*usage_log_pool*
*reshard_pool*
*user_keys_pool*
*user_email_pool*
*user_swift_pool*
* **user_uid_pool*
* **otp_pool*