Make glass the default backend
[xapian.git] / xapian-core / docs / admin_notes.rst
blob2c8c44531c4332ab1c1bc3a0db5b9526389a7960
2 .. Copyright (C) 2006 Lemur Consulting Ltd
3 .. Copyright (C) 2007,2008,2009,2010,2011,2012,2016 Olly Betts
5 ============================
6 Xapian Administrator's Guide
7 ============================
9 .. contents:: Table of contents
11 Introduction
12 ============
14 This document is intended to provide general hints, tips and advice to
15 administrators of Xapian systems.  It assumes that you have installed Xapian
16 on your system, and are familiar with the basics of creating and searching
17 Xapian databases.
19 The intended audience is system administrators who need to be able to perform
20 general management of a Xapian database, including tasks such as taking
21 backups and optimising performance.  It may also be useful introductory
22 reading for Xapian application developers.
24 The document is up-to-date for Xapian version 1.3.5 (probably!)
26 .. FIXME:1.4.0: ensure this is up to date for 1.4.0
28 Databases
29 =========
31 Xapian databases hold all the information needed to perform searches in a set
32 of tables.  The default database backend for the 1.4 release series is called
33 `glass`.  The default backend for the 1.2 release series was called `chert`,
34 and this is also supported by 1.4.
36 Glass Backend
37 -------------
39 The following table always exists:
41  - The `postlist` table holds a list of all the documents indexed by each term
42    in the database (`postings`), and also chunked streams of the values in each
43    value slot.
45 The following table exists by default, but you can choose not to have it:
47  - The `termlist` table holds a list of all the terms which index each
48    document, and also the value slots used in each document.  Without this,
49    some features aren't supported - see `Xapian::DB_NO_TERMLIST` for details.
51 And the following optional tables exist only when there is data to store in
52 them:
54  - The `docdata` table holds the document data associated with each document
55    in the database.  If you never set any term positions, this table won't
56    exist.
57  - The `position` table holds a list of all the word positions in each document
58    which each term occurs at.  If you never set positional data, this table
59    won't exist.
60  - The `spelling` table holds data for suggesting spelling corrections.
61  - The `synonym` table holds a synonym dictionary.
63 Each of the tables is held in a separate file with extension `.glass` (e.g.
64 `postlist.glass`), allowing an administrator to see how much data is being used
65 for each of the above purposes.
67 The `.glass` file actually stores the data, and is structured as a tree of
68 blocks, which have a default size of 8KB (though this can be set, either
69 through the Xapian API, or with some of the tools detailed later in this
70 document).
72 Changing the blocksize may have performance implications, but it is hard to
73 know whether these will be positive or negative for a particular combination
74 of hardware and software without doing some profiling.
76 The `.baseA` and `.baseB` files you may remember if you've worked Xapian
77 database backends no longer exist in glass databases - the information about
78 unused blocks is stored in a freelist (itself stored in unused blocks in
79 the `.glass` file, and the other information is stored in the `iamglass`
80 file.
82 Glass also supports databases stored in a single file - currently these only
83 support read operations, and have to be created by compacting an existing
84 glass database.
86 Chert Backend
87 -------------
89 The following tables always exist:
91  - The `postlist` holds a list of all the documents indexed by
92    each term in the database, and also chunked streams of the values in each
93    value slot.
94  - The `record` holds the document data associated with each document
95    in the database.
96  - The `termlist` holds a list of all the terms which index each
97    document, and also the value slots used in each document.
99 And the following optional tables exist only when there is data to store in
100 them:
102  - The `position` holds a list of all the word positions in each
103    document which each term occurs at.
104  - The `spelling` holds data for suggesting spelling corrections.
105  - The `synonym` holds a synonym dictionary.
107 Each of the tables is held in a separate file, allowing an administrator to
108 see how much data is being used for each of the above purposes.  It is not
109 always necessary to fully populate these tables: for example, if phrase
110 searches are never going to be performed on the database, it is not necessary
111 to store any positionlist information.
113 If you look at a Xapian database, you will see that each of these tables
114 actually uses 2 or 3 files.  For example, for a "chert" format database the
115 termlist table is stored in the files "termlist.baseA", "termlist.baseB"
116 and "termlist.DB".
118 The ".DB" file actually stores the data, and is structured as a tree of
119 blocks, which have a default size of 8KB (though this can be set, either
120 through the Xapian API, or with some of the tools detailed later in this
121 document).
123 The ".baseA" and ".baseB" files are used to keep track of where to start
124 looking for data in the ".DB" file (the root of the tree), and which blocks are
125 in use.  Often only one of the ".baseA" and ".baseB" files will be present;
126 each of these files refers to a revision of the database, and there may be more
127 than one valid revision of the database stored in the ".DB" file at once.
129 Changing the blocksize may have performance implications, but it is hard to
130 tell whether these will be positive or negative for a particular combination
131 of hardware and software without doing some profiling.
133 Atomic modifications
134 --------------------
136 Xapian ensures that all modifications to its database are performed
137 atomically.  This means that:
139  - From the point of view of a separate process (or a separate database object
140    in the same process) reading the database, all modifications made to a
141    database are invisible until the modifications is committed.
142  - The database on disk is always in a consistent state.
143  - If the system is interrupted during a modification, the database should
144    always be left in a valid state.  This applies even if the power is cut
145    unexpectedly, as long as the disk does not become corrupted due to hardware
146    failure.
148 Committing a modification requires several calls to the operating system to
149 make it flush any cached modifications to the database to disk.  This is to
150 ensure that if the system fails at any point, the database is left in a
151 consistent state.  Of course, this is a fairly slow process (since the system
152 has to wait for the disk to physically write the data), so grouping many
153 changes together will speed up the throughput considerably.
155 Many modifications can be explicitly grouped into a single transaction, so
156 that lots of changes are applied at once.  Even if an application doesn't
157 explicitly protect modifications to the database using transactions, Xapian
158 will group modifications into transactions, applying the modifications in
159 batches.
161 Note that it is not currently possible to extend Xapian's transactions to
162 cover multiple databases, or to link them with transactions in external
163 systems, such as an RDBMS.
165 Finally, note that it is possible to compile Xapian such that it doesn't make
166 modifications in an atomic manner, in order to build very large databases more
167 quickly (search the Xapian mailing list archives for "DANGEROUS" mode for more
168 details).  This isn't yet integrated into standard builds of Xapian, but may
169 be in future, if appropriate protections can be incorporated.
171 Single writer, multiple reader
172 ------------------------------
174 Xapian implements a "single writer, multiple reader" model.  This means that,
175 at any given instant, there is only permitted to be a single object modifying
176 a database, but there may (simultaneously) be many objects reading the
177 database at once.
179 Xapian enforces this restriction using by having a writer lock the database.
180 Each Xapian database directory contains a lock file named
181 ``flintlock`` (we've kept the same name as flint used, since the locking
182 technique is the same).
184 This lock-file will always exist, but will be locked using ``fcntl()`` when the
185 database is open for writing.  Because of the semantics of ``fcntl()`` locking,
186 for each WritableDatabase opened we spawn a child process to hold the lock,
187 which then exec-s ``cat``, so you will see a ``cat`` subprocess of any writer
188 process in the output of ``ps``, ``top``, etc.
190 If a writer exits without being given a chance to clean up (for example, if the
191 application holding the writer is killed), the ``fcntl()`` lock will be
192 automatically released by the operating system.  Under Microsoft Windows, we
193 use a different locking technique which doesn't require a child process, but
194 also means the lock is released automatically when the writing process exits.
196 Revision numbers
197 ----------------
199 Xapian databases contain a revision number.  This is essentially a count of
200 the number of modifications since the database was created, and is needed to
201 implement the atomic modification functionality.  It is stored as a 32 bit
202 integer, so there is a chance that a very frequently updated database could
203 cause this to overflow.  The consequence of such an overflow would be to throw
204 an exception reporting that the database has run out of revision numbers.
206 This isn't likely to be a practical problem, since it would take nearly a year
207 for a database to reach this limit if 100 modifications were committed every
208 second, and no normal Xapian system will commit more than once every few
209 seconds.  However, if you are concerned, you can use the ``xapian-compact``
210 tool to make a fresh copy of the database with the revision number set to 1.
212 The revision number of each table can be displayed by the ``xapian-check``
213 tool.
215 Network file systems
216 --------------------
218 Xapian should work correctly over a network file system.  However, there are
219 various potential issues with such file systems, so we recommend
220 extensive testing of your particular network file system before deployment.
222 Be warned that Xapian is heavily I/O dependent, and therefore performance over
223 a network file system is likely to be slow unless you've got a very well tuned
224 setup.
226 Xapian needs to be able to lock a file in a database directory when
227 modifications are being performed.  On some network files systems (e.g., NFS)
228 this requires a lock daemon to be running.
230 Which database format to use?
231 -----------------------------
233 As of release 1.4.0, you should generally use the glass format (which is now
234 the default).
236 Support for the pre-1.0 quartz format (deprecated in 1.0) was removed in 1.1.0.
237 See below for how to convert a quartz database to a flint one.
239 The flint backend (the default for 1.0, and still supported by 1.2.x) was
240 removed in 1.3.0.  See below for how to convert a flint database to a chert one.
242 The chert backend (the default for 1.2) is still supported by 1.4.x, but
243 deprecated - only use it if you already have databases in this format; and plan
244 to migrate away.
246 .. There's also a development backend called XXXXX.  The main distinguishing
247 .. feature of this is that the format may change incompatibly from time to time.
248 .. It passes Xapian's extensive testsuite, but has seen less real world use
249 .. than glass.
251 Can I put other files in the database directory?
252 ------------------------------------------------
254 If you wish to store meta-data or other information relating to the Xapian
255 database, it is reasonable to wish to put this in files inside the Xapian
256 database directory, for neatness.  For example, you might wish to store a list
257 of the prefixes you've applied to terms for specific fields in the database.
259 Current Xapian backends don't do anything
260 which will break this technique, so as long as you don't choose a filename
261 that Xapian uses itself, there should be no problems.  However, be aware that
262 new versions of Xapian may use new files in the database directory, and it is
263 also possible that new backend formats may not be compatible with the
264 technique.  And of course you can't do this with a single-file glass database.
267 Backup Strategies
268 =================
270 Summary
271 -------
273  - The simplest way to perform a backup is to temporarily halt modifications,
274    take a copy of all files in the database directory, and then allow
275    modifications to resume.  Read access can continue while a backup is being
276    taken.
278  - If you have a filesystem which allows atomic snapshots to be taken of
279    directories (such as an LVM filesystem), an alternative strategy is to take
280    a snapshot and simply copy all the files in the database directory to the
281    backup medium.  Such a copy will always be a valid database.
283  - Progressive backups are not easily possible; modifications are typically
284    spread throughout the database files.
286 Detail
287 ------
289 Even though Xapian databases are often automatically generated from source
290 data which is stored in a reliable manner, it is usually desirable to keep
291 backups of Xapian databases being run in production environments.  This is
292 particularly important in systems with high-availability requirements, since
293 re-building a Xapian database from scratch can take many hours.  It is also
294 important in the case where the data stored in the database cannot easily be
295 recovered from external sources.
297 Xapian databases are managed such that at any instant in time, there is at
298 least one valid revision of the database written to disk (and if there are
299 multiple valid revisions, Xapian will always open the most recent).
300 Therefore, if it is possible to take an instantaneous snapshot of all the
301 database files (for example, on an LVM filesystem), this snapshot is suitable
302 for copying to a backup medium.  Note that it is not sufficient to take a
303 snapshot of each database file in turn - the snapshot must be across all
304 database files simultaneously.  Otherwise, there is a risk that the snapshot
305 could contain database files from different revisions.
307 If it is not possible to take an instantaneous snapshot, the best backup
308 strategy is simply to ensure that no modifications are committed during the
309 backup procedure.  While the simplest way to implement this may be to stop
310 whatever processes are used to modify the database, and ensure that they close
311 the database, it is not actually necessary to ensure that no writers are open
312 on the database; it is enough to ensure that no writer makes any modification
313 to the database.
315 Because a Xapian database can contain more than one valid revision of the
316 database, it is actually possible to allow a limited number of modifications
317 to be performed while a backup copy is being made, but this is tricky and we
318 do not recommend relying on it.  Future versions of Xapian are likely to
319 support this better, by allowing the current revision of a database to be
320 preserved while modifications continue.
322 Progressive backups are not recommended for Xapian databases: Xapian database
323 files are block-structured, and modifications are spread throughout the
324 /database file.  Therefore, a progressive backup tool will not be able to take
325 a backup by storing only the new parts of the database.  Modifications will
326 normally be so extensive that most parts of the database have been modified,
327 however, if only a small number of modifications have been made, a binary diff
328 algorithm might make a usable progressive backup tool.
331 Inspecting a database
332 =====================
334 When designing an indexing strategy, it is often useful to be able to check
335 the contents of the database.  Xapian includes a simple command-line program,
336 `xapian-delve`, to allow this (prior to 1.3.0, `xapian-delve` was usually
337 called `delve`, though some packages were already renaming it).
339 For example, to display the list of terms in document "1" of the database
340 "foo", use::
342   xapian-delve foo -r 1
344 It is also possible to perform simple searches of a database.  Xapian includes
345 another simple command-line program, "quest", to support this.  "quest" is
346 only able to search for un-prefixed terms, the query string must be quoted to
347 protect it from the shell.  To search the database "foo" for the phrase "hello
348 world", use::
350   quest -d foo '"hello world"'
352 If you have installed the "Omega" CGI application built on Xapian, this can
353 also be used with the built-in "godmode" template to provide a web-based
354 interface for browsing a database.  See Omega's documentation for more details
355 on this.
357 Database maintenance
358 ====================
360 Compacting a database
361 ---------------------
363 Xapian databases normally have some spare space in each block to allow
364 new information to be efficiently slotted into the database.  However, the
365 smaller a database is, the faster it can be searched, so if there aren't
366 expected to be many further modifications, it can be desirable to compact the
367 database.
369 Xapian includes a tool called "xapian-compact" for compacting databases.
370 This tool makes a copy of a database, and takes advantage of
371 the sorted nature of the source Xapian database to write the database out
372 without leaving spare space for future modifications.  This can result in a
373 large space saving.
375 The downside of compaction is that future modifications may take a little
376 longer, due to needing to reorganise the database to make space for them.
377 However, modifications are still possible, and if many modifications are made,
378 the database will gradually develop spare space.
380 There's an option ("-F") to perform a "fuller" compaction.  This option
381 compacts the database as much as possible, but it violates the design of the
382 Btree format slightly to achieve this, so it is not recommended if further
383 modifications are at all likely in future.  If you do need to modify a "fuller"
384 compacted database, we recommend you run xapian-compact on it without "-F"
385 first.
387 While taking a copy of the database, it is also possible to change the
388 blocksize.  If you wish to profile search speed with different blocksizes,
389 this is the recommended way to generate the different databases (but remember
390 to compact the original database as well, for a fair comparison).
393 Merging databases
394 -----------------
396 When building an index for a very large amount of data, it can be desirable to
397 index the data in smaller chunks (perhaps on separate machines), and then
398 merge the chunks together into a single database.  This can be performed using
399 the "xapian-compact" tool, simply by supplying several source database paths.
401 Normally, merging works by reading the source databases in parallel, and
402 writing the contents in sorted order to the destination database.  This will
403 work most efficiently if excessive disk seeking can be avoided; if you have
404 several disks, it may be worth placing the source databases and the
405 destination database on separate disks to obtain maximum speed.
407 The ``xapian-compact`` tool supports an additional option, ``--multipass``,
408 which is useful when merging more than three databases.  This will cause the
409 postlist tables to be grouped and merged into temporary tables, which are then
410 grouped and merged, and so on until a single postlist table is created, which
411 is usually faster, but requires more disk space for the temporary files.
414 Checking database integrity
415 ---------------------------
417 Xapian includes a command-line tool to check that a database is
418 self-consistent.  This tool, "xapian-check", runs through the entire database,
419 checking that all the internal nodes are correctly connected.  It can also be
420 used on a single table, for example, this command will check the termlist table
421 of database "foo"::
423   xapian-check foo/termlist.DB
426 Fixing corrupted databases
427 --------------------------
429 The "xapian-check" tool is capable of fixing corrupted databases in certain
430 limited situations.  Currently it only supports this for chert, where it is
431 capable of:
433  * Regenerating a damaged ``iamchert`` file (if you've lost yours completely
434    just create an invalid one, e.g. with ``touch iamchert``).
436  * Regenerating damaged or lost base files from the corresponding DB files.
437    This was developed for the scenario where the database is freshly compacted
438    but should work provided the last update was cleanly applied.  If the last
439    update wasn't actually committed, then it is possible that it will try to
440    pick the root block for the partial update, which isn't what you want.
441    If you are in this situation, come and talk to us - with a testcase we
442    should be able to make it handle this better.
444 To fix such issues, run xapian-check like so::
446   xapian-check /path/to/database F
449 Converting a chert database to a glass database
450 -----------------------------------------------
452 This can be done using the "copydatabase" example program included with Xapian.
453 This is a lot slower to run than "xapian-compact", since it has to perform the
454 sorting of the term occurrence data from scratch, but should be faster than a
455 re-index from source data since it doesn't need to perform the tokenisation
456 step.  It is also useful if you no longer have the source data available.
458 The following command will copy a database from "SOURCE" to "DESTINATION",
459 creating the new database at "DESTINATION" as a chert database::
461   copydatabase SOURCE DESTINATION
463 By default copydatabase will renumber your documents starting with docid 1.
464 If the docids are stored in or come from some external system, you should
465 preserve them by using the --no-renumber option::
467   copydatabase --no-renumber SOURCE DESTINATION
470 Converting a pre-1.1.4 chert database to a chert database
471 ---------------------------------------------------------
473 The chert format changed in 1.1.4 - at that point the format hadn't been
474 finalised, but a number of users had already deployed it, and it wasn't hard
475 to write an updater, so we provided one called xapian-chert-update which makes
476 a copy with the updated format::
478   xapian-chert-update SOURCE DESTINATION
480 It works much like xapian-compact so should take a similar amount of time (and
481 results in a compact database).  The initial version had a few bugs, so use
482 xapian-chert-update from Xapian 1.2.5 or later.
484 The xapian-chert-update utility was removed in Xapian 1.3.0, so you'll need to
485 install Xapian 1.2.x to use it.
488 Converting a flint database to a chert database
489 -----------------------------------------------
491 It is possible to convert a flint database to a chert database by installing
492 Xapian 1.2.x (since this has support for both flint and chert)
493 using the "copydatabase" example program included with Xapian.  This is a
494 lot slower to run than "xapian-compact", since it has to perform the
495 sorting of the term occurrence data from scratch, but should be faster than a
496 re-index from source data since it doesn't need to perform the tokenisation
497 step.  It is also useful if you no longer have the source data available.
499 The following command will copy a database from "SOURCE" to "DESTINATION",
500 creating the new database at "DESTINATION" as a chert database::
502   copydatabase SOURCE DESTINATION
504 By default copydatabase will renumber your documents starting with docid 1.
505 If the docids are stored in or come from some external system, you should
506 preserve them by using the --no-renumber option (new in Xapian 1.2.5)::
508   copydatabase --no-renumber SOURCE DESTINATION
511 Converting a quartz database to a flint database
512 ------------------------------------------------
514 It is possible to convert a quartz database to a flint database by installing
515 Xapian 1.0.x (since this has support for both quartz and flint)
516 and using the "copydatabase" example program included with Xapian.  This is a
517 lot slower to run than "xapian-compact", since it has to perform the
518 sorting of the term occurrence data from scratch, but should be faster than a
519 re-index from source data since it doesn't need to perform the tokenisation
520 step.  It is also useful if you no longer have the source data available.
522 The following command will copy a database from "SOURCE" to "DESTINATION",
523 creating the new database at "DESTINATION" as a flint database::
525   copydatabase SOURCE DESTINATION
528 Converting a 0.9.x flint database to work with 1.0.y
529 ----------------------------------------------------
531 In 0.9.x, flint was the development backend.
533 Due to a bug in the flint position list encoding in 0.9.x which made flint
534 databases non-portable between platforms, we had to make an incompatible
535 change in the flint format.  It's not easy to write an upgrader, but you
536 can convert a database using the following procedure (although it might
537 be better to rebuild from scratch if you want to use the new UTF-8 support
538 in Xapian::QueryParser, Xapian::Stem, and Xapian::TermGenerator).
540 Run the following command in your Xapian 0.9.x installation to copy your
541 0.9.x flint database "SOURCE" to a new quartz database "INTERMEDIATE"::
543   copydatabase SOURCE INTERMEDIATE
545 Then run the following command in your Xapian 1.0.y installation to copy
546 your quartz database to a 1.0.y flint database "DESTINATION"::
548   copydatabase INTERMEDIATE DESTINATION