Перейти к основному содержимому
Версия: 4.1

Настройка Cross Cluster Search

Описание

Cross Cluster Search позволяет выполнять поиск по данным с центрального кластера по одному или нескольким подчиненным кластерам. В статье используется следующие определения и переменные:

  • Центральный кластер, Coordinating Cluster - кластер, с которого осуществляются запросы к подчинённым кластерам
  • Подчинённый кластер, Remote Cluster - удалённый кластер, к которому осуществляются запросы с центрального кластера
  • OPENSEARCH_HOME - домашняя директория установки OpenSearch, обычно /app/opensearch
  • ALIAS - условное имя сертификата, для каждого нового доверенного сертификата нужно своё уникальное имя
  • PATH_TO_CERT - путь до сертификата
  • TRUSTSTORE_PASSWORD - пароль хранилища сертификатов, длинна не меньше 6 символов
  • REMOTE_CLUSTER_NAME - условное имя подчинённого кластера, можно назвать как угодно, используется для указания где производить поиск на центральном кластере в запросах
  • REMOTE_CLUSTER_ADDRESS - IP-адрес узла подчинённого кластера
  • TRANSPORT_PORT - порт коммуникации между узлами кластера, обычно это 9300/tcp, задаётся параметром transport.port

Процесс настройки

предупреждение

Настройка выполняется на всех узлах всех кластера, участвующих в процессе Cross Cluster Search.

Узлы подчиненных кластеров

Перед подключением подчиненного кластера необходимо добавить в доверенные сертификат CA другого кластера, или сертификаты всех узлов, которые участвуют в Cross Cluster Search:

$OPENSEARCH_HOME/jdk/bin/keytool -import -noprompt -trustcacerts -alias <ALIAS> -file <PATH_TO_CERT> -keystore $OPENSEARCH_HOME/config/cacerts.jks -storepass <TRUSTSTORE_PASSWORD>
chown opensearch:opensearch $OPENSEARCH_HOME/config/cacerts.jks
предупреждение

Данные действия нужно выполнить на узлах, которые участвуют в Cross Cluster Search, например, на центральном кластере OpenSearch Dashboards подключен только к узлам с ролью data, тогда достаточно выполнить эти действия только на этих узлах. Тоже самое с узлами подчинённого кластера.

Т.е. нужно скопировать сертификат CA подчинённого кластера и скопировать его на узлы центрального кластера и затем выполнить команды выше. на соответствующих узлах кластера Аналогичную процедуру нужно проделать на подчинённом кластере, нужно скопировать сертификат CA с центрального кластера и выполнить команды выше.

Можно добавить не сертификат CA, а непосредственно сертификаты узлов, которые будут подключаться. Но нужно будет выполнить первую команду из списка ниже для каждого узла другого кластера, а затем уже последующие команды:

openssl s_client -showcerts -connect <NODE_CLUSTER>:9200 </dev/null 2>/dev/null|openssl x509 -outform PEM > <PATH_TO_CERT>
$OPENSEARCH_HOME/jdk/bin/keytool -import -noprompt -trustcacerts -alias <ALIAS> -file <PATH_TO_CERT> -keystore $OPENSEARCH_HOME/config/cacerts.jks -storepass <TRUSTSTORE_PASSWORD>
chown opensearch:opensearch $OPENSEARCH_HOME/config/cacerts.jks

После этого в конфигурации OpenSearch на всех узлах, где выполнялись команды выше, требуется добавить информацию о новом хранилище доверенных сертификатов. Нужно добавить в файле $OPENSEARCH_HOME/config/opensearch.yml следующие строки:

plugins.security.ssl.transport.external_truststore_filepath: ./cacerts.jks
plugins.security.ssl.transport.external_truststore_password: '<TRUSTSTORE_PASSWORD>'

Чтобы не хранить в открытом виде пароль от хранилища сертификатов его можно указать в keystore, предварительно удалив строку из конфигурации выше:

$OPENSEARCH_HOME/bin/opensearch-keystore add plugins.security.ssl.transport.external_truststore_password;
chown opensearch:opensearch $OPENSEARCH_HOME/config/opensearch.keystore;

Помимо этого нужно добавить в параметр plugins.security.nodes_dn DN всех узлов другого кластера, т.е. на всех узлах центрального кластера, участвующих в Cross Cluster Search, нужно прописать DN сертификатов всех узлов подчинённого кластера. Для узлов подчинённого кластера нужно проделать аналогичную процедуру. Получить корректную запись DN сертификата можно выполнив команду:

openssl x509 -subject -nameopt RFC2253 -noout -in <PATH_TO_CERTIFICATE>

В выводе нужно удалить первые символы "subject=".

Для упрощения можно просто скопировать для узлов центрального кластера содержимое параметра plugins.security.nodes_dn подчинённого кластера и аналогично сделать для узлов подчинённого кластера. В DN можно использовать знак "*" для замены любых символов произвольного количества. Например, как на скриншоте ниже:

После этого обязательно нужно перезагрузить сервис OpenSearch:

systemctl restart opensearch

Узлы центрального кластера

На узлах центрального кластера требуется добавить роль кластера remote_cluster_client в $OPENSEARCH_HOME/config/opensearch.yml в параметр node.roles:

node.roles: [data, remote_cluster_client]

Настройка Remote Cluster

На центральном кластере нужно выполнить запрос по добавлению подчиненного кластера в Меню -> Параметры системы -> Консоль разработчика:

PUT _cluster/settings
{
"persistent": {
"cluster.remote": {
"<REMOTE_CLUSTER_NAME>": {
"seeds": ["<REMOTE_CLUSTER_ADDRESS:TRANSPORT_PORT>"]
}
}
}
}

В поле seeds можно указать список адресов узлов подчинённого кластера, обязательно указывать с портом (обычно 9300).

Проверка

Для проверки состояния подключения нужно выполнить команду:

GET _remote/info

В поле connected должно быть значение true.

Для выполнения запроса в подчинённом кластере нужно выполнить команду вида

GET <REMOTE_CLUSTER_NAME>:<ЗАПРОС>

Например, запрос с поиском в индексе books:

GET 27:books/_search