Rotating a table
Table rotation is a procedure in which the searchd server looks upon new versions of defined tables in the configuration. Rotation is subject only to Plain mode of operation.
There can be two cases:
- for plain tables that are already loaded
- tables added in configuration, but not loaded yet
In the first case, indexer cannot put the new version of the table online as the running copy is locked and loaded by searchd
. In this case indexer
needs to be called with --rotate parameter. If rotate is used, indexer
creates new table files with .new.
in their names and sends a HUP signal to searchd
informing it about the new version. The searchd
will perform a lookup and will put in place the new version of the table and discard the old one. In some cases it might be desired to create the new version of the table but not perform the rotate as soon as possible. For example it might be desired to check first the health of the new table versions. In this case, indexer
can accept --nohup
parameter which will forbid sending the HUP signal to the server.
New tables can be loaded by rotation, however the regular handling of HUP signal is to check for new tables only if configuration has changed since server startup. If the table was already defined in the configuration, the table should be first created by running indexer
without rotation and perform RELOAD TABLES statement instead.
There are also two specialized statements can be used to perform rotations on tables:
RELOAD TABLE
RELOAD TABLE tbl [ FROM '/path/to/table_files' ];
RELOAD TABLE
allows you to rotate tables using SQL.
It has two modes of operation. First one (without specifying a path) makes Manticore server check for new table files in directory specified in path. New table files must have names tbl.new.sp?
.
And if you additionally specify a path, the server will look for the table files in the specified directory, will move them to the table path, rename from tbl.sp?
to tbl.new.sp?
and will rotate them.
mysql> RELOAD TABLE plain_table;
mysql> RELOAD TABLE plain_table FROM '/home/mighty/new_table_files';
RELOAD TABLES
RELOAD TABLES;
Works same as system HUP signal. Initiates table rotation. Unlike regular HUP signalling (which can come from kill
or indexer ), the statement forces lookup on possible tables to rotate even if the configuration has no changes since the startup of the server.
Depending on the value of seamless_rotate setting, new queries might be shortly stalled; clients will receive temporary errors. Command is non-blocking (i.e., returns immediately).
mysql> RELOAD TABLES;
Query OK, 0 rows affected (0.01 sec)
Seamless rotate
The rotate assumes old table version is discarded and new table version is loaded and replace the existing one. During this swapping, the server needs also to serve incoming queries made on the table that is going to be updated. To not have stalls of the queries, the server implements by default a seamless rotate of the table as described below.
Tables may contain some data that needs to be precached in RAM. At the moment, .spa
, .spb
, .spi
and .spm
files are fully precached (they contain attribute data, blob attribute data, keyword table and killed row map, respectively.) Without seamless rotate, rotating a table tries to use as little RAM as possible and works as follows:
- new queries are temporarily rejected (with “retry” error code);
searchd
waits for all currently running queries to finish;- old table is deallocated and its files are renamed;
- new table files are renamed and required RAM is allocated;
- new table attribute and dictionary data is preloaded to RAM;
searchd
resumes serving queries from new table.
However, if there’s a lot of attribute or dictionary data, then preloading step could take noticeable time - up to several minutes in case of preloading 1-5+ GB files.
With seamless rotate enabled, rotation works as follows:
- new table RAM storage is allocated
- new table attribute and dictionary data is asynchronously preloaded to RAM
- on success, old table is deallocated and both tables’ files are renamed
- on failure, new table is deallocated
- at any given moment, queries are served either from old or new table copy
Seamless rotate comes at the cost of higher peak memory usage during the rotation (because both old and new copies of .spa/.spb/.spi/.spm
data need to be in RAM while preloading new copy). Average usage stays the same.
Example:
seamless_rotate = 1
✔ Updating documents
REPLACE vs UPDATE
You can change existing data in an RT or PQ table by either updating or replacing it.
UPDATE replaces row-wise attribute values of existing documents with new values. Full-text fields and columnar attributes cannot be updated. If you need to change the content of a full-text field or columnar attributes, use REPLACE.
REPLACE works similar to INSERT except that if an old document has the same ID as the new document, the old document is marked as deleted before the new document is inserted. Note that the old document does not get physically deleted from the table. The deletion can only happen when chunks are merged in a table, e.g. as a result of an OPTIMIZE.