]> git.proxmox.com Git - ceph.git/blame - ceph/doc/radosgw/layout.rst
update sources to v12.1.0
[ceph.git] / ceph / doc / radosgw / layout.rst
CommitLineData
7c673cae
FG
1===========================
2 Rados Gateway Data Layout
3===========================
4
5Although the source code is the ultimate guide, this document helps
6new developers to get up to speed with the implementation details.
7
8Introduction
9------------
10
11Swift offers something called a container, that we use interchangeably with
12the term bucket. One may say that RGW's buckets implement Swift containers.
13
14This document does not consider how RGW operates on these structures,
15e.g. the use of encode() and decode() methods for serialization and so on.
16
17Conceptual View
18---------------
19
20Although RADOS only knows about pools and objects with their xattrs and
21omap[1], conceptually RGW organizes its data into three different kinds:
22metadata, bucket index, and data.
23
24Metadata
25^^^^^^^^
26
27We have 3 'sections' of metadata: 'user', 'bucket', and 'bucket.instance'.
28You can use the following commands to introspect metadata entries: ::
29
30 $ radosgw-admin metadata list
31 $ radosgw-admin metadata list bucket
32 $ radosgw-admin metadata list bucket.instance
33 $ radosgw-admin metadata list user
34
35 $ radosgw-admin metadata get bucket:<bucket>
36 $ radosgw-admin metadata get bucket.instance:<bucket>:<bucket_id>
37 $ radosgw-admin metadata get user:<user> # get or set
38
39Some variables have been used in above commands, they are:
40
41- user: Holds user information
42- bucket: Holds a mapping between bucket name and bucket instance id
43- bucket.instance: Holds bucket instance information[2]
44
45Every metadata entry is kept on a single rados object.
46See below for implementation defails.
47
48Note that the metadata is not indexed. When listing a metadata section we do a
49rados pgls operation on the containing pool.
50
51Bucket Index
52^^^^^^^^^^^^
53
54It's a different kind of metadata, and kept separately. The bucket index holds
55a key-value map in rados objects. By default it is a single rados object per
56bucket, but it is possible since Hammer to shard that map over multiple rados
57objects. The map itself is kept in omap, associated with each rados object.
58The key of each omap is the name of the objects, and the value holds some basic
59metadata of that object -- metadata that shows up when listing the bucket.
60Also, each omap holds a header, and we keep some bucket accounting metadata
61in that header (number of objects, total size, etc.).
62
63Note that we also hold other information in the bucket index, and it's kept in
64other key namespaces. We can hold the bucket index log there, and for versioned
65objects there is more information that we keep on other keys.
66
67Data
68^^^^
69
70Objects data is kept in one or more rados objects for each rgw object.
71
72Object Lookup Path
73------------------
74
75When accessing objects, ReST APIs come to RGW with three parameters:
76account information (access key in S3 or account name in Swift),
77bucket or container name, and object name (or key). At present, RGW only
78uses account information to find out the user ID and for access control.
79Only the bucket name and object key are used to address the object in a pool.
80
81The user ID in RGW is a string, typically the actual user name from the user
82credentials and not a hashed or mapped identifier.
83
84When accessing a user's data, the user record is loaded from an object
31f18b77 85"<user_id>" in pool "default.rgw.meta" with namespace "users.uid".
7c673cae 86
31f18b77
FG
87Bucket names are represented in the pool "default.rgw.meta" with namespace
88"root". Bucket record is
7c673cae
FG
89loaded in order to obtain so-called marker, which serves as a bucket ID.
90
31f18b77
FG
91The object is located in pool "default.rgw.buckets.data".
92Object name is "<marker>_<key>",
7c673cae
FG
93for example "default.7593.4_image.png", where the marker is "default.7593.4"
94and the key is "image.png". Since these concatenated names are not parsed,
95only passed down to RADOS, the choice of the separator is not important and
96causes no ambiguity. For the same reason, slashes are permitted in object
97names (keys).
98
99It is also possible to create multiple data pools and make it so that
100different users buckets will be created in different rados pools by default,
101thus providing the necessary scaling. The layout and naming of these pools
102is controlled by a 'policy' setting.[3]
103
104An RGW object may consist of several RADOS objects, the first of which
105is the head that contains the metadata, such as manifest, ACLs, content type,
106ETag, and user-defined metadata. The metadata is stored in xattrs.
107The head may also contain up to 512 kilobytes of object data, for efficiency
108and atomicity. The manifest describes how each object is laid out in RADOS
109objects.
110
111Bucket and Object Listing
112-------------------------
113
114Buckets that belong to a given user are listed in an omap of an object named
31f18b77
FG
115"<user_id>.buckets" (for example, "foo.buckets") in pool "default.rgw.meta"
116with namespace "users.uid".
7c673cae
FG
117These objects are accessed when listing buckets, when updating bucket
118contents, and updating and retrieving bucket statistics (e.g. for quota).
119
120See the user-visible, encoded class 'cls_user_bucket_entry' and its
121nested class 'cls_user_bucket' for the values of these omap entires.
122
123These listings are kept consistent with buckets in pool ".rgw".
124
125Objects that belong to a given bucket are listed in a bucket index,
126as discussed in sub-section 'Bucket Index' above. The default naming
31f18b77 127for index objects is ".dir.<marker>" in pool "default.rgw.buckets.index".
7c673cae
FG
128
129Footnotes
130---------
131
132[1] Omap is a key-value store, associated with an object, in a way similar
133to how Extended Attributes associate with a POSIX file. An object's omap
134is not physically located in the object's storage, but its precise
135implementation is invisible and immaterial to RADOS Gateway.
136In Hammer, one LevelDB is used to store omap in each OSD.
137
138[2] Before the Dumpling release, the 'bucket.instance' metadata did not
139exist and the 'bucket' metadata contained its information. It is possible
140to encounter such buckets in old installations.
141
31f18b77
FG
142[3] The pool names have been changed starting with the Infernalis release.
143If you are looking at an older setup, some details may be different. In
144particular there was a different pool for each of the namespaces that are
145now being used inside the default.root.meta pool.
7c673cae 146
31f18b77
FG
147Appendix: Compendium
148--------------------
7c673cae
FG
149
150Known pools:
151
152.rgw.root
153 Unspecified region, zone, and global information records, one per object.
154
31f18b77 155<zone>.rgw.control
7c673cae
FG
156 notify.<N>
157
31f18b77
FG
158<zone>.rgw.meta
159 Multiple namespaces with different kinds of metadata:
7c673cae 160
31f18b77
FG
161 namespace: root
162 <bucket>
163 .bucket.meta.<bucket>:<marker> # see put_bucket_instance_info()
7c673cae 164
31f18b77
FG
165 The tenant is used to disambiguate buckets, but not bucket instances.
166 Example::
7c673cae 167
31f18b77
FG
168 .bucket.meta.prodtx:test%25star:default.84099.6
169 .bucket.meta.testcont:default.4126.1
170 .bucket.meta.prodtx:testcont:default.84099.4
171 prodtx/testcont
172 prodtx/test%25star
173 testcont
7c673cae 174
31f18b77
FG
175 namespace: users.uid
176 Contains _both_ per-user information (RGWUserInfo) in "<user>" objects
177 and per-user lists of buckets in omaps of "<user>.buckets" objects.
178 The "<user>" may contain the tenant if non-empty, for example::
7c673cae 179
31f18b77
FG
180 prodtx$prodt
181 test2.buckets
182 prodtx$prodt.buckets
183 test2
7c673cae 184
31f18b77
FG
185 namespace: users.email
186 Unimportant
7c673cae 187
31f18b77
FG
188 namespace: users.keys
189 47UA98JSTJZ9YAN3OS3O
7c673cae 190
31f18b77 191 This allows radosgw to look up users by their access keys during authentication.
7c673cae 192
31f18b77
FG
193 namespace: users.swift
194 test:tester
195
196<zone>.rgw.buckets.index
7c673cae
FG
197 Objects are named ".dir.<marker>", each contains a bucket index.
198 If the index is sharded, each shard appends the shard index after
199 the marker.
200
31f18b77 201<zone>.rgw.buckets.data
7c673cae
FG
202 default.7593.4__shadow_.488urDFerTYXavx4yAd-Op8mxehnvTI_1
203 <marker>_<key>
204
205An example of a marker would be "default.16004.1" or "default.7593.4".
206The current format is "<zone>.<instance_id>.<bucket_id>". But once
207generated, a marker is not parsed again, so its format may change
208freely in the future.