Перейти к основному контенту

SolrCloud: архитектура

Клавдий использует службу полнотекстового поиска Apache Solr для поиска по архиву писем и содержимому вложений. На малых объёмах достаточно одного инстанса Solr, развёрнутого вместе с indexer(!)-узлом. При росте архива, для резервирования индекса и параллельного поиска кластер расширяется до нескольких инстансов Solr — без правки файлов развёртывания при добавлении каждого нового узла.

Этот раздел описывает серверную архитектуру поиска и операции, которые администратор выполняет при масштабировании и обслуживании кластера. Настройка подключения, просмотр состояния и управление бакетами по месяцам через веб-интерфейс — в {{ССЫЛКА:maintenance.search-health|Проверка состояния поиска}} (раздел [Поиск (Solr)]).

SolrCloud и координатор-ZK

Кластер поиска работает в режиме SolrCloud: несколько инстансов Solr объединяются в единый кластер, Solr сам шардирует и реплицирует индекс, распределяет запросы по узлам. Координацию кластера обеспечивает Apache ZooKeeper.

Модель Клавдия — координатор-ZK (не ансамбль ZK):

  • Coordinator(!)-узел — первый indexer(!)-узел кластера (назначается автоматически, по наименьшему идентификатору). На нём работает локальный ZooKeeper (standalone(!), порт 2181) и локальный Solr в режиме cloud(!).
  • Joiner(!)-узлы — прочие indexer(!)-узлы. На них работает только Solr (cloud(!)); ZooKeeper не запускается. Их Solr подключается к ZooKeeper coordinator(!)-узла и автоматически присоединяется к тому же кластеру SolrCloud.

ZooKeeper в этой модели — одиночный (на coordinator(!)). Он хранит только метаданные кластера (состав коллекций, размещение реплик); сами данные индекса восстанавливаются из базы Клавдия переиндексацией. Падение coordinator(!) означает простой поиска до его рестарта или переноса роли. Резервирование индекса достигается репликами SolrCloud (replicationFactor(!)), а не ансамблем ZooKeeper. В описанной конфигурации ZooKeeper не имеет собственного кворума; учитывайте это при планировании доступности поиска.

Размещение Solr

Solr всегда размещается совместно с indexer(!)-узлом (co-located) — в отдельном контейнере на том же хосте. Узел Клавдия обращается к локальному Solr по адресу https://127.0.0.1:8983/solr (HTTPS на WUI-сертификате из secrets/ssl_cert, self-signed(!), verify(!) отключён внутри узла). Кластер SolrCloud внутри себя роутит запросы по всем инстансам — Клавдий говорит с одним URL, а fan-out(!) по шардам и репликам выполняет Solr.

Дефолт в настройках — https://127.0.0.1:8983/solr. Локальный Solr всегда поднимается на HTTPS (jetty keystore из WUI-серта, см. {{ССЫЛКА:maintenance.tls-rotate|Замена TLS-сертификата}}). При внешнем Solr укажите его адрес (http://host:8983 или https://...) в настройках поиска.

Единый кластер при нескольких indexer(!)-узлах

Если в кластере Клавдия несколько узлов с ролью indexer, их локальные инстансы Solr объединяются в единый кластер SolrCloud — индекс шардируется и реплицируется между всеми инстансами, запросы балансируются автоматически:

  • Coordinator(!)-узел (первый indexer(!), назначается автоматически по наименьшему UID) — на нём работает локальный ZooKeeper (standalone(!), порт 2181) и Solr в режиме cloud(!).
  • Joiner(!)-узлы (остальные indexer(!)) — только Solr (cloud(!)); ZooKeeper не запускается. Их Solr подключается к ZooKeeper coordinator(!)-узла и автоматически присоединяется к тому же кластеру SolrCloud. Реплики коллекций распределяются по всем joiner(!)-узлам (replicationFactor(!), см. ниже).

Таким образом, все indexer(!)-узлы видят один и тот же индекс — письмо, проиндексированное на одном узле, доступно для поиска на любом другом. Не нужно указывать отдельный Solr-URL на каждом узле: каждый обращается к своему локальному Solr (https://127.0.0.1:8983/solr), а SolrCloud гарантирует согласованность данных между инстансами.

Доставка настроек кластера

Узел Клавдия сам управляет параметрами SolrCloud без правки docker-compose при добавлении инстанса:

  • При старте indexer(!)-узел регистрирует себя в реестре инстансов (config.solr_instances): идентификатор узла, адрес Solr, роль (coordinator(!)/joiner(!)), адрес ZooKeeper.
  • Узел определяет свою роль: если coordinator(!) уже есть — узел становится joiner(!) и использует его ZooKeeper; если coordinator(!) отсутствует и узел первый — он становится coordinator(!).
  • Параметры (роль, адрес ZooKeeper, адрес Solr) записываются в общий файл /shared/solr-cluster.env. Entrypoint(!)-скрипты контейнеров Solr и ZooKeeper читают этот файл: на coordinator(!) запускается ZooKeeper, на joiner(!) — не запускается; Solr на joiner(!) стартует с привязкой к ZooKeeper coordinator(!)-узла.

Общий том klvd_shared добавляется в compose один раз (на этапе развёртывания), а не для каждого инстанса.

Навигация по книге