15003: Fix import cycle.
[arvados.git] / doc / install / install-keepstore.html.textile.liquid
1 ---
2 layout: default
3 navsection: installguide
4 title: Install Keepstore servers
5 ...
6 {% comment %}
7 Copyright (C) The Arvados Authors. All rights reserved.
8
9 SPDX-License-Identifier: CC-BY-SA-3.0
10 {% endcomment %}
11
12 Keepstore provides access to underlying storage for reading and writing content-addressed blocks, with enforcement of Arvados permissions.  Keepstore supports a variety of cloud object storage and POSIX filesystems for its backing store.
13
14 We recommend starting off with two Keepstore servers.  Exact server specifications will be site and workload specific, but in general keepstore will be I/O bound and should be set up to maximize aggregate bandwidth with compute nodes.  To increase capacity (either space or throughput) it is straightforward to add additional servers, or (in cloud environments) to increase the machine size of the existing servers.
15
16 By convention, we use the following hostname pattern:
17
18 <div class="offset1">
19 table(table table-bordered table-condensed).
20 |_Hostname_|
21 |keep0.@uuid_prefix@.your.domain|
22 |keep1.@uuid_prefix@.your.domain|
23 </div>
24
25 Keepstore servers should not be directly accessible from the Internet (they are accessed via "keepproxy":install-keepproxy.html), so the hostnames only need to resolve on the private network.
26
27 h2. Install Keepstore
28
29 On Debian-based systems:
30
31 <notextile>
32 <pre><code>~$ <span class="userinput">sudo apt-get install keepstore</span>
33 </code></pre>
34 </notextile>
35
36 On Red Hat-based systems:
37
38 <notextile>
39 <pre><code>~$ <span class="userinput">sudo yum install keepstore</span>
40 </code></pre>
41 </notextile>
42
43 Verify that Keepstore is functional:
44
45 <notextile>
46 <pre><code>~$ <span class="userinput">keepstore --version</span>
47 </code></pre>
48 </notextile>
49
50 h3. Create config file
51
52 By default, keepstore will look for its configuration file at @/etc/arvados/keepstore/keepstore.yml@
53
54 You can override the configuration file location using the @-config@ command line option to keepstore.
55
56 The following is a sample configuration file:
57
58 <pre>
59 # Duration for which new permission signatures (returned in PUT
60 # responses) will be valid.  This should be equal to the API
61 # server's blob_signature_ttl configuration entry.
62 BlobSignatureTTL: 336h0m0s
63
64 # Local file containing the secret blob signing key (used to generate
65 # and verify blob signatures).  The contents of the key file must be
66 # identical to the API server's blob_signing_key configuration entry.
67 BlobSigningKeyFile: ""
68
69 # Print extra debug logging
70 Debug: false
71
72 # Maximum number of concurrent block deletion operations (per
73 # volume) when emptying trash. Default is 1.
74 EmptyTrashWorkers: 1
75
76 # Enable trash and delete features. If false, trash lists will be
77 # accepted but blocks will not be trashed or deleted.
78 # Keepstore does not delete data on its own.  The keep-balance
79 # service determines which blocks are candidates for deletion
80 # and instructs the keepstore to move those blocks to the trash.
81 EnableDelete: true
82
83 # Local port to listen on. Can be 'address:port' or ':port', where
84 # 'address' is a host IP address or name and 'port' is a port number
85 # or name.
86 Listen: :25107
87
88 # Format of request/response and error logs: "json" or "text".
89 LogFormat: json
90
91 # The secret key that must be provided by monitoring services when
92 # using the health check and metrics endpoints (/_health, /metrics).
93 ManagementToken: xyzzy
94
95 # Maximum RAM to use for data buffers, given in multiples of block
96 # size (64 MiB). When this limit is reached, HTTP requests requiring
97 # buffers (like GET and PUT) will wait for buffer space to be
98 # released.
99 #
100 # It should be set such that MaxBuffers * 64MiB + 10% fits
101 # comfortably in memory. On a host dedicated to running keepstore,
102 # divide total memory by 88MiB to suggest a suitable value. For example,
103 # if grep MemTotal /proc/meminfo reports MemTotal: 7125440 kB,
104 # compute 7125440 / (88 * 1024)=79 and configure MaxBuffers: 79
105 MaxBuffers: 128
106
107 # Maximum concurrent requests. When this limit is reached, new
108 # requests will receive 503 responses. Note: this limit does not
109 # include idle connections from clients using HTTP keepalive, so it
110 # does not strictly limit the number of concurrent connections. If
111 # omitted or zero, the default is 2 * MaxBuffers.
112 MaxRequests: 0
113
114 # Path to write PID file during startup. This file is kept open and
115 # locked with LOCK_EX until keepstore exits, so "fuser -k pidfile" is
116 # one way to shut down. Exit immediately if there is an error
117 # opening, locking, or writing the PID file.
118 PIDFile: ""
119
120 # Maximum number of concurrent pull operations. Default is 1, i.e.,
121 # pull lists are processed serially.  A pull operation copies a block
122 # from another keepstore server.
123 PullWorkers: 1
124
125 # Honor read requests only if a valid signature is provided.  This
126 # should be true, except for development use and when migrating from
127 # a very old version.
128 RequireSignatures: true
129
130 # Local file containing the Arvados API token used by keep-balance
131 # or data manager.  Delete, trash, and index requests are honored
132 # only for this token.
133 SystemAuthTokenFile: ""
134
135 # Path to server certificate file in X509 format. Enables TLS mode.
136 #
137 # Example: /var/lib/acme/live/keep0.example.com/fullchain
138 TLSCertificateFile: ""
139
140 # Path to server key file in X509 format. Enables TLS mode.
141 #
142 # The key pair is read from disk during startup, and whenever SIGHUP
143 # is received.
144 #
145 # Example: /var/lib/acme/live/keep0.example.com/privkey
146 TLSKeyFile: ""
147
148 # How often to check for (and delete) trashed blocks whose
149 # TrashLifetime has expired.
150 TrashCheckInterval: 24h0m0s
151
152 # Time duration after a block is trashed during which it can be
153 # recovered using an /untrash request.
154 TrashLifetime: 336h0m0s
155
156 # Maximum number of concurrent trash operations (moving a block to the
157 # trash, or permanently deleting it) . Default is 1, i.e., trash lists
158 # are processed serially.  If individual trash operations have high
159 # latency (eg some cloud platforms) you should increase this.
160 TrashWorkers: 1
161 </pre>
162
163 h3. Notes on storage management
164
165 On its own, a keepstore server never deletes data.  The "keep-balance":install-keep-balance.html service determines which blocks are candidates for deletion and instructs the keepstore to move those blocks to the trash.
166
167 When a block is newly written, it is protected from deletion for the duration in @BlobSignatureTTL@.  During this time, it cannot be trashed.
168
169 If keep-balance instructs keepstore to trash a block which is older than @BlobSignatureTTL@, and @EnableDelete@ is true, the block will be moved to "trash".  A block which is in the trash is no longer accessible by read requests, but has not yet been permanently deleted.  Blocks which are in the trash may be recovered using the "untrash" API endpoint.  Blocks are permanently deleted after they have been in the trash for the duration in @TrashLifetime@.
170
171 Keep-balance is also responsible for balancing the distribution of blocks across keepstore servers by asking servers to pull blocks from other servers (as determined by their "storage class":{{site.baseurl}}/admin/storage-classes.html and "rendezvous hashing order":{{site.baseurl}}/api/storage.html).  Pulling a block makes a copy.  If a block is overreplicated (i.e. there are excess copies) after pulling, it will be subsequently trashed on the original server.
172
173 h3. Configure storage volumes
174
175 Available storage volume types include POSIX filesystems and cloud object storage.
176
177 * To use a POSIX filesystem, including both local filesystems (ext4, xfs) and network file system such as GPFS or Lustre, follow the setup instructions on "Filesystem storage":configure-fs-storage.html
178 * If you are using S3-compatible object storage (including Amazon S3, Google Cloud Storage, and Ceph RADOS), follow the setup instructions on "S3 Object Storage":configure-s3-object-storage.html
179 * If you are using Azure Blob Storage, follow the setup instructions on "Azure Blob Storage":configure-azure-blob-storage.html
180
181 h3. Run keepstore as a supervised service
182
183 Install runit to supervise the keepstore daemon.  {% include 'install_runit' %}
184
185 Install this script as the run script @/etc/sv/keepstore/run@ for the keepstore service:
186
187 <notextile>
188 <pre><code>#!/bin/sh
189
190 exec 2>&1
191 GOGC=10 exec keepstore -config /etc/arvados/keepstore/keepstore.yml
192 </code></pre>
193 </notextile>
194
195 h3. Set up additional servers
196
197 Repeat the above sections to prepare volumes and bring up supervised services on each Keepstore server you are setting up.
198
199 h3. Tell the API server about the Keepstore servers
200
201 The API server needs to be informed about the presence of your Keepstore servers.
202
203 First, if you don't already have an admin token, create a superuser token.
204
205 {% include 'create_superuser_token' %}
206
207 Configure your environment to run @arv@ using the output of create_superuser_token.rb:
208
209 <pre>
210 export ARVADOS_API_HOST=zzzzz.example.com
211 export ARVADOS_API_TOKEN=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
212 </pre>
213
214 Use this command to register each keepstore server you have installed.  Make sure to update the @service_host@ value.
215
216 <notextile>
217 <pre><code>~$ <span class="userinput">uuid_prefix=`arv --format=uuid user current | cut -d- -f1`</span>
218 ~$ <span class="userinput">echo "Site prefix is '$uuid_prefix'"</span>
219 ~$ <span class="userinput">read -rd $'\000' keepservice &lt;&lt;EOF; arv keep_service create --keep-service "$keepservice"</span>
220 <span class="userinput">{
221  "service_host":"<strong>keep0.$uuid_prefix.your.domain</strong>",
222  "service_port":25107,
223  "service_ssl_flag":false,
224  "service_type":"disk"
225 }
226 EOF</span>
227 </code></pre></notextile>
228
229 h3(#testing). Testing keep
230
231 Install the "Python SDK":{{site.baseurl}}/sdk/python/sdk-python.html
232
233 @ARVADOS_API_HOST@ and @ARVADOS_API_TOKEN@ must be set in the environment.
234
235 You should now be able to use @arv-put@ to upload collections and @arv-get@ to fetch collections:
236
237 <pre>
238 $ echo "hello world!" > hello.txt
239
240 $ arv-put --portable-data-hash hello.txt
241 2018-07-12 13:35:25 arvados.arv_put[28702] INFO: Creating new cache file at /home/example/.cache/arvados/arv-put/1571ec0adb397c6a18d5c74cc95b3a2a
242 0M / 0M 100.0% 2018-07-12 13:35:27 arvados.arv_put[28702] INFO:
243
244 2018-07-12 13:35:27 arvados.arv_put[28702] INFO: Collection saved as 'Saved at 2018-07-12 17:35:25 UTC by example@example'
245 59389a8f9ee9d399be35462a0f92541c+53
246
247 $ arv-get 59389a8f9ee9d399be35462a0f92541c+53/hello.txt
248 hello world!
249 </pre>