⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

Indexes load at startup

В этой статье мы обсуждаем, как индексы загружаются при запуске, и какие последствия это имеет для входящих запросов и управления поисковым экземпляром.

В более старых версиях Sphinx, если была установлена опция preopen, индексы предварительно читались и загружались в память. В это время демон отказывался принимать любые входящие соединения. Для небольших индексов это не было большой проблемой, так как они загружались быстро. Но для огромного индекса, которому требовалось загрузить десятки или даже сотни ГБ, это была реальная проблема, поскольку процесс мог занять несколько минут и более.

В Sphinx 2.3 это изменилось: файлы индексов отображаются в памяти (с mmap) вместо простого чтения и загрузки в память. С mmap теневой поток демона, а не основной, сначала считывает по одному байту с каждой страницы, а затем продолжает чтение остальных данных, постепенно загружая всё в ОЗУ, но при этом позволяя доступ к данным. Короче говоря, это «ленивая» загрузка файлов индексов.

Таким образом, демон может принимать соединения сразу после запуска. Если запросу требуется доступ к случайным данным, которые ещё не загружены в память, он прочитает их с диска. Это также означает, что запрос может выполняться медленнее обычного (в зависимости от производительности хранилища), но, по крайней мере, демон сможет предоставить результаты. Более того, как только файлы индекса загружены, демон может предложить 'full speed' для него, даже если остальные индексы ещё загружаются.

Хотя это хорошие новости для большинства пользователей, для некоторых «ленивая» загрузка может быть не лучшим вариантом. Например, балансировщик нагрузки, использующий простые стратегии (случайный выбор или round robin), которые не измеряют время отклика, добавит перезапущенный экземпляр сразу после запуска демона. Поскольку запросы будут требовать чтения напрямую с диска, экземпляр будет показывать более высокое, а то и значительно более высокое время отклика, чем обычно, что нежелательно. Вместо этого, если возможно, лучше добавить экземпляр в кластер только после того, как демон завершит загрузку индексов.

Чтобы решить эту ситуацию, с версии 2.3 существует опция для searchd , но, к сожалению, она оставалась недокументированной до недавнего времени: '--force-preread'. При использовании этой опции демон всё равно будет mmap файлы индексов, но предварительное чтение станет блокирующей операцией (как в старых версиях), и searchd не будет отвечать, пока всё не загрузится в память.

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

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