-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathriak_core_metadata.html
327 lines (298 loc) · 25.2 KB
/
riak_core_metadata.html
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Riak Core Metadata — Little Riak Core Book 1.0 documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Riak Core Security" href="riak_core_security.html" />
<link rel="prev" title="Starting" href="starting.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head>
<body role="document">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="riak-core-metadata">
<h1>Riak Core Metadata<a class="headerlink" href="#riak-core-metadata" title="Permalink to this headline">¶</a></h1>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">The first 3 sections are taken from here
<a class="reference external" href="https://gist.github.com/jrwest/d290c14e1c472e562548">https://gist.github.com/jrwest/d290c14e1c472e562548</a></p>
</div>
<div class="section" id="overview">
<h2>1. Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
<p>Cluster Metadata is intended to be used by <cite>riak_core</cite> applications
wishing to work with information stored cluster-wide. It is useful for
storing application metadata or any information that needs to be
read without blocking on communication over the network.</p>
<div class="section" id="data-model">
<h3>1.1 Data Model<a class="headerlink" href="#data-model" title="Permalink to this headline">¶</a></h3>
<p>Cluster Metadata is a key-value store. It treats values as opaque
Erlang terms that are fully addressed by their “Full Prefix” and
“Key”. A Full Prefix is a <cite>{atom() | binary(), atom() | binary()}</cite>,
while a Key is any Erlang term. The first element of the Full Prefix
is referred to as the “Prefix” and the second as the “Sub-Prefix”.</p>
</div>
<div class="section" id="storage">
<h3>1.2 Storage<a class="headerlink" href="#storage" title="Permalink to this headline">¶</a></h3>
<p>Values are stored on-disk and a full copy is also maintained
in-memory. This allows reads to be performed only from memory, while
writes are affected in both mediums.</p>
</div>
<div class="section" id="consistency">
<h3>1.3 Consistency<a class="headerlink" href="#consistency" title="Permalink to this headline">¶</a></h3>
<p>Updates in Cluster Metadata are eventually consistent. Writing a value
only requires acknowledgment from a single node and as previously
mentioned, reads return values from the local node, only.</p>
</div>
<div class="section" id="replication">
<h3>1.4 Replication<a class="headerlink" href="#replication" title="Permalink to this headline">¶</a></h3>
<p>Updates are replicated to every node in the cluster, including nodes
that join the cluster after the update has already reached all nodes
in the previous set of members.</p>
</div>
</div>
<div class="section" id="api">
<h2>2. API<a class="headerlink" href="#api" title="Permalink to this headline">¶</a></h2>
<p>The interface to Cluster Metadata is provided by the
<a class="reference external" href="https://github.com/basho/riak_core/blob/develop/src/riak_core_metadata.erl">riak_core_metadata</a>
module. The module’s documentation is the official source for
information about the API, but some details are re-iterated here.</p>
<div class="section" id="reading-and-writing">
<h3>2.1 Reading and Writing<a class="headerlink" href="#reading-and-writing" title="Permalink to this headline">¶</a></h3>
<p>Reading the local value for a key can be done with the <cite>get/2,3</cite>
functions. Like most <cite>riak_core_metadata</cite> functions, the higher arity
version takes a set of possible options, while the lower arity
function uses the defaults.</p>
<p>Updating a key is done using <cite>put/3.4</cite>. Performing a put only blocks
until the write is affected locally. The broadcast of the update is
done asynchronously.</p>
<div class="section" id="deleting-keys">
<h4>2.1.1 Deleting Keys<a class="headerlink" href="#deleting-keys" title="Permalink to this headline">¶</a></h4>
<p>Deletion of keys is logical and tombstones are not
reaped. <cite>delete/2,3</cite> act the same as <cite>put/3,4</cite> with respect to
blocking and broadcast.</p>
</div>
</div>
<div class="section" id="iterators">
<h3>2.2 Iterators<a class="headerlink" href="#iterators" title="Permalink to this headline">¶</a></h3>
<p>Along with reading individual keys, the API also allows Full Prefixes
to be iterated over. Iterators can visit both keys and values. They
are not ordered, nor are they read-isolated. However, they do
guarantee that each key is seen <em>at most once</em> for the lifetime of an
iterator.</p>
<p>See <cite>iterator/2</cite> and the <cite>itr_*</cite> functions.</p>
</div>
<div class="section" id="conflict-resolution">
<h3>2.3 Conflict Resolution<a class="headerlink" href="#conflict-resolution" title="Permalink to this headline">¶</a></h3>
<p>Conflict resolution can be done on read or write.</p>
<p>On read, if the conflict is resolved, an option, <cite>allow_put</cite>, passed
to <cite>get/3</cite> or <cite>iterator/2</cite> controls whether or not the resolved value
will be written back to local storage and broadcast asynchronously.</p>
<p>On write, conflicts are resolved by passing a function instead of a
new value to <cite>put/3,4</cite>. The function is passed the list of existing
values and can use this and values captured within the closure to
produce a new value to store.</p>
</div>
<div class="section" id="detecting-changes-in-groups-of-keys">
<h3>2.4 Detecting Changes in Groups of Keys<a class="headerlink" href="#detecting-changes-in-groups-of-keys" title="Permalink to this headline">¶</a></h3>
<p>The <cite>prefix_hash/1</cite> function can be polled to determined when groups
of keys, by Prefix or Full Prefix, have changed.</p>
</div>
</div>
<div class="section" id="common-pitfalls-other-notes">
<h2>3. Common Pitfalls & Other Notes<a class="headerlink" href="#common-pitfalls-other-notes" title="Permalink to this headline">¶</a></h2>
<p>The following is by no means a complete list of things to keep in mind
when developing on top of Cluster Metadata.</p>
<div class="section" id="storage-limitations">
<h3>3.1 Storage Limitations<a class="headerlink" href="#storage-limitations" title="Permalink to this headline">¶</a></h3>
<p>Cluster Metadata use <cite>dets</cite> for on-disk storage. There is a <cite>dets</cite>
table per Full Prefix, which limits the amount of data stored under
each Full Prefix to 2GB. This size includes the overhead of
information stored alongside values, such as the logical clock and
key.</p>
<p>Since a full-copy of the data is kept in-memory, its usage must also
be considered.</p>
</div>
<div class="section" id="replication-limitations">
<h3>3.2 Replication Limitations<a class="headerlink" href="#replication-limitations" title="Permalink to this headline">¶</a></h3>
<p>Cluster Metadata uses disterl for message delivery, like most Erlang
applications. Standard caveats and issues with large and/or too
frequent messages still apply.</p>
</div>
<div class="section" id="last-write-wins">
<h3>3.3 Last-Write Wins<a class="headerlink" href="#last-write-wins" title="Permalink to this headline">¶</a></h3>
<p>The default conflict resolution strategy on read is
last-write-wins. The usual caveats about the dangers of this method
apply.</p>
</div>
<div class="section" id="pathological-eventual-consistency">
<h3>3.4 “Pathological Eventual Consistency”<a class="headerlink" href="#pathological-eventual-consistency" title="Permalink to this headline">¶</a></h3>
<p>The extremely frequent writing back of resolved values after read in
an eventually consistent store where acknowledgment is only required
from one node for both types of operations can lead to an interesting
pathological case where siblings continue to be produce (although the
set does not grow unbounded). A very rough exploration of this can be
found <a class="reference external" href="https://gist.github.com/jrwest/f8c0d49174f4db1c4c88">here</a>).</p>
<p>If a <cite>riak_core</cite> application is likely to have concurrent writes and
wishes to read extremely frequently, e.g. in the Riak request path, it
may be advisable to use <cite>{allow_put, false}</cite> with <cite>get/3</cite>.</p>
</div>
</div>
<div class="section" id="playing-in-the-repl">
<h2>4. Playing in the REPL<a class="headerlink" href="#playing-in-the-repl" title="Permalink to this headline">¶</a></h2>
<p>we start by building and running our app:</p>
<div class="highlight-shell"><div class="highlight"><pre><span></span>rebar3 release
rebar3 run
</pre></div>
</div>
<p>First let’s setup some variables, FullPrefix is like an identifier for the
place where we are going to store related values, there can be many, some of
them are used by other components of riak_core as you will see in the next
sections.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">1</span><span class="o">></span> <span class="nv">FullPrefix</span> <span class="o">=</span> <span class="p">{</span><span class="o"><<</span><span class="s">"tanodb"</span><span class="o">>></span><span class="p">,</span> <span class="o"><<</span><span class="s">"config"</span><span class="o">>></span><span class="p">}.</span>
<span class="p">{</span><span class="o"><<</span><span class="s">"tanodb"</span><span class="o">>></span><span class="p">,</span><span class="o"><<</span><span class="s">"config"</span><span class="o">>></span><span class="p">}</span>
</pre></div>
</div>
<p>Let’s start by trying to get a value that is not set, by default we get undefined.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">2</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nb">get</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">max_users</span><span class="p">).</span>
<span class="n">undefined</span>
</pre></div>
</div>
<p>We can change that by calling the get function that supports options, one of
them is <strong>default</strong>, so we set it to a value that makes sense for use in case
max_users is not set.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">3</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nb">get</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">max_users</span><span class="p">,</span> <span class="p">[{</span><span class="n">default</span><span class="p">,</span> <span class="mi">100</span><span class="p">}]).</span>
<span class="mi">100</span>
</pre></div>
</div>
<p>Now let’s put the value in the store.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">4</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nb">put</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">max_users</span><span class="p">,</span> <span class="mi">150</span><span class="p">).</span>
<span class="n">ok</span>
</pre></div>
</div>
<p>And try getting it.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">5</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nb">get</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">max_users</span><span class="p">).</span>
<span class="mi">150</span>
</pre></div>
</div>
<p>Let’s put another value.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">6</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nb">put</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">max_connections</span><span class="p">,</span> <span class="mi">100</span><span class="p">).</span>
<span class="n">ok</span>
</pre></div>
</div>
<p>Get all the values in this prefix as a list, the “d” there is because [100] looks
like a string to erlang, don’t worry, your value is safe.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">7</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nf">to_list</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">).</span>
<span class="p">[{</span><span class="n">max_connections</span><span class="p">,</span><span class="s">"d"</span><span class="p">},{</span><span class="n">max_users</span><span class="p">,[</span><span class="mi">150</span><span class="p">]}]</span>
</pre></div>
</div>
<p>Now let’s delete a value.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">8</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nf">delete</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">max_users</span><span class="p">).</span>
<span class="n">ok</span>
</pre></div>
</div>
<p>And put another one.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">9</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nb">put</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">,</span> <span class="n">hostname</span><span class="p">,</span> <span class="s">"tanodb1"</span><span class="p">).</span>
<span class="n">ok</span>
</pre></div>
</div>
<p>Now let’s list them again, you will see that deleted values are still there but
<strong>marked</strong> with a “thombstone” value (the atom ‘$deleted’), this means we have
to handle them in our functions if we want to avoid trouble.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nf">to_list</span><span class="p">(</span><span class="nv">FullPrefix</span><span class="p">).</span>
<span class="p">[{</span><span class="n">max_connections</span><span class="p">,</span><span class="s">"d"</span><span class="p">},</span>
<span class="p">{</span><span class="n">max_users</span><span class="p">,[</span><span class="n">'$deleted'</span><span class="p">]},</span>
<span class="p">{</span><span class="n">hostname</span><span class="p">,[</span><span class="s">"tanodb1"</span><span class="p">]}]</span>
</pre></div>
</div>
<p>Now let’s do something more complex, let’s iterate over all the values in the
prefix, count the amount of deleted values and accumulate the “alive” ones.</p>
<p>Notice I use a function clause to match the thombstone first and then one to
handle “alive” values.</p>
<div class="highlight-erlang"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="nn">riak_core_metadata</span><span class="p">:</span><span class="nf">fold</span><span class="p">(</span><span class="k">fun</span>
<span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="p">({</span><span class="nv">Key</span><span class="p">,</span> <span class="p">[</span><span class="n">'$deleted'</span><span class="p">]},</span> <span class="p">{</span><span class="nv">Deleted</span><span class="p">,</span> <span class="nv">Alive</span><span class="p">})</span> <span class="o">-></span>
<span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="p">{</span><span class="nv">Deleted</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nv">Alive</span><span class="p">};</span>
<span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="p">({</span><span class="nv">Key</span><span class="p">,</span> <span class="p">[</span><span class="nv">Value</span><span class="p">]},</span> <span class="p">{</span><span class="nv">Deleted</span><span class="p">,</span> <span class="nv">Alive</span><span class="p">})</span> <span class="o">-></span>
<span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="p">{</span><span class="nv">Deleted</span><span class="p">,</span> <span class="p">[{</span><span class="nv">Key</span><span class="p">,</span> <span class="nv">Value</span><span class="p">}|</span><span class="nv">Alive</span><span class="p">]}</span>
<span class="p">(</span><span class="n">tanodb</span><span class="p">@</span><span class="mi">127</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">)</span><span class="mi">11</span><span class="o">></span> <span class="k">end</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="p">[]},</span> <span class="nv">FullPrefix</span><span class="p">).</span>
<span class="p">{</span><span class="mi">1</span><span class="p">,[{</span><span class="n">max_connections</span><span class="p">,</span><span class="mi">100</span><span class="p">},{</span><span class="n">hostname</span><span class="p">,</span><span class="s">"tanodb1"</span><span class="p">}]}</span>
</pre></div>
</div>
<p>There are more functions I didn’t show here since this ones are the main ones
you will uses, you can look at the riak_core_metadata module for the other ones,
the module has good documentation for each function.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="index.html">Little Riak Core Book</a></h1>
<h3>Navigation</h3>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="starting.html">Starting</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Riak Core Metadata</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#overview">1. Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="#api">2. API</a></li>
<li class="toctree-l2"><a class="reference internal" href="#common-pitfalls-other-notes">3. Common Pitfalls & Other Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="#playing-in-the-repl">4. Playing in the REPL</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="riak_core_security.html">Riak Core Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="riak_core_resize.html">Ring Resize Operations</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
<li>Previous: <a href="starting.html" title="previous chapter">Starting</a></li>
<li>Next: <a href="riak_core_security.html" title="next chapter">Riak Core Security</a></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<div><input type="text" name="q" /></div>
<div><input type="submit" value="Go" /></div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
©2017, Mariano Guerra, Heinz N. Gies.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a>
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.8</a>
|
<a href="_sources/riak_core_metadata.rst.txt"
rel="nofollow">Page source</a>
</div>
</body>
</html>