Коммиты и NRT Поиск в SolrCloud

Фиксирует и NRT Поиск в SolrCloud

1. обзор

Solr - одно из самых популярных поисковых решений на основе Lucene. Он быстрый, распределенный, надежный, гибкий, за ним стоит активное сообщество разработчиков. SolrCloud is the new, distributed version of Solr.

One of its key features here is the near real-time (NRT) search, то есть документы, доступные для поиска какsoon по мере их индексации.

2. Индексирование в SolrCloud

Коллекция в Solr состоит из нескольких осколков, и каждый осколок имеет различные копии. Одна из реплик шарда выбирается в качестве лидера для этого шарда при создании коллекции:

  • Когда клиент пытается проиндексировать документ, документу сначала назначается осколок на основе хэшаid документа.

  • Клиент получает URL-адрес лидера этого шарда от zookeeper, и, наконец, к этому URL делается запрос индекса

  • Руководитель сегмента индексирует документ локально перед отправкой в ​​реплики.

  • Как только лидер получает подтверждение от всех активных и восстанавливающихся реплик, он возвращает подтверждение клиентскому приложению индексирования

When we index a document in Solr, it doesn’t go to the index directly. It’s written in what is called a tlog (transaction log). Solr использует журнал транзакций, чтобы гарантировать, что документы не будут потеряны до их фиксации, в случае сбоя системы.

Если происходит сбой системы до того, как документы в журнале транзакций будут зафиксированы, то есть сохранены на диске, журнал транзакций воспроизводится при повторном запуске системы, что приводит к нулевой потере документов.

Каждый запрос индекса / обновления записывается в журнал транзакций, который продолжает расти, пока мы не сделаем фиксацию.

3. Фиксирует в SolrCloud

Операцияcommit означает завершение изменения и сохранение этого изменения на диске. SolrCloud предоставляет два вида операций фиксации, а именно. коммит и мягкий коммит.

3.1. Фиксация (жесткая фиксация)

Коммит или жесткий коммит - это тот, в котором Solr сбрасывает все незафиксированные документы в журнале транзакций на диск. The active transaction log is processed, and then a new transaction log file is opened.с

Он также обновляет компонент, называемый поисковиком, так что вновь принятые документы становятся доступными для поиска. Искатель может рассматриваться как доступное только для чтения представление всех зафиксированных документов в индексе.

Операция фиксации может быть выполнена исключительно клиентом, вызвав APIcommit:

String zkHostString = "zkServer1:2181,zkServer2:2181,zkServer3:2181/solr";
SolrClient solr = new CloudSolrClient.Builder()
  .withZkHost(zkHostString)
  .build();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", "123abc");
doc1.addField("date", "14/10/2017");
doc1.addField("book", "To kill a mockingbird");
doc1.addField("author", "Harper Lee");
solr.add(doc1);
solr.commit();

Точно так же его можно автоматизировать какautoCommit, указав его в файлеsolrconfig.xml, см. Раздел 3.4.

3.2. SoftCommit

Softcommit был добавлен начиная с Solr 4, прежде всего, для поддержки функции NRT в SolrCloud. Это механизм, позволяющий сделать документы доступными для поиска в режиме, близком к реальному времени, за счет исключения дорогостоящих аспектов жесткой фиксации.

During a softcommit, the transaction log is not truncated, it continues to grow. However, a new searcher is opened, что делает документы с момента последней мягкой фиксации видимыми для поиска. Кроме того, некоторые кеши верхнего уровня в Solr недействительны, поэтому это не полностью бесплатная операция.

Когда мы указываемmaxTime для softcommit как 1000, это означает, что документ будет доступен в запросах не позднее, чем через 1 секунду с момента его индексации.

Эта функция предоставляет SolrCloud возможность поиска практически в реальном времени, поскольку новые документы могут быть доступны для поиска даже без их фиксации. Softcommit может быть запущен только какautoSoftCommit, указав его в файле solrconfig.xml, см. Раздел 3.4.

3.3. Autocommit и Autosoftcommit

Файлsolrconfig.xml - один из самых важных файлов конфигурации в SolrCloud. Он генерируется во время создания коллекции. Чтобы включитьautoCommit илиautoSoftCommit, нам необходимо обновить следующие разделы в файле:


  10000
  30000
  true



  6000
  1000

maxTime: Количество миллисекунд с момента самого раннего незафиксированного обновления, после которого должна произойти следующая фиксация / мягкая фиксация.

maxDocs: Количество обновлений, произошедших с момента последней фиксации, после которых должна произойти следующая фиксация / мягкая фиксация.

openSearcher: Это свойство сообщает Solr, следует ли открывать новое средство поиска после операции фиксации или нет. If it’s true, after a commit, the old searcher is closed, and a new searcher is opened, making the committed document visible for searching, если этоfalse, документ не будет доступен для поиска после фиксации.

Поиск в реальном времени в Solr достигается с помощью комбинации commit и softcommit. Как упоминалось ранее, когда документ добавляется в Solr, он не будет отображаться в результатах поиска, пока не будет зафиксирован в индексе.

Обычные коммиты стоят дорого, поэтому софткоммиты полезны. Но поскольку softcommit не сохраняет документы, нам нужно установить интервал autocommitmaxTime (илиmaxDocs) на разумное значение, в зависимости от ожидаемой нагрузки.

4.1. В реальном времени Getсс

Есть еще одна функция, предоставляемая Solr, которая фактически работает в реальном времени - APIget. The get API can return us a document that is not even soft committed yet.

Он ищет непосредственно в журналах транзакций, если документ не найден в индексе. Таким образом, мы можем запустить вызов APIget сразу после возврата из индексного вызова, и мы по-прежнему сможем получить документ.

Однако, как и все слишком хорошие вещи, здесь есть одна загвоздка. We need to pass the id of the document in the get API call. Конечно, мы можем предоставить другие фильтрующие запросы вместе сid, но безid вызов не работает:

http://localhost:8985/solr/myCollection/get?id=1234&fq=name:example

5. Заключение

Solr предоставляет нам немного гибкости в отношении настройки возможностей NRT. Чтобы добиться максимальной производительности сервера, нам нужно поэкспериментировать со значениями коммитов и программных коммитов, основанными на нашем сценарии использования и ожидаемой нагрузке.

We shouldn’t keep our commit interval too long, or else our transaction log will grow to a considerable size. Однако не следует слишком часто выполнять мягкие коммиты.

Также рекомендуется провести надлежащее тестирование производительности нашей системы, прежде чем мы начнем производство. Мы должны проверить, становятся ли документы доступными для поиска в желаемый промежуток времени.