Многие наши коллеги всё больше смотрят в сторону OpenSearch, который постепенно обрастает всё новыми и новыми функциями. В телеграм-канале мы уже публиковали пост с описанием обновлений в версии 2.7, среди которых есть репликация сегментов (есть ещё и поиск по снэпшотам, но о нём как-нибудь в другой раз). Репликация сегментов — это альтернатива репликации документов. При репликации документов все ноды-реплики выполняют ту же операцию индексирования, что и основная нода. При репликации сегментов только основная нода выполняет операцию индексирования, создавая файлы сегментов, которые далее копируются на каждую ноду-реплику. При такой схеме репликации нагрузка по индексированию ложится только на основную ноду, освобождая ресурсы на репликах для использования под другие операции. В этом посте мы расскажем о концепции репликации сегментов, преимуществах и недостатках по сравнению с репликацией документов. Велком ту подкат.
При создании индекса в OpenSearch, задаётся количество основных шардов (number_of_shards по умолчанию 1) и количество реплик (number_of_replicas по умолчанию 1). Каждая реплика — это полная копия основного шарда. Если у вас 5 основных шардов и 1 реплика для каждого из них, то всего в кластере в индексе 10 шардов. Каждый шард представляет собой экземпляр индекса Lucene — библиотеки Java для чтения и записи индексных структур. Lucene — это поисковый движок на основе файлов (сегментов), в которые возможно добавлять записи, но нельзя их удалять. Сегмент — это часть индекса Lucene в виде файла на диске. Каждый документ, который индексируется, разбивается на поля. Lucene хранит эти данные в оперативной памяти до тех пор, пока они не будут записаны на диск в тех самых сегментов. Ну, а реплики обеспечивают избыточные копии данных для отказоустойчивости и ускорения поиска в индексе.
Репликация документов OpenSeacrh
Для версий 2.7 и более ранних репликация документов является режимом репликации по умолчанию. В этом режиме все операции записи, влияющие на индекс (например, добавление, обновление или удаление документов), сначала направляются на ноду, содержащую основной шард индекса. Основной шард отвечает за проверку операции индексации. После успешного завершения операции индексирования данные параллельно направляются на каждую ноду в группе реплик. Каждая нода с репликой выполняет одну и ту же операцию, дублируя обработку, выполненную на ноде с основным шардом. Когда операция завершается на реплике (успешно или с ошибкой), ответ отправляется на ноду с основным шардом. После того как все реплики ответили, нода с основым шардом отвечает координирующей ноде, которая далее отвечает клиенту статусом об успехе или неудаче репликации.
Преимущество репликации документов заключается в том, что документы становятся доступными для поиска на репликах быстрее, т.к. они отправляются на реплики сразу после поступления на основной шард. Кластер быстрее достигает согласованного состояния между основными щардами и репликами. При этом, репликация документов потребляет больше процессорных мощностей, т.к. операции индексирования дублируются на нодах с основным шардом и репликами для каждого документа. Ниже как раз этот процесс.
Репликация сегментов OpenSeacrh
При репликации сегментов документы индексируются только на ноде, содержащей основной шард. Созданные файлы сегментов затем копируются на все реплики в группе репликации. Репликация сегментов снижает нагрузку на процессор при индексации, обновлении или удалении документов за счет того, что индексация выполняется только на одной ноде.
Репликация документов vs. репликация сегментов
Репликация сегментов обменивает использование CPU на время и сеть. Основной шард отправляет большие блоки данных своим репликам реже. По мере увеличения числа реплик основной шард становится бутылочным горлышком, выполняя всю работу по индексированию и реплицируя все сегменты. В ходе тестирования наблюдалось стабильное улучшение при количестве реплик, равном единице. По мере роста числа реплик улучшение линейно снижается. Повышение производительности в кластере зависит от нагрузки и конфигурации.
Репликация сегментов лучше всего подходит для следующих конфигураций:
- В кластере малое количество реплик (1-2 реплики).
- В кластер поступает много данных и выполняется мало поисковых запросов.
- Приложение не чувствительно к задержке репликации.
- Пропускная способность сети между нодами достаточна для большого объема передачи данных.
Репликация документов подойдёт больше в следующих случаях:
- Кластер имеет большое количество реплик (более 3), и вам важна низкая задержка репликации.
- Кластер не переносит задержку репликации. Важно при интенсивном поиске, где согласованность данных между всеми репликами критически важна.
- Ноды кластера имеют недостаточную пропускную способность сети для быстрой передачи данных.
Производительность при репликации сегментов в среднем на 40% выше, чем при репликации документов при одинаковой конфигурации кластера. С репликацией сегментов можно получить такую же производительность индексации с 9 нодами в кластере, как и с 15 нодами при репликации документов. Да, и включение репликация сегментов для существующего индекса требует переиндексации. Подробнее о тестах производительности можно узнать в блоге OpenSearch.