≫ Логирование
Логирование запросов можно включить, установив директиву query_log в разделе searchd конфигурационного файла.
Запросы также могут отправляться в syslog, если указать syslog вместо пути к файлу. В этом случае все поисковые запросы будут отправлены демону syslog с приоритетом LOG_INFO, с префиксом [query] вместо временной метки. Для syslog поддерживается только формат лога plain.
- Config
searchd {
...
query_log = /var/log/query.log
query_log_format = sphinxql # default
...
}Поддерживается два формата лога запросов:
sphinxql(по умолчанию): Логирует в формате SQL. Также предоставляет простой способ воспроизведения записанных запросов.plain: Логирует полнотекстовые запросы в простом текстовом формате. Этот формат рекомендуется, если большинство ваших запросов в основном полнотекстовые или если вам не нужно логировать не-полнотекстовые компоненты, такие как фильтрация по атрибутам, сортировка или группировка. Запросы, записанные в форматеplain, не могут быть воспроизведены. Обратите внимание, что запросы, обработанные через Buddy, не логируются в этом режиме.
Для переключения между форматами можно использовать настройку searchd query_log_format.
Формат лога SQL является настройкой по умолчанию. В этом режиме Manticore логирует все успешные и неуспешные select-запросы. Запросы, отправленные как SQL или через бинарный API, логируются в формате SQL, но JSON-запросы логируются как есть. Этот тип логирования работает только с обычными файлами логов и не поддерживает службу 'syslog' для логирования.
- Config
query_log_format = sphinxql # defaultОсобенности формата лога SQL Manticore по сравнению с простым форматом включают:
- Полные данные оператора логируются там, где это возможно.
- Ошибки и предупреждения логируются.
- Лог запросов может быть воспроизведен.
- Логируются дополнительные счетчики производительности (в настоящее время - время распределенных запросов на агента).
- Каждая запись в логе является валидным оператором Manticore SQL/JSON, который восстанавливает полный запрос, за исключением случаев, когда записанный запрос слишком велик и его необходимо сократить по соображениям производительности.
- JSON-запросы логируются как комментарии, пропуская лишние пробелы между элементами.
- Дополнительные сообщения, счетчики и т.д. логируются как комментарии.
- Example
/* Sun Apr 28 12:38:02.808 2024 conn 2 (127.0.0.1:53228) real 0.000 wall 0.000 found 0 */ SELECT * FROM test WHERE MATCH('test') OPTION ranker=proximity;
/* Sun Apr 28 12:38:05.585 2024 conn 2 (127.0.0.1:53228) real 0.001 wall 0.001 found 0 */ SELECT * FROM test WHERE MATCH('test') GROUP BY channel_id OPTION ranker=proximity;
/* Sun Apr 28 12:40:57.366 2024 conn 4 (127.0.0.1:53256) real 0.000 wall 0.000 found 0 */ /*{ "index" : "test", "query": { "match": { "*" : "test" } }, "_source": ["f"], "limit": 30 } */При формате лога plain Manticore логирует все успешно выполненные поисковые запросы в простом текстовом формате. Не-полнотекстовые части запросов не логируются. JSON-запросы записываются как однострочные записи. Запросы, обработанные через Buddy, не логируются.
- Config
query_log_format = plainФормат лога следующий:
[query-date] real-time wall-time [match-mode/filters-count/sort-mode total-matches (offset,limit) @groupby-attr] [table-name] {perf-stats} query
где:
real-time- время от начала до завершения запроса.wall-time- аналогично real-time, но исключает время ожидания агентов и слияния результирующих наборов от них.perf-stats- включает статистику CPU/IO, когда Manticore запущен с--cpustats(или это было включено черезSET GLOBAL cpustats=1) и/или--iostats(или это было включено черезSET GLOBAL iostats=1):ios- количество выполненных операций ввода-вывода с файлами;kb- объем данных в килобайтах, прочитанных из файлов таблиц;ms- время, затраченное на операции ввода-вывода.cpums- время в миллисекундах, затраченное на обработку запроса процессором.
match-modeможет иметь одно из следующих значений:- "all" для режима
SPH_MATCH_ALL; - "any" для режима
SPH_MATCH_ANY; - "phr" для режима
SPH_MATCH_PHRASE; - "bool" для режима
SPH_MATCH_BOOLEAN; - "ext" для режима
SPH_MATCH_EXTENDED; - "ext2" для режима
SPH_MATCH_EXTENDED2; - "scan" если использовался режим полного сканирования, либо указанный с
SPH_MATCH_FULLSCAN, либо если запрос был пустым.
- "all" для режима
sort-modeможет иметь одно из следующих значений:- "rel" для режима
SPH_SORT_RELEVANCE; - "attr-" для режима
SPH_SORT_ATTR_DESC; - "attr+" для режима
SPH_SORT_ATTR_ASC; - "tsegs" для режима
SPH_SORT_TIME_SEGMENTS; - "ext" для режима
SPH_SORT_EXTENDED.
- "rel" для режима
Примечание: режимы SPH* специфичны для устаревшего интерфейса sphinx. Интерфейсы SQL и JSON будут логировать, в большинстве случаев, ext2 как match-mode и ext и rel как sort-mode.
- Example
[Fri Jun 29 21:17:58 2021] 0.004 sec [all/0/rel 35254 (0,20)] [lj] [ios=6 kb=111.1 ms=0.5] test
[Fri Jun 29 21:17:58 2021] 0.004 sec [all/0/rel 35254 (0,20)] [lj] [ios=6 kb=111.1 ms=0.5 cpums=0.3] test
[Sun Apr 28 15:09:38.712 2024] 0.000 sec 0.000 sec [ext2/0/ext 0 (0,20)] [test] test
[Sun Apr 28 15:09:44.974 2024] 0.000 sec 0.000 sec [ext2/0/ext 0 (0,20) @channel_id] [test] test
[Sun Apr 28 15:24:32.975 2024] 0.000 sec 0.000 sec [ext2/0/ext 0 (0,30)] [test] { "table" : "test", "query": { "match": { "*" : "test" } }, "_source": ["f"], "limit": 30 }По умолчанию логируются все запросы. Если вы хотите логировать только запросы, время выполнения которых превышает заданный лимит, можно использовать директиву query_log_min_msec.
Ожидаемая единица измерения - миллисекунды, но также можно использовать выражения с временными суффиксами.
- Config
searchd {
...
query_log = /var/log/query.log
query_log_min_msec = 1000
# query_log_min_msec = 1s
...
}По умолчанию файлы логов searchd и запросов создаются с правами доступа 600, поэтому только пользователь, под которым работает Manticore, и root могут читать файлы логов. Опция query_log_mode позволяет установить другие права доступа. Это может быть полезно для предоставления доступа на чтение файлов логов другим пользователям (например, решениям мониторинга, работающим под непривилегированными пользователями).
- Config
searchd {
...
query_log = /var/log/query.log
query_log_mode = 666
...
}По умолчанию демон Manticore Search записывает все события выполнения в файл searchd.log в директории, где был запущен searchd. В Linux по умолчанию вы можете найти лог по пути /var/log/manticore/searchd.log.
Путь/имя файла лога может быть переопределено с помощью настройки log в секции searchd конфигурационного файла.
searchd {
...
log = /custom/path/to/searchd.log
...
}
- Вы также можете использовать
syslogв качестве имени файла. В этом случае события будут отправляться демону syslog вашего сервера. - В некоторых случаях вы можете захотеть использовать
/dev/stdoutв качестве имени файла. В этом случае, в Linux, Manticore будет просто выводить события. Это может быть полезно в окружениях Docker/Kubernetes.
Бинарное логирование служит механизмом восстановления данных таблиц реального времени. При включённом бинарном логировании searchd записывает каждую транзакцию в binlog-файл и использует его для восстановления после некорректного завершения работы. При корректном завершении работы данные из RAM-чанов сохраняются на диск, а все binlog-файлы удаляются.
По умолчанию бинарное логирование включено для защиты целостности данных. В системах Linux стандартное расположение файлов binlog.* в Plain режиме находится в /var/lib/manticore/data/. В RT режиме бинарные логи хранятся в каталоге <data_dir>/binlog/, если не указано иное.
Для глобального отключения бинарного логирования установите binlog_path в пустое значение в конфигурации searchd.
Отключение бинарного логирования требует перезапуска демона и повышает риск потери данных при внезапном отключении системы.
- Example
searchd {
...
binlog_path = # disable logging
...Для задания пользовательского пути можно использовать следующую директиву:
- Example
searchd {
...
binlog_path = /var/data
...Для более гибкого управления бинарное логирование можно отключить на уровне таблиц реального времени, установив параметр таблицы binlog в значение 0. Эта опция недоступна для таблиц типа percolate.
- Example
create table a (id bigint, s string attribute) binlog='0';Для существующих RT-таблиц бинарное логирование также можно отключить, изменив параметр binlog.
- Example
alter table FOO binlog='0';Если бинарное логирование было ранее отключено, его можно вновь включить, установив параметр binlog обратно в 1:
- Example
alter table FOO binlog='1';- Зависимость от глобальных настроек: параметры бинарного логирования на уровне таблиц действуют только если бинарное логирование глобально включено в конфигурации searchd (
binlog_pathне должен быть пустым). - Статус бинарного логирования и идентификатор транзакции: изменение статуса бинарного логирования таблицы вызывает немедленный принудительный сброс таблицы. Если выключить бинарное логирование для таблицы, её идентификатор транзакции (TID) меняется на
-1. Это означает, что бинарное логирование не активно и изменения не отслеживаются. Если же включить бинарное логирование для таблицы, её идентификатор транзакции становится неотрицательным числом (ноль или больше). Это указывает, что изменения таблицы теперь записываются. Проверить идентификатор транзакции можно командой:SHOW TABLE <name> STATUS. Значение TID отражает ведется ли запись изменений (неотрицательное число) или нет (-1).
При включённом бинарном логировании каждое изменение RT-таблицы сохраняется в лог-файл. Если система неожиданно выключается, эти логи автоматически используются при следующем запуске для восстановления всех записанных изменений.
Во время обычной работы, когда объём записанных данных достигает определённого предела (устанавливаемого параметром binlog_max_log_size), начинается новый лог-файл. Старые логи сохраняются до тех пор, пока все изменения в них полностью не обработаются и не сохранятся на диск в виде дискового чанка. Если этот предел установлен в 0, лог-файлы сохраняются пока система не будет корректно завершена. По умолчанию ограничений на размер файлов нет.
- Example
searchd {
...
binlog_max_log_size = 16M
....Каждый binlog-файл именуется с ведущими нулями, например binlog.0000, binlog.0001 и так далее, обычно с четырьмя цифрами. Количество цифр в номере файла можно изменить настройкой binlog_filename_digits. Если количество binlog-файлов превысит вместимость текущего количества цифр, количество цифр будет автоматически увеличено.
Важно: для изменения количества цифр необходимо сначала сохранить все данные таблиц и корректно завершить работу системы. Затем удалить старые лог-файлы и перезапустить систему.
- Example
searchd {
...
binlog_filename_digits = 6
...Вы можете выбрать один из двух способов управления бинарными лог-файлами с помощью директивы binlog_common:
- Отдельный файл на каждую таблицу (по умолчанию,
0): каждая таблица сохраняет изменения в собственном лог-файле. Такая конфигурация удобна, если у вас много таблиц, обновляющихся в разное время. Это позволяет обновлять таблицы независимо друг от друга. Также если возникает проблема с лог-файлом одной таблицы, это не влияет на другие. - Один файл для всех таблиц (
1): все таблицы используют один общий бинарный лог-файл. Этот метод упрощает работу с файлами, так как их меньше. Однако при этом файлы могут дольше храниться, если хотя бы одной таблице нужно сохранить обновления. Также данная настройка может замедлять работу при одновременном обновлении многих таблиц, так как все изменения должны записываться в один файл.
- binlog_common
searchd {
...
binlog_common = 1
...Существует четыре различных стратегии сброса бинарного лога, которые регулируются директивой binlog_flush:
0- Данные записываются на диск (сбрасываются) каждую секунду, и Manticore инициирует их защиту на диске (синхронизацию) сразу после сброса. Этот метод самый быстрый, но если сервер или компьютер внезапно выйдут из строя, некоторые недавно записанные данные, которые не были защищены, могут быть потеряны.1- Данные записываются в binlog и синхронизируются сразу после каждой транзакции. Этот метод самый безопасный, так как гарантирует немедленное сохранение каждого изменения, но замедляет запись.2- Данные записываются после каждой транзакции, а синхронизация инициируется каждую секунду. Этот подход предлагает баланс, записывая данные регулярно и быстро. Однако, в случае сбоя компьютера, часть данных, которые находились в процессе защиты, может не успеть сохраниться. Кроме того, синхронизация может занимать больше одной секунды в зависимости от диска.3- Похоже на2, но также гарантирует, что файл binlog синхронизируется перед закрытием из-за превышенияbinlog_max_log_size.
Режим по умолчанию — 2, который записывает данные после каждой транзакции и запускает их синхронизацию каждую секунду, балансируя скорость и безопасность.
- Example
searchd {
...
binlog_flush = 1 # ultimate safety, low write speed
...
}В кластере с использованием Galera важна правильная обработка восстановления узла. Обычно Galera решает проблему рассогласования узла с помощью IST (incremental state transfer — инкрементальная передача состояния), если узел был корректно завершён и его последний номер последовательности (seqno) был правильно сохранён. Однако в случае сбоя, когда seqno не сохранён, Galera инициирует SST (state snapshot transfer — передача снимка состояния), что требует больших ресурсов и может значительно замедлить кластер из-за высокой активности ввода-вывода.
Для решения этой проблемы введена поддержка кластерного binlog. Эта функция расширяет существующую двоичную запись изменений, помогая снизить необходимость SST, позволяя восстанавливающемуся узлу воспроизводить недостающие транзакции из локальных binlog и снова присоединяться к кластеру с корректным seqno.
Кластерный binlog включен по умолчанию для любых операций кластера. Однако его можно отключить, установив переменную окружения:
- binlog_cluster
MANTICORE_REPLICATION_BINLOG=0Эта функция уменьшает время простоя и предотвращает полные передачи данных, сочетая локальную надежность двоичного журнала с возможностями распределённой синхронизации Galera.
При восстановлении после некорректного отключения binlog воспроизводится, и все зарегистрированные транзакции с момента последнего состоявшегося сохранения на диске восстанавливаются. Транзакции снабжены контрольными суммами, поэтому в случае повреждения файла binlog мусорные данные не будут воспроизведены; такая сломанная транзакция будет обнаружена и остановит воспроизведение.
Интенсивные обновления небольшой таблицы RT, полностью помещающейся в RAM-чунк, могут привести к постоянно растущему binlog, который невозможно удалить до чистого завершения работы. Binlog фактически служит в виде дельты, добавляемой к последнему известному хорошему состоянию на диске, и не может быть удалён, пока RAM-чунк не сохранён. Постоянно растущий binlog нежелателен с точки зрения использования диска и времени восстановления после сбоя. Для решения этой проблемы можно настроить searchd на периодический сброс RAM-чунк с помощью директивы rt_flush_period. При включённых периодических сбросах searchd запускает отдельный поток, проверяющий, нужно ли записать RAM-чунк RT таблицы обратно на диск. Как только это происходит, соответствующие binlog могут быть безопасно (и действительно) удалены.
Период сброса RT по умолчанию установлен на 10 часов.
- Example
searchd {
...
rt_flush_period = 3600 # 1 hour
...
}Важно отметить, что rt_flush_period контролирует лишь частоту проверок. Нет гарантий, что конкретный RAM-чунк будет сохранён. Например, бессмысленно регулярно пересохранять большой RAM-чунк, в который было сделано всего несколько обновлений строк. Manticore автоматически принимает решение о необходимости сброса, используя несколько эвристик.