Настройка 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