FLUSH TABLE rt_table
FLUSH TABLE принудительно сбрасывает содержимое RAM чанка RT таблицы на диск.
Чанк RAM реального времени таблицы RT table автоматически сбрасывается на диск при корректном завершении работы или периодически каждые rt_flush_period секунд.
Выполнение команды FLUSH TABLE не только принудительно записывает содержимое RAM чанка на диск, но и запускает очистку бинарных лог-файлов.
- SQL
FLUSH TABLE rt;Query OK, 0 rows affected (0.05 sec)Со временем RT-таблицы могут фрагментироваться на множество дисковых чанков и/или загрязняться удалёнными, но ещё не очищенными данными, что влияет на производительность поиска. В таких случаях необходима оптимизация. По сути, процесс оптимизации объединяет пары дисковых чанков, удаляя документы, которые были ранее удалены с помощью операторов DELETE.
Начиная с Manticore 4, этот процесс происходит автоматически по умолчанию. Однако вы также можете использовать следующие команды для ручного запуска компактирования таблицы.
OPTIMIZE TABLE table_name [OPTION opt_name = opt_value [,...]]
Оператор OPTIMIZE добавляет RT-таблицу в очередь оптимизации, которая будет обработана в фоновом потоке.
- SQL
OPTIMIZE TABLE rt;По умолчанию OPTIMIZE объединяет дисковые чанки RT-таблицы до количества, меньшего или равного числу логических ядер процессора, умноженному на 2.
Однако, если в таблице есть атрибуты с KNN-индексами, этот порог отличается. В этом случае он устанавливается как количество физических ядер процессора, делённое на 2, для улучшения производительности KNN-поиска.
Вы также можете вручную контролировать количество оптимизируемых дисковых чанков с помощью опции cutoff.
Дополнительные опции включают:
- Настройку сервера optimize_cutoff для переопределения порога по умолчанию
- Настройку на уровне таблицы optimize_cutoff
- SQL
OPTIMIZE TABLE rt OPTION cutoff=4;При использовании OPTION sync=1 (по умолчанию 0) команда будет ждать завершения процесса оптимизации перед возвратом результата. Если соединение прервётся, оптимизация продолжит выполняться на сервере.
- SQL
OPTIMIZE TABLE rt OPTION sync=1;Оптимизация может быть длительным и интенсивным по вводу-выводу процессом. Чтобы минимизировать влияние, вся фактическая работа по слиянию выполняется последовательно в специальном фоновом потоке, а оператор OPTIMIZE просто добавляет задачу в его очередь. Фоновый поток оптимизации может быть ограничен по вводу-выводу, и вы можете контролировать максимальное количество операций ввода-вывода в секунду и максимальный размер ввода-вывода с помощью директив rt_merge_iops и rt_merge_maxiosize соответственно.
Во время оптимизации RT-таблица остаётся онлайн и доступна для поиска и обновлений почти всё время. Она блокируется на очень короткий период, когда успешно объединяется пара дисковых чанков, что позволяет переименовать старые и новые файлы и обновить заголовок таблицы.
Пока auto_optimize не отключён, таблицы оптимизируются автоматически.
Если вы сталкиваетесь с неожиданными SST или хотите, чтобы таблицы на всех узлах кластера были бинарно идентичны, необходимо:
- Отключить auto_optimize.
- Вручную оптимизировать таблицы:
На одном из узлов удалите таблицу из кластера:
‹›- SQL
SQL📋⚙ALTER CLUSTER mycluster DROP myindex;Оптимизируйте таблицу:
‹›- SQL
SQL📋⚙OPTIMIZE TABLE myindex;Добавьте таблицу обратно в кластер:
‹›- SQL
SQL📋⚙ALTER CLUSTER mycluster ADD myindex;Когда таблица будет добавлена обратно, новые файлы, созданные в процессе оптимизации, будут реплицированы на другие узлы кластера. Любые локальные изменения, сделанные в таблице на других узлах, будут потеряны.
Изменения данных таблицы (вставки, замены, удаления, обновления) должны либо:
- Быть отложены, либо
- Направляться на узел, где выполняется процесс оптимизации.
Обратите внимание, что пока таблица отсутствует в кластере, команды insert/replace/delete/update должны обращаться к ней без префикса имени кластера (для SQL-запросов или свойства cluster в случае HTTP JSON-запроса), иначе они завершатся с ошибкой. После того как таблица будет добавлена обратно в кластер, необходимо возобновить операции записи в таблицу и снова использовать префикс имени кластера, иначе они будут завершаться с ошибкой.
Операции поиска доступны как обычно на любом из узлов в процессе.
Manticore обеспечивает изоляцию во время процесса сброса и слияния таблицы в реальном времени, чтобы предотвратить влияние изменений на выполняющиеся запросы.
Например, во время сжатия таблицы пара дисковых чанков сливается, и создается новый чанк. В какой-то момент создается новая версия таблицы, в которой новый чанк заменяет исходную пару. Это происходит бесшовно, так что долгосрочный запрос, использующий исходные чанки, продолжит видеть старую версию таблицы, в то время как новый запрос увидит новую версию с объединённым чанком.
То же самое относится к сбросу RAM чанка, когда подходящие сегменты RAM объединяются в новый дисковый чанк, а участвующие сегменты RAM чанка отбрасываются. Во время этой операции Manticore обеспечивает изоляцию для запросов, начавшихся до начала операции.
Кроме того, эти операции прозрачны для replace и update. Если вы обновляете атрибут в документе, который принадлежит дисковому чанку, сливающемуся с другим, обновление будет применено как к этому чанку, так и к результирующему объединённому чанку. Если вы удаляете документ во время слияния, он будет удалён в исходном чанке и также в результирующем объединённом чанке, который либо пометит документ как удалённый, либо вообще не будет содержать такого документа, если удаление произошло на раннем этапе процесса слияния.
«Заморозка» таблицы полезна, когда вы хотите сделать физическую копию или резервную копию. Она помечает файлы таблицы как замороженные и показывает, где они хранятся. После заморозки вы можете безопасно скопировать эти файлы в другое место. Вы всё ещё можете добавлять новые документы в замороженную таблицу до тех пор, пока она не достигнет rt_mem_limit, но новые данные остаются в памяти и не записываются на диск, пока таблица не будет разморожена. Если таблица превысит rt_mem_limit, все изменения приостанавливаются до разморозки. Если демон остановится неожиданно, любые несохранённые данные восстанавливаются из binlog.
«Блокировка» таблицы полезна для логических резервных копий. Она не останавливает внутренние задачи обслуживания, такие как операции слияния дисковых чанков или запись RAM-чанка на диск. Она блокирует только операции записи. Это значит, что вы не можете вставлять, заменять или обновлять данные в заблокированной таблице. Это полезно для таких инструментов, как mysqldump, потому что блокировка гарантирует логическую согласованность данных. Например, без блокировки, если вы замените документ во время дампа, старая версия может уже попасть в дамп, а новая версия появится позже, обе с одним и тем же ID документа. Блокировка таблицы предотвращает такую ситуацию.
FREEZE tbl1[, tbl2, ...]
FREEZE подготавливает таблицу real-time/plain для безопасного резервного копирования. В частности, он:
- Деактивирует сжатие таблицы. Если таблица в данный момент сжимается,
FREEZEаккуратно прервет этот процесс. - Переносит текущий RAM-чанк в дисковый чанк.
- Сбрасывает атрибуты.
- Отключает неявные операции, которые могут изменить файлы на диске.
- Увеличивает счётчик блокировок таблицы.
- Показывает фактический список файлов, связанных с таблицей.
Если таблица уже заморожена (заблокирована), FREEZE:
- Увеличит счётчик блокировок таблицы.
- Покажет фактический список файлов, связанных с таблицей.
Встроенный инструмент manticore-backup использует FREEZE для обеспечения согласованности данных. Вы можете сделать то же самое, если хотите создать собственное решение для резервного копирования или нужно заморозить таблицы по другим причинам. Просто выполните следующие шаги:
FREEZEодну или несколько таблиц.- Сохраните вывод команды
FREEZEи сделайте резервную копию указанных файлов. UNFREEZEтаблицу(ы) после завершения.
- Example
FREEZE t;+-------------------+---------------------------------+
| file | normalized |
+-------------------+---------------------------------+
| data/t/t.0.spa | /work/anytest/data/t/t.0.spa |
| data/t/t.0.spd | /work/anytest/data/t/t.0.spd |
| data/t/t.0.spds | /work/anytest/data/t/t.0.spds |
| data/t/t.0.spe | /work/anytest/data/t/t.0.spe |
| data/t/t.0.sph | /work/anytest/data/t/t.0.sph |
| data/t/t.0.sphi | /work/anytest/data/t/t.0.sphi |
| data/t/t.0.spi | /work/anytest/data/t/t.0.spi |
| data/t/t.0.spm | /work/anytest/data/t/t.0.spm |
| data/t/t.0.spp | /work/anytest/data/t/t.0.spp |
| data/t/t.0.spt | /work/anytest/data/t/t.0.spt |
| data/t/t.meta | /work/anytest/data/t/t.meta |
| data/t/t.ram | /work/anytest/data/t/t.ram |
| data/t/t.settings | /work/anytest/data/t/t.settings |
+-------------------+---------------------------------+
13 rows in set (0.01 sec)Столбец file указывает пути к файлам таблицы внутри data_dir запущенного экземпляра. Столбец normalized отображает абсолютные пути к тем же файлам. Чтобы сделать резервную копию таблицы, просто скопируйте указанные файлы без дополнительной подготовки.
Когда таблица заморожена, выполнение запросов UPDATE невозможно; они будут ждать, пока таблица не будет разморожена.
Также запросы DELETE и REPLACE имеют некоторые ограничения во время заморозки таблицы:
- Если
DELETEзатрагивает документ в текущем RAM-чанке — это разрешено. - Если
DELETEвлияет на документ в дисковом чанке, но он был ранее удалён — это разрешено. - Если
DELETEизменит фактический дисковый чанк — запрос будет ждать, пока таблица не будет разморожена.
Ручной FLUSH RAM-чанка замороженной таблицы сообщит об «успехе», но реального сохранения не произойдет.
DROP/TRUNCATE замороженной таблицы разрешены, так как эти операции не являются неявными. Предполагается, что если вы удаляете или очищаете таблицу, вам не нужна её резервная копия; значит, её изначально не следовало замораживать.
INSERT в замороженную таблицу поддерживается, но с ограничениями: новые данные будут храниться в RAM (как обычно) до достижения rt_mem_limit; затем новые вставки будут ждать, пока таблица не будет разморожена.
Если вы завершите работу демона с замороженной таблицей, это будет эквивалентно некорректному завершению работы (например, kill -9): недавно вставленные данные не будут сохранены в RAM-чанке на диске, и при перезапуске они будут восстановлены из бинарного лога (если он есть) или потеряны (если бинарное логирование отключено).
UNFREEZE tbl1[, tbl2, ...]
Команда UNFREEZE уменьшает счётчик блокировок таблицы, и если он достигает нуля, повторно активирует ранее заблокированные операции и возобновляет внутреннюю службу сжатия. Все операции, ожидавшие разморозки таблицы, также возобновятся и завершатся нормально.
- Example
UNFREEZE tbl;Вы можете использовать SHOW table_name STATUS, чтобы проверить, заморожена таблица или нет.
Счётчик блокировок отображается в статусе таблицы в столбце locked. Значение ноль означает, что таблица не заморожена, а ненулевое значение отражает количество активных блокировок. Каждая явная команда FREEZE и неявная блокировка (например, когда таблица является частью кластера и репликационная процедура выбирает её в качестве донора для реплики) увеличивает счётчик. Каждая команда UNFREEZE уменьшает счётчик, в конечном итоге до нуля.
- Example
SHOW TABLE `foo` STATUS LIKE 'locked';+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| locked | 2 |
+---------------+-------+
1 row in set (0,00 sec)lock tables tbl1 read[, tbl2 read, ...]
Вы можете явно блокировать таблицы в сессии SQL-клиента, чтобы координировать доступ с другими сессиями или чтобы остановить другие сессии от изменения данных, пока вам нужен эксклюзивный доступ. Сессия может блокировать или разблокировать таблицы только для себя. Она не может блокировать или разблокировать таблицы от имени другой сессии. Блокировки можно использовать только в SQL-сессиях, подключённых через протокол MySQL. Пока таблица заблокирована, ни один протокол не может изменить её данные (SQL / HTTP / бинарный). Блокировки также не работают для таблиц, которые принадлежат репликационному кластеру.
Manticore поддерживает только чтение (shared) блокировки. Запись (exclusive) блокировки не поддерживаются.
Когда сессия запрашивает блокировку на чтение, Manticore:
- Проверяет, что соединение использует протокол MySQL.
- Проверяет, что таблицу можно заблокировать. Она должна быть локальной real-time или percolate таблицей и не должна быть частью репликационного кластера.
- Автоматически снимает любые блокировки, которые сессия уже держит.
- Ожидает завершения всех текущих операций вставки, замены, обновления или удаления в таблице.
- Увеличивает счетчик блокировок на чтение таблицы (см. SHOW LOCKS).
Любое изменяющее выражение (insert/replace/update/delete) сначала проверяет, заблокирована ли таблица на чтение. Если да, выражение завершается с ошибкой table is locked.
- Example
--------------
LOCK TABLES tbl READ
--------------
Query OK, 0 rows affected (0.000 sec)
--------------
LOCK TABLES tbl READ, tbl2 WRITE
--------------
Query OK, 0 rows affected, 1 warning (0.000 sec)
--------------
SHOW WARNINGS
--------------
+---------+------+--------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------+
| warning | 1000 | Write lock is not implemented. |
+---------+------+--------------------------------+
1 row in set (0.000 sec)Команда UNLOCK TABLES явно снимает любые блокировки таблиц, удерживаемые текущей SQL-сессией.
Если соединение для клиентской сессии завершается, нормально или ненормально, демон неявно снимает все блокировки таблиц, удерживаемые сессией. Если клиент переподключается, блокировки больше не действуют.
- Example
UNLOCK TABLES;Команда SHOW LOCKS выводит список всех таблиц, которые в данный момент заблокированы или заморожены.
Каждая строка показывает тип таблицы, ее имя, вид блокировки и счетчик, указывающий, сколько раз эта блокировка была применена.
Тип блокировки может быть:
read— таблица защищена блокировкой на чтение. Изменяющие выражения будут завершаться с ошибкой, пока блокировка не будет снята.freeze— таблица заморожена. Это останавливает любые операции, которые записывают данные на диск, пока таблица не будет разморожена.
- Example
SHOW LOCKS;+-----------+------+-----------+-----------------+
| Type | Name | Lock Type | Additional Info |
+-----------+------+-----------+-----------------+
| rt | a | read | Count: 1 |
| percolate | bar | freeze | Count: 3 |
| rt | foo | freeze | Count: 2 |
+-----------+------+-----------+-----------------+
3 rows in set (0,01 sec)