blog-post

Manticore Search 4.0.2: полная поддержка колонного хранилища, автоматическая компакция индексов, переработанная система блокировок, псевдошардинг

Основные новые функции

  • Полная поддержка Manticore Columnar Library . Ранее Manticore Columnar Library поддерживалась только для простых индексов. Теперь она поддерживается:
  • в индексах реального времени для INSERT, REPLACE, DELETE, OPTIMIZE
  • в репликации
  • в ALTER
  • в indextool --check
  • Автоматическая компакция индексов ( #478 ). Наконец, вам не нужно вручную вызывать OPTIMIZE или через крон-задачи или другие виды автоматизации. Manticore теперь делает это самостоятельно. Вы можете установить порог компакции по умолчанию через optimize_cutoff .
  • Переработка системы снимков и блокировок. Эти изменения могут быть невидимы снаружи на первый взгляд, но они значительно улучшают поведение многих процессов, происходящих в индексах реального времени. Короче говоря, ранее большинство операций манипуляции данными Manticore сильно полагались на блокировки, теперь мы используем вместо этого снимки дисковых чанков. В частности:
    • операции чтения (например, SELECT, репликация) выполняются с помощью снимков
    • операции, которые просто изменяют внутреннюю структуру индекса без изменения схемы/документов (например, слияние сегментов в ОЗУ, сохранение дисковых чанков, слияние дисковых чанков) выполняются с помощью снимков только для чтения и в конечном итоге заменяют существующие чанки
    • UPDATE и DELETE выполняются по существующим чанкам, но в случае слияния, которое может происходить, записи собираются и затем применяются к новым чанкам
    • UPDATE последовательно получает эксклюзивную блокировку для каждого чанка. Слияния получают общую блокировку при входе в стадию сбора атрибутов из чанка. Таким образом, одновременно только одна (слияние или обновление) операция имеет доступ к атрибутам чанка.
    • когда слияние достигает фазы, в которой ему нужны атрибуты, оно устанавливает специальный флаг. Когда UPDATE завершается, он проверяет флаг и, если он установлен, всё обновление хранится в специальной коллекции. Наконец, когда слияние завершается, оно применяет набор обновлений к новому дисковому чанку.
    • ALTER выполняется через эксклюзивную блокировку.
    • репликация выполняется как обычная операция чтения, но дополнительно сохраняет атрибуты перед SST и запрещает обновления во время SST.
  • ALTER может добавлять/удалять полнотекстовое поле. Ранее он мог только добавлять/удалять атрибут.
  • 🔬 Экспериментально: псевдошардинг для полносканирующих запросов - позволяет параллелизовать любой запрос, не являющийся полнотекстовым. Вместо того, чтобы вручную подготавливать шарды, вы теперь можете просто включить новую опцию searchd.pseudo_sharding и ожидать до CPU cores более низкого времени отклика для неполнотекстовых поисковых запросов. Обратите внимание, что он может легко занять все существующие ядра ЦП, поэтому, если вы заботитесь не только о задержке, но и о пропускной способности, используйте его с осторожностью.

Незначительные изменения

  • Linux Mint и Ubuntu Hirsute Hippo поддерживаются через APT репозиторий
  • более быстрая обновление по идентификатору через HTTP в больших индексах в некоторых случаях (зависит от распределения идентификаторов)
  • пользовательские флаги запуска для systemd . Теперь вам не нужно вручную запускать searchd, если вам нужно запустить Manticore с каким-то конкретным флагом запуска.
  • новая функция LEVENSHTEIN() , которая вычисляет расстояние Левенштейна.
  • добавлены новые флаги запуска searchd --replay-flags=ignore-trx-errors и --replay-flags=ignore-all-errors, так что можно всё ещё запустить searchd, если бинарный журнал повреждён.
  • #621 - раскрытие ошибок из RE2
  • более точный COUNT(DISTINCT) для распределённых индексов, состоящих из локальных простых индексов
  • FACET DISTINCT , чтобы удалить дубликаты при проведении фасетного поиска.
  • модификатор точной формы больше не требует морфологии и работает для индексов с включенным поиском инфиксов/префиксов .

Ломающее изменения

  • новая версия может читать старые индексы, но старые версии не могут читать индексы Manticore 4.
  • удалена неявная сортировка по идентификатору. Сортируйте явно, если это необходимо.
  • значение по умолчанию для charset_table изменяется с 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+451, U+451 на non_cjk.
  • OPTIMIZE происходит автоматически. Если вам это не нужно, убедитесь, что вы установили auto_optimize=0 в секции searchd в конфигурационном файле.
  • #616 ondisk_attrs_default были устаревшими, теперь они удалены.
  • для участников: теперь мы используем компилятор Clang для сборок под Linux, так как согласно нашим тестам он может собрать более быстрый Manticore Search и Manticore Columnar Library.
  • если max_matches не указан в запросе поиска, он обновляется неявно до минимально необходимого значения ради производительности нового столбца хранения. Это может повлиять на метрику total в SHOW META , но не на total_found, который является фактическим числом найденных документов.

Переход с Manticore 3

  • убедитесь, что вы остановили Manticore 3 корректно:
  • в /var/lib/manticore/binlog/ не должно быть файлов журнала (в директории должен быть только binlog.meta)
  • в противном случае индексы, для которых Manticore 4 не может воспроизвести журналы, не будут применены
  • новая версия может читать старые индексы, но старые версии не могут читать индексы Manticore 4, поэтому убедитесь, что вы сделали резервную копию, если хотите легко откатить новую версию
  • если вы запускаете кластер репликации, убедитесь, что вы:
  • сначала корректно останавливаете все узлы
  • а затем запускаете узел, который был остановлен последним с --new-cluster (запустите инструмент manticore_new_cluster в Linux).
  • читайте о перезапуске кластера для получения дополнительных сведений

Исправления ошибок

  • Было исправлено множество проблем с репликацией:
  • 696f8649 - исправлен сбой во время SST на узле-участнике с активным индексом; добавлена проверка sha1 на узле-участнике при записи файловых фрагментов для ускорения загрузки индекса; добавлено вращение измененных файлов индекса на узле-участнике при загрузке индекса; добавлено удаление файлов индекса на узле-участнике при замене активного индекса новым индексом от узла-доноров; добавлены точки журнала репликации на узле-доноре для отправки файлов и фрагментов
  • b296c55a - сбой при JOIN CLUSTER в случае неверного адреса
  • 418bf880 - во время первоначальной репликации большого индекса узел, присоединяющийся, мог завершиться с ошибкой ERROR 1064 (42000): invalid GTID, (null), узел-донор мог стать недоступным, пока другой узел присоединялся
  • 6fd350d2 - хэш мог быть рассчитан неправильно для большого индекса, что могло привести к сбою репликации
  • #615 - репликация завершилась неудачей при перезапуске кластера
  • #574 - indextool --help не отображает параметр --rotate
  • #578 - высокая загрузка CPU у searchd в режиме ожидания через примерно день
  • #587 - немедленный сброс .meta
  • #617 - manticore.json очищается
  • #618 - searchd –stopwait не работает под root. Это также исправляет поведение systemctl (ранее оно показывало ошибку для ExecStop и не ждал достаточно долго, чтобы searchd правильно остановился)
  • #619 - INSERT/REPLACE/DELETE против SHOW STATUS. command_insert, command_replace и другие показывали неправильные метрики
  • #620 - charset_table для простого индекса имел неправильное значение по умолчанию
  • 8f753688 - новые дисковые фрагменты не блокируются
  • #607 - Узел кластера Manticore аварийно завершает работу, когда не может разрешить узел по имени
  • #623 - репликация обновленного индекса может привести к неопределенному состоянию
  • ca03d228 - индексатор мог зависнуть при индексации источника простого индекса с атрибутом json
  • 53c75305 - исправлено выражение фильтра “не равно” на PQ индексе
  • ccf94e02 - исправлены выборки окон в запросах списка более 1000 совпадений. SELECT * FROM pq ORDER BY id desc LIMIT 1000 , 100 OPTION max_matches=1100 раньше не работал
  • a0483fe9 - HTTPS запрос к Manticore мог вызвать предупреждение “max packet size(8388608) exceeded”

Установить Manticore Search

Установить Manticore Search