Настройка Cross-cluster search
Описание
Cross-cluster search позволяет выполнять поиск по данным с центрального кластера по одному или нескольким подчиненным кластерам. В статье используются следующие определения и переменные:
- Центральный кластер, Coordinating Cluster - кластер, с которого осуществляются запросы к подчиненным кластерам
- Подчиненный кластер, Remote Cluster - удаленный кластер, к которому осуществляются запросы с центрального кластера
- OS_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:
$OS_HOME/jdk/bin/keytool -import -noprompt -trustcacerts -alias <ALIAS> -file <PATH_TO_CERT> -keystore $OS_HOME/config/cacerts.jks -storepass <TRUSTSTORE_PASSWORD>
chown opensearch:opensearch $OS_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>
$OS_HOME/jdk/bin/keytool -import -noprompt -trustcacerts -alias <ALIAS> -file <PATH_TO_CERT> -keystore $OS_HOME/config/cacerts.jks -storepass <TRUSTSTORE_PASSWORD>
chown opensearch:opensearch $OS_HOME/config/cacerts.jks
После этого в конфигурации OpenSearch на всех узлах, где выполнялись команды выше, требуется добавить информацию о новом хранилище доверенных сертификатов. Нужно добавить в файле $OS_HOME/config/opensearch.yml следующие строки:
plugins.security.ssl.transport.external_truststore_filepath: ./cacerts.jks
plugins.security.ssl.transport.external_truststore_password: '<TRUSTSTORE_PASSWORD>'
Чтобы не хранить в открытом виде пароль от хранилища сертификатов его можно указать в keystore, предварительно удалив строку из конфигурации выше:
$OS_HOME/bin/opensearch-keystore add plugins.security.ssl.transport.external_truststore_password;
chown opensearch:opensearch $OS_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 в $OS_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
Настройка поиска по определенному подчиненному кластеру
Можно указать <REMOTE_CLUSTER_NAME> по умолчанию для поиска в Smart Monitor. Тогда указывать нужный кластер явно в запросе поиска не нужно. Настройки кластера по умолчанию хранятся в _cluster/settings:
| Название | Описание | Значение по умолчанию | 
|---|---|---|
| sme.core.cross_cluster_search.default_cluster | Название <REMOTE_CLUSTER_NAME>кластера по умолчанию. | |
| sme.core.cross_cluster_search.enable | Включает подстановку <REMOTE_CLUSTER_NAME>для всех поисков, кроме командыlookup. | false | 
| sme.core.cross_cluster_search.enable_lookup | Включает подстановку <REMOTE_CLUSTER_NAME>для поисков с командойlookup. | false | 
Для обращения к внутренним индексам c включенной подстановкой <REMOTE_CLUSTER_NAME> можно в поиске использовать префикс internal:.
Увеличение лимита одновременных подключений
Для обработки интенсивной нагрузки в Cross-cluster search может потребоваться увеличить лимит одновременных подключений к удаенным кластерам.
По умолчанию параметр connections_per_cluster равен 3.
Настройка
- Добавьте параметр connections_per_clusterв конфигурационный файлopensearch.yml(применяется сразу на все подключения Cross-cluster search):
cluster.remote.connections_per_cluster: 10
- После этого перезагрузите сервис OpenSearch:
systemctl restart opensearch