Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Настройка Elasticsearch ›Настройка Elasticsearch

Сеть

Каждый узел Elasticsearch имеет два разных сетевых интерфейса. Клиенты отправляют запросы к REST-API Elasticsearch через его HTTP-интерфейс, а узлы общаются между собой через транспортный интерфейс. Транспортный интерфейс также используется для связи с удаленными кластерами. Транспортный интерфейс использует собственный двоичный протокол, передаваемый по долгоживущим TCP-каналам. Оба интерфейса можно настроить на использование TLS для безопасности.

Вы можете настроить оба этих интерфейса одновременно, используя настройки network.*. Если у вас более сложная сеть, возможно, потребуется настроить интерфейсы независимо, используя настройки http.* и transport.*. Если это возможно, используйте настройки network.*, которые применяются к обоим интерфейсам, чтобы упростить настройку и уменьшить дублирование.

По умолчанию Elasticsearch привязывается только к localhost, что означает, что к нему нельзя получить доступ удаленно. Эта конфигурация подходит для локального кластера разработки, состоящего из одного или нескольких узлов, работающих на одном и том же хосте. Чтобы создать кластер на нескольких хостах или обеспечить доступ к нему удалённым клиентам, необходимо настроить некоторые сетевые настройки, такие как network.host.

Будьте осторожны при настройке сети!

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

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

Часто используемые настройки сети

Большинству пользователей потребуется настроить только следующие сетевые параметры.

network.host

(Статический, строка) Устанавливает адрес этого узла для трафика HTTP и транспорта. Узел привяжется к этому адресу и также будет использовать его в качестве адреса публикации. Принимает IP-адрес, имя хоста или специальное значение.

По умолчанию _local_. Однако обратите внимание, что автоматическая настройка безопасности добавит http.host: 0.0.0.0 в ваш файл конфигурации elasticsearch.yml, что переопределяет это значение по умолчанию для HTTP-трафика.

http.port

(Статический, целое число) Порт для привязки для связи с HTTP-клиентом. Принимает одно значение или диапазон. Если указан диапазон, узел привяжется к первому доступному порту в диапазоне.

По умолчанию 9200-9300.

transport.port

(Статический, целое число) Порт для привязки для связи между узлами. Принимает одно значение или диапазон. Если указан диапазон, узел привяжется к первому доступному порту в диапазоне. Установите это значение в единственный порт, а не диапазон, на каждом узле, способном быть мастер-узлом.

По умолчанию 9300-9400.

remote_cluster.port

(Статический, целое число) Порт для привязки для связи с клиентами удаленного кластера. Принимает одно значение.

По умолчанию 9443.

Специальные значения для сетевых адресов

Вы можете настроить Elasticsearch на автоматическое определение своих адресов, используя следующие специальные значения. Используйте эти значения при настройке network.host, network.bind_host, network.publish_host и соответствующих параметров для HTTP- и транспортных интерфейсов.

_local_
Любые адреса обратной связи в системе, например 127.0.0.1.
_site_
Любые адреса локальной сети в системе, например 192.168.0.1.
_global_
Любые глобальные адреса в системе, например 8.8.8.8.
_[networkInterface]_
Используйте адреса сетевого интерфейса, называемого [networkInterface]. Например, если вы хотите использовать адреса интерфейса с именем en0, установите network.host: _en0_.
0.0.0.0
Адреса всех доступных сетевых интерфейсов.

В некоторых системах эти специальные значения разрешаются в несколько адресов. В таком случае Elasticsearch выберет один из них в качестве адреса публикации и может изменить свой выбор при каждом перезапуске узла. Убедитесь, что ваш узел доступен по всем возможным адресам.

Любые значения, содержащие : (например, IPv6-адрес или некоторые из специальных значений), должны быть заключены в кавычки, поскольку : является специальным символом в YAML.

IPv4 против IPv6

Эти специальные значения по умолчанию дают как IPv4, так и IPv6 адреса, но вы также можете добавить суффикс :ipv4 или :ipv6, чтобы ограничить их только IPv4 или IPv6 адресами соответственно. Например, network.host: "_en0:ipv4_" установит адреса этого узла на IPv4-адреса интерфейса en0.

Обнаружение в облаке

Доступно больше специальных настроек при работе в облаке с установленным плагином обнаружения EC2 или плагином обнаружения Google Compute Engine.

Привязка и публикация

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

Когда приложение, такое как Elasticsearch, хочет получать сетевые сообщения, оно должно указать операционной системе адрес или адреса, трафик которых оно должно получать. Это известно как привязка к этим адресам. Elasticsearch может привязываться к нескольким адресам при необходимости, но большинство узлов привязываются только к одному адресу. Elasticsearch может привязаться к адресу только если он запущен на хосте, который имеет сетевой интерфейс с этим адресом. При необходимости можно настроить транспортный и HTTP-интерфейсы на привязку к различным адресам.

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

  • Быть доступен по адресу публикации HTTP для всех клиентов, которые будут обнаруживать его с помощью сканирования.
  • Быть доступен по адресу публикации транспортного уровня для всех других узлов в кластере и для любых удалённых кластеров, которые обнаружат его с помощью режима сканирования.

Каждый узел должен иметь свой собственный уникальный адрес публикации.

Если вы указываете адрес публикации транспортного уровня, используя имя хоста, Elasticsearch будет разрешать это имя хоста в IP-адрес один раз во время запуска, и другие узлы будут использовать полученный IP-адрес вместо повторного разрешения имени. Вы должны использовать имя хоста, такое, что все адреса, которые он разрешает, являются адресами, к которым узел доступен со всех других узлов. Для избежания путаницы проще всего использовать имя хоста, которое разрешается в один адрес.

Если вы указываете адрес публикации транспортного уровня, используя специальное значение, Elasticsearch будет разрешать это значение в один IP-адрес во время запуска, и другие узлы будут использовать полученный IP-адрес вместо повторного разрешения значения. Вы должны использовать значение, такое, что все адреса, к которым оно разрешается, являются адресами, к которым узел доступен со всех других узлов. Для избежания путаницы проще всего использовать значение, которое разрешается в один адрес. Обычно это ошибка использование 0.0.0.0 в качестве адреса публикации на хостах с более чем одним сетевым интерфейсом.

Использование одного адреса

Наиболее распространённая конфигурация заключается в том, чтобы Elasticsearch привязывался к одному адресу, по которому к нему могут обращаться клиенты и другие узлы. Чтобы использовать эту конфигурацию, установите только network.host на нужный адрес. Не устанавливайте отдельно адреса привязки или публикации. Не указывайте отдельно адреса для HTTP- или транспортных интерфейсов.

Использование нескольких адресов

Используйте расширенные настройки сети, если вы хотите привязать Elasticsearch к нескольким адресам или опубликовать другой адрес, отличный от адресов, к которым вы привязаны. Установите network.bind_host на адреса привязки, и network.publish_host на адрес, по которому этот узел доступен. В сложных конфигурациях вы можете настроить эти адреса по-разному для HTTP- и транспортных интерфейсов.

Расширенные сетевые настройки

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

network.bind_host
(Статический, строка) Сетевой адрес(ы), к которому узел должен привязаться, чтобы прослушивать входящие подключения. Принимает список IP-адресов, имён хостов и специальных значений. По умолчанию использует адрес, указанный в network.host. Используйте эту настройку только если привязываетесь к нескольким адресам или используете разные адреса для публикации и привязки.
network.publish_host
(Статический, строка) Сетевой адрес, который клиенты и другие узлы могут использовать для связи с этим узлом. Принимает IP-адрес, имя хоста или специальное значение. По умолчанию использует адрес, указанный в network.host. Используйте эту настройку только если привязываетесь к нескольким адресам или используете разные адреса для публикации и привязки.

Вы можете указать список адресов для network.host и network.publish_host. Вы также можете указать одно или несколько имён хостов или специальные значения, которые разрешаются в несколько адресов. Если вы сделаете это, Elasticsearch выберет один из адресов в качестве адреса публикации. Этот выбор использует эвристику, основанную на предпочтениях стека IPv4/IPv6 и достижимости, и может измениться при перезапуске узла. Убедитесь, что каждый узел доступен по всем возможным адресам публикации.

Расширенные настройки TCP

Используйте следующие настройки для управления низкоуровневыми параметрами TCP-соединений, используемых HTTP- и транспортными интерфейсами.

network.tcp.keep_alive
(Статический, булево) Настраивает опцию SO_KEEPALIVE для сетевых сокетов, которая определяет, отправляет ли каждое соединение TCP-запросы на проверку активности. По умолчанию true.
network.tcp.keep_idle
(Статический, целое число) Настраивает опцию TCP_KEEPIDLE для сетевых сокетов, которая определяет время в секундах, в течение которого соединение должно быть неактивным, прежде чем начать отправлять TCP-запросы на проверку активности. По умолчанию -1, что означает использование системного значения. Это значение не может превышать 300 секунд. Применимо только к Linux и macOS.
network.tcp.keep_interval
(Статический, целое число) Настраивает опцию TCP_KEEPINTVL для сетевых сокетов, которая определяет время в секундах между отправкой TCP-запросов на проверку активности. По умолчанию -1, что означает использование системного значения. Это значение не может превышать 300 секунд. Применимо только к Linux и macOS.
network.tcp.keep_count
(Статический, целое число) Настраивает опцию TCP_KEEPCNT для сетевых сокетов, которая определяет количество неопознанных TCP-запросов на проверку активности, которые могут быть отправлены по соединению, прежде чем оно будет закрыто. По умолчанию -1, что означает использование системного значения. Применимо только к Linux и macOS.
network.tcp.no_delay
(Статический, булево) Настраивает опцию TCP_NODELAY на сетевых сокетах, которая определяет, включен ли алгоритм Nagla. По умолчанию true.
network.tcp.reuse_address
(Статический, булево) Настраивает опцию SO_REUSEADDR для сетевых сокетов, которая определяет, может ли адрес быть повторно использован. По умолчанию false в Windows и true в остальных случаях.
network.tcp.send_buffer_size
(Статический, значение байта) Настраивает размер буфера отправки TCP для сетевых сокетов. По умолчанию -1, что означает использование системного значения.
network.tcp.receive_buffer_size
(Статический, значение байта) Настраивает размер буфера приёма TCP. По умолчанию -1, что означает использование системного значения.

Дополнительные настройки HTTP

Используйте следующие дополнительные настройки для конфигурации HTTP-интерфейса независимо от интерфейса транспорта. Вы также можете настроить оба интерфейса вместе, используя общие настройки сети.

http.host

(Статический, строка) Устанавливает адрес этого узла для HTTP-трафика. Узел будет привязываться к этому адресу и также использовать его в качестве адреса публикации HTTP. Принимает IP-адрес, имя хоста или специальное значение. Используйте эту настройку только в том случае, если вам требуются разные конфигурации для интерфейсов транспорта и HTTP.

По умолчанию используется адрес, заданный network.host. Однако обратите внимание, что автоматическая настройка безопасности добавит http.host: 0.0.0.0 в ваш elasticsearch.yml конфигурационный файл, который переопределяет это значение по умолчанию.

http.bind_host
(Статический, строка) Сетевой адрес(а), к которому узел должен привязаться для прослушивания входящих HTTP-соединений. Принимает список IP-адресов, имен хостов и специальных значений. По умолчанию используется адрес, заданный http.host или network.bind_host. Используйте эту настройку только в том случае, если вам нужно привязаться к нескольким адресам или использовать разные адреса для публикации и привязки, а также вам требуются разные конфигурации привязки для интерфейсов транспорта и HTTP.
http.publish_host
(Статический, строка) Сетевой адрес для HTTP-клиентов для связи с узлом с использованием сниффинга. Принимает IP-адрес, имя хоста или специальное значение. По умолчанию используется адрес, заданный http.host или network.publish_host. Используйте эту настройку только в том случае, если вам нужно привязаться к нескольким адресам или использовать разные адреса для публикации и привязки, а также вам требуются разные конфигурации привязки для интерфейсов транспорта и HTTP.
http.publish_port
(Статический, целое число) Порт HTTP-адреса публикации. Настройте эту настройку только в том случае, если вам нужен порт публикации, отличный от http.port. По умолчанию используется порт, назначенный через http.port.
http.max_content_length
(Статический, значение в байтах) Максимальный размер тела HTTP-запроса. Если тело сжато, ограничение применяется к размеру тела HTTP-запроса до сжатия. По умолчанию 100mb. Настройка этого значения больше чем 100mb может привести к нестабильности кластера и не рекомендуется. Если вы столкнулись с этим ограничением при отправке запроса к API Bulk, настройте своего клиента на отправку меньшего количества документов в каждом запросе массовой обработки. Если вы хотите индексировать отдельные документы, превышающие 100mb, предварительно обработайте их в меньшие документы перед отправкой в Elasticsearch. Например, храните исходные данные в системе вне Elasticsearch и включайте ссылку на исходные данные в документы, которые Elasticsearch индексирует.
http.max_initial_line_length
(Статический, значение в байтах) Максимальный размер HTTP-URL. По умолчанию 4kb.
http.max_header_size
(Статический, значение в байтах) Максимальный размер разрешенных заголовков. По умолчанию 16kb.
http.compression logo cloud

(Статический, boolean) Поддержка сжатия при возможности (с Accept-Encoding). Если HTTPS включен, по умолчанию false. В противном случае по умолчанию true.

Отключение сжатия для HTTPS снижает потенциальные риски безопасности, такие как атака BREACH. Для сжатия трафика HTTPS необходимо явно установить http.compression в true.

http.compression_level
(Статический, целое число) Определяет уровень сжатия для использования в HTTP-ответах. Допустимые значения находятся в диапазоне от 1 (минимальное сжатие) до 9 (максимальное сжатие). По умолчанию 3.
http.cors.enabled logo cloud

(Статический, boolean) Включение или отключение совместного использования ресурсов через разные источники, что определяет, может ли браузер на другом источнике выполнять запросы к Elasticsearch. Установите в true, чтобы разрешить Elasticsearch обрабатывать предварительные запросы CORS. Elasticsearch ответит на эти запросы с заголовком Access-Control-Allow-Origin, если Origin, отправленный в запросе, разрешен списком http.cors.allow-origin. Установите в false (значение по умолчанию), чтобы заставить Elasticsearch игнорировать заголовок запроса Origin, фактически отключив CORS-запросы, потому что Elasticsearch никогда не ответит с заголовком ответа Access-Control-Allow-Origin.

Если клиент не отправляет предварительный запрос с заголовком Origin или не проверяет заголовки ответа от сервера для проверки заголовка ответа Access-Control-Allow-Origin, безопасность кросс-оригинальных запросов нарушается. Если CORS не включен в Elasticsearch, единственный способ для клиента узнать об этом - отправить предварительный запрос и понять, что необходимые заголовки ответа отсутствуют.

http.cors.allow-origin logo cloud

(Статический, строка) Какие источники разрешить. Если вы добавите ведущий и заключительный слеш (/) к значению, это будет обрабатываться как регулярное выражение, что позволит вам поддерживать HTTP и HTTPS. Например, используя /https?:\/\/localhost(:[0-9]+)?/, заголовок запроса будет обработаться должным образом в обоих случаях. По умолчанию источники не разрешены.

Подстановка (*) является допустимым значением, но считается риском для безопасности, так как ваш экземпляр Elasticsearch открыт для кросс-оригинальных запросов от любого места.

http.cors.max-age logo cloud
(Статический, целое число) Браузеры отправляют предварительный запрос OPTIONS для определения настроек CORS. max-age определяет, на сколько времени (в секундах) результат должен быть кэширован. По умолчанию 1728000 (20 дней).
http.cors.allow-methods logo cloud
(Статический, строка) Какие методы разрешить. По умолчанию OPTIONS, HEAD, GET, POST, PUT, DELETE.
http.cors.allow-headers logo cloud
(Статический, строка) Какие заголовки разрешить. По умолчанию X-Requested-With, Content-Type, Content-Length, Authorization, Accept, User-Agent, X-Elastic-Client-Meta.
http.cors.expose-headers logo cloud
(Статический) Какие заголовки ответа отобразить в клиенте. По умолчанию X-elastic-product.
http.cors.allow-credentials logo cloud

(Статический, boolean) Необходимо ли возвращать заголовок Access-Control-Allow-Credentials. По умолчанию false.

Этот заголовок возвращается только при установке настройки в true.

http.detailed_errors.enabled
(Статический, boolean) Настройка, определяющая, включена ли подробная отладка ошибок в ответах HTTP. По умолчанию установлено значение true, что означает, что запросы HTTP, которые включают параметр ?error_trace, будут возвращать подробное сообщение об ошибке, включающее отладочный след, если возникнет исключение. Если установлено значение false, запросы с параметром ?error_trace отклоняются.
http.pipelining.max_events
(Статический, integer) Максимальное количество событий, которые можно поместить в очередь в памяти, прежде чем соединение HTTP будет закрыто; по умолчанию установлено значение 10000.
http.max_warning_header_count
(Статический, integer) Максимальное количество заголовков предупреждений в ответах HTTP клиента. По умолчанию установлено значение -1, что означает, что количество заголовков предупреждений не ограничено.
http.max_warning_header_size
(Статический, значение байта) Максимальный общий размер заголовков предупреждений в ответах HTTP клиента. По умолчанию установлено значение -1, что означает, что размер заголовков предупреждений не ограничен.
http.tcp.keep_alive
(Статический, boolean) Настраивает опцию SO_KEEPALIVE для этого сокета, определяя, отправляет ли он зонды TCP keepalive. По умолчанию установлено значение network.tcp.keep_alive.
http.tcp.keep_idle
(Статический, integer) Настраивает опцию TCP_KEEPIDLE для сокетов HTTP, определяя время в секундах, которое соединение должно быть бездействующим, прежде чем начать отправлять зонды TCP keepalive. По умолчанию установлено значение network.tcp.keep_idle, которое использует системное значение по умолчанию. Это значение не может превышать 300 секунд. Применимо только к Linux и macOS.
http.tcp.keep_interval
(Статический, integer) Настраивает опцию TCP_KEEPINTVL для сокетов HTTP, определяя время в секундах между отправкой зондов TCP keepalive. По умолчанию установлено значение network.tcp.keep_interval, которое использует системное значение по умолчанию. Это значение не может превышать 300 секунд. Применимо только к Linux и macOS.
http.tcp.keep_count
(Статический, integer) Настраивает опцию TCP_KEEPCNT для сокетов HTTP, определяя количество неподтвержденных зондов TCP keepalive, которые могут быть отправлены по соединению, прежде чем оно будет прервано. По умолчанию установлено значение network.tcp.keep_count, которое использует системное значение по умолчанию. Применимо только к Linux и macOS.
http.tcp.no_delay
(Статический, boolean) Настраивает опцию TCP_NODELAY для сокетов HTTP, которая определяет, включен ли алгоритм Nagle. По умолчанию установлено значение true.
http.tcp.reuse_address
(Статический, boolean) Настраивает опцию SO_REUSEADDR для сокетов HTTP, которая определяет, может ли адрес быть повторно использован. По умолчанию установлено значение false в Windows и true в остальных случаях.
http.tcp.send_buffer_size
(Статический, значение байта) Размер буфера отправки TCP для трафика HTTP. По умолчанию установлено значение network.tcp.send_buffer_size.
http.tcp.receive_buffer_size
(Статический, значение байта) Размер буфера приема TCP для трафика HTTP. По умолчанию установлено значение network.tcp.receive_buffer_size.
http.client_stats.enabled
(Динамический, boolean) Включить или отключить сбор статистики HTTP-клиента. По умолчанию установлено значение true.
http.client_stats.closed_channels.max_count
(Статический, integer) Когда http.client_stats.enabled равно true, устанавливает максимальное количество закрытых HTTP-каналов, для которых Elasticsearch сообщает статистику. По умолчанию установлено значение 10000.
http.client_stats.closed_channels.max_age
(Статический, значение времени) Когда http.client_stats.enabled равно true, устанавливает максимальную длительность времени после закрытия HTTP-канала, за которую Elasticsearch будет сообщать статистику по этому каналу. По умолчанию установлено значение 5m.

Настройка HTTP-клиента

Многие HTTP-клиенты и прокси-серверы настроены на задержку в ответе, подобную браузерной, и по умолчанию налагают довольно короткий таймаут, сообщая об ошибке, если Elasticsearch тратит больше этого таймаута на обработку запроса. Elasticsearch всегда в конечном итоге ответит на каждый запрос, но некоторым запросам может потребоваться много минут для обработки. Тщательно продумайте, подходит ли стандартный таймаут ответа вашего клиента для ваших потребностей. Во многих случаях лучше подождать дольше ответа, чем прерывать выполнение, и это означает, что вам следует отключить любые таймауты по времени ответа:

  • Если вы реагируете на таймаут повторной попыткой запроса, повтор будет часто помещен в конец той же очереди, которая содержала исходный запрос. Поэтому обработка запроса займет больше времени, если вы прервете выполнение и повторите запрос вместо более терпеливого ожидания. Повтор также накладывает дополнительную нагрузку на Elasticsearch.
  • Если запрос не идемпотентен и не может быть повторен, то отказ от запроса — это крайний случай. Более терпеливое ожидание ответа обычно позволит выполнить всю операцию успешно.

Если вы отключите таймаут ответа в своем клиенте, убедитесь, что вместо этого настроите TCP keepalives. TCP keepalives — это рекомендуемый способ предотвратить бесконечное ожидание клиента в случае сетевого сбоя.

Дополнительные настройки транспорта

Используйте следующие дополнительные настройки для конфигурации интерфейса транспорта независимо от интерфейса HTTP. Используйте настройки сети для одновременной конфигурации обоих интерфейсов.

transport.host

(Статический, строка) Устанавливает адрес этого узла для трафика транспорта. Узел будет привязываться к этому адресу и также использовать его в качестве адреса публикации транспорта. Принимает IP-адрес, имя хоста или специальное значение. Используйте эту настройку только в том случае, если вам требуются разные конфигурации для интерфейсов транспорта и HTTP.

По умолчанию используется адрес, заданный network.host.

transport.bind_host
(Статический, строка) Сетевой адрес(ы), к которому(ым) узел должен быть привязан для прослушивания входящих соединений транспорта. Принимает список IP-адресов, имён хостов и специальных значений. По умолчанию используется адрес, заданный transport.host или network.bind_host. Используйте эту настройку только в том случае, если вам требуется привязка к нескольким адресам или использование разных адресов для публикации и привязки, а также вам требуются разные конфигурации привязки для интерфейсов транспорта и HTTP.
transport.publish_host
(Статический, строка) Сетевой адрес, по которому другие узлы могут связаться с этим узлом. Принимает IP-адрес, имя хоста или специальное значение. По умолчанию используется адрес, заданный transport.host или network.publish_host. Используйте эту настройку только в том случае, если вам требуется привязка к нескольким адресам или использование разных адресов для публикации и привязки, а также вам требуются разные конфигурации привязки для интерфейсов транспорта и HTTP.
transport.publish_port
(Статический, целое число) Порт адреса публикации транспорта. Устанавливайте этот параметр только в том случае, если вам нужен порт публикации, отличающийся от transport.port. По умолчанию используется порт, назначенный через transport.port.
transport.connect_timeout
(Статический, значение времени) Таймаут подключения для инициализации нового соединения (в формате установки времени). По умолчанию 30s.
transport.compress

(Статический, строка) Определяет, какие запросы транспорта будут сжаты перед отправкой другому узлу. Elasticsearch будет сжимать ответы транспорта только в том случае, если соответствующий запрос был сжат. См. также transport.compression_scheme, которое определяет схему сжатия, которая используется. Принимает следующие значения:

false
Запросы транспорта не сжимаются. Этот вариант использует наибольшую пропускную способность сети, но избегает накладных расходов процессора на сжатие и распаковку.
indexing_data
Сжимаются только сырые данные индексирования, передаваемые между узлами во время загрузки, обработки CCR (за исключением начальной загрузки) и восстановления фрагментов на основе операций (за исключением восстановления на основе файлов, которое копирует сырые данные Lucene). Этот вариант представляет собой хорошее соотношение между экономией пропускной способности сети и дополнительными ресурсами процессора, необходимыми для сжатия и распаковки. Этот вариант является по умолчанию.
true
Все запросы транспорта сжимаются. Этот вариант может быть лучше, чем indexing_data с точки зрения пропускной способности сети, но потребует наибольших вычислений процессора для сжатия и распаковки.
transport.compression_scheme
(Статический, строка) Настраивает схему сжатия для запросов, которые выбраны для сжатия по настройке transport.compress. Принимает либо deflate, либо lz4, которые предлагают различные компромиссы между коэффициентом сжатия и использованием процессора. Elasticsearch будет использовать ту же схему сжатия для ответов, что и для соответствующих запросов. По умолчанию lz4.
transport.tcp.keep_alive
(Статический, булево) Настраивает опцию SO_KEEPALIVE для транспортных сокетов, которая определяет, отправляют ли они зонды TCP keepalive. По умолчанию network.tcp.keep_alive.
transport.tcp.keep_idle
(Статический, целое число) Настраивает опцию TCP_KEEPIDLE для транспортных сокетов, которая определяет время в секундах, в течение которого соединение должно быть бездействующим, прежде чем начать отправлять зонды TCP keepalive. По умолчанию network.tcp.keep_idle, если установлено, или системное значение по умолчанию в противном случае. Это значение не может превышать 300 секунд. В случаях, когда системное значение по умолчанию выше, чем 300, значение автоматически уменьшается до 300. Применимо только к Linux и macOS.
transport.tcp.keep_interval
(Статический, целое число) Настраивает опцию TCP_KEEPINTVL для транспортных сокетов, которая определяет время в секундах между отправкой зондов TCP keepalive. По умолчанию network.tcp.keep_interval, если установлено, или системное значение по умолчанию в противном случае. Это значение не может превышать 300 секунд. В случаях, когда системное значение по умолчанию выше, чем 300, значение автоматически уменьшается до 300. Применимо только к Linux и macOS.
transport.tcp.keep_count
(Статический, целое число) Настраивает опцию TCP_KEEPCNT для транспортных сокетов, которая определяет количество неоповещённых зондов TCP keepalive, которые могут быть отправлены по соединению, прежде чем оно будет закрыто. По умолчанию network.tcp.keep_count, если установлено, или системное значение по умолчанию в противном случае. Применимо только к Linux и macOS.
transport.tcp.no_delay
(Статический, булево) Настраивает опцию TCP_NODELAY на транспортных сокетах, которая определяет, включён ли алгоритм TCP no delay. По умолчанию true.
transport.tcp.reuse_address
(Статический, булево) Настраивает опцию SO_REUSEADDR для сетевых сокетов, которая определяет, можно ли повторно использовать адрес или нет. По умолчанию network.tcp.reuse_address.
transport.tcp.send_buffer_size
(Статический, значение в байтах) Размер буфера TCP отправки для транспортного трафика. По умолчанию network.tcp.send_buffer_size.
transport.tcp.receive_buffer_size
(Статический, значение в байтах) Размер буфера TCP приёма для транспортного трафика. По умолчанию network.tcp.receive_buffer_size.
transport.ping_schedule
(Статический, значение времени) Настраивает время между отправкой пингов уровня приложения по всем транспортным соединениям для быстрого обнаружения сбоя транспортного соединения. По умолчанию -1, что означает, что пинги уровня приложения не отправляются. Вместо пингов уровня приложения следует использовать TCP keepalive (см. transport.tcp.keep_alive), если это возможно.

Профили транспорта

Elasticsearch позволяет вам привязываться к нескольким портам на разных интерфейсах с помощью профилей транспорта. Рассмотрите пример конфигурации.

transport.profiles.default.port: 9300-9400
transport.profiles.default.bind_host: 10.0.0.1
transport.profiles.client.port: 9500-9600
transport.profiles.client.bind_host: 192.168.0.1
transport.profiles.dmz.port: 9700-9800
transport.profiles.dmz.bind_host: 172.16.1.2

Профиль default является специальным. Он используется в качестве резервного варианта для любых других профилей, если в них не установлены конкретные настройки, и именно так этот узел подключается к другим узлам в кластере. Другие профили могут иметь любое имя и могут быть использованы для настройки определённых конечных точек для входящих соединений.

Следующие параметры можно настроить для каждого профиля транспорта, как показано в примере выше:

  • port: Порт, к которому нужно привязаться.
  • bind_host: Хост, к которому нужно привязаться.
  • publish_host: Хост, который публикуется в информационных API.

Профили также поддерживают все другие настройки транспорта, указанные в разделе настройки транспорта, и используют их в качестве значений по умолчанию. Например, transport.profiles.client.tcp.reuse_address можно настроить явно, а в противном случае используется значение по умолчанию transport.tcp.reuse_address.

Длительные соединения в режиме ожидания

Транспортное соединение между двумя узлами состоит из ряда долгоживущих TCP-соединений, некоторые из которых могут находиться в режиме ожидания в течение длительного времени. Тем не менее, Elasticsearch требует, чтобы эти соединения оставались открытыми, и может нарушить работу кластера, если любые межузловые соединения будут закрыты внешним влиянием, например, брандмауэром. Важно настроить свою сеть для сохранения длительных соединений в режиме ожидания между узлами Elasticsearch, например, оставив *.tcp.keep_alive включённым и убедившись, что интервал keepalive меньше любого таймаута, который может привести к закрытию соединений в режиме ожидания, или установив transport.ping_schedule, если keepalive нельзя настроить. Устройства, которые разрывают соединения, когда они достигают определённого возраста, являются распространённой причиной проблем для кластеров Elasticsearch и не должны использоваться.

Если узел Elasticsearch временно не может обрабатывать сетевой трафик, он может прекратить чтение данных из сети и опубликовать окно TCP нулевой длины своим узлам-партнёрам, чтобы они приостановили передачу данных недоступному узлу. Это стандартный механизм обратной задержки, встроенный в TCP. Когда узел снова станет доступным, он возобновит чтение из сети. Настройте свою сеть так, чтобы TCP-соединения могли существовать в этом приостановленном состоянии без прерываний. Не накладывайте никаких ограничений на длительность пребывания соединения в этом приостановленном состоянии.

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

Сжатие запросов

По умолчанию параметр конфигурации transport.compress indexing_data будет сжимать только запросы, относящиеся к передаче исходных данных индексации в сыром виде между узлами. Этот параметр главным образом сжимает данные, отправляемые во время ingest, ccr и восстановления фрагментов. Это по умолчанию имеет смысл для локального кластерного взаимодействия, поскольку сжатие сырых документов значительно уменьшает использование сетевого трафика между узлами с минимальным влиянием на ЦП.

Параметр transport.compress всегда настраивает сжатие запросов локального кластера и является параметром по умолчанию для сжатия запросов удалённого кластера. Если вы хотите настроить сжатие запросов удалённого кластера иначе, чем сжатие локальных запросов, вы можете настроить его для каждого удалённого кластера, используя параметр cluster.remote.${cluster_alias}.transport.compress.

Сжатие ответов

Параметры сжатия не настраивают сжатие ответов. Elasticsearch будет сжимать ответ, если входящий запрос был сжат — даже если сжатие не включено. Аналогично, Elasticsearch не будет сжимать ответ, если входящий запрос не был сжат — даже если сжатие включено. Схема сжатия, используемая для сжатия ответа, будет такой же, как и у удалённого узла, использовавшейся для сжатия запроса.

Дополнительные параметры удалённого кластера (модель на основе API-ключа)

Используйте следующие дополнительные параметры для конфигурации интерфейса удалённого кластера (модель на основе API-ключа) независимо от транспортного интерфейса. Вы также можете настроить оба интерфейса вместе, используя параметры сети.

remote_cluster_server.enabled
(Статический, boolean) Определяет, должен ли сервер удалённого кластера быть включён. Этот параметр должен быть true для remote_cluster.port и всех последующих параметров удалённого кластера, чтобы они вступили в силу. Его включение позволяет кластеру обрабатывать межкластерные запросы с использованием модели на основе API-ключа. По умолчанию false.
remote_cluster.host

(Статический, string) Устанавливает адрес этого узла для трафика сервера удалённого кластера. Узел будет привязан к этому адресу и также будет использовать его как адрес публикации сервера удалённого кластера. Принимает IP-адрес, имя хоста или специальное значение. Используйте этот параметр только если вам требуются разные конфигурации для сервера удалённого кластера и транспортных интерфейсов.

По умолчанию адрес, заданный transport.bind_host.

remote_cluster.bind_host
(Статический, string) Сетевой адрес(а), к которому должен быть привязан узел для прослушивания входящих соединений удалённого кластера. Принимает список IP-адресов, имён хостов и специальных значений. По умолчанию адрес, заданный remote_cluster.host. Используйте этот параметр только если требуется привязка к нескольким адресам или использование разных адресов для публикации и привязки, а также если требуются разные конфигурации привязки для сервера удалённого кластера и транспортных интерфейсов.
remote_cluster.publish_host
(Статический, string) Сетевой адрес, по которому узел может быть доступен для других узлов. Принимает IP-адрес, имя хоста или специальное значение. По умолчанию адрес, заданный remote_cluster.host. Используйте этот параметр только если требуется привязка к нескольким адресам или использование разных адресов для публикации и привязки, а также если требуются разные конфигурации привязки для сервера удалённого кластера и транспортных интерфейсов.
remote_cluster.publish_port
(Статический, integer) Порт адреса публикации сервера удалённого кластера. Установите этот параметр только если вам нужен порт публикации, отличный от remote_cluster.port. По умолчанию порт, назначенный с помощью remote_cluster.port.
remote_cluster.tcp.keep_alive
(Статический, boolean) Конфигурирует параметр SO_KEEPALIVE для сокетов удалённого кластера, определяющий, отправляют ли они TCP-зондирования keepalive. По умолчанию transport.tcp.keep_alive.
remote_cluster.tcp.keep_idle
(Статический, integer) Конфигурирует параметр TCP_KEEPIDLE для транспортных сокетов, определяющий время в секундах, в течение которого соединение должно находиться в режиме ожидания перед отправкой TCP-зондирований keepalive. По умолчанию transport.tcp.keep_idle, если установлено, или системное значение по умолчанию в противном случае. Это значение не может превышать 300 секунд. В случаях, когда системное значение по умолчанию выше, чем 300, значение автоматически понижается до 300. Применимо только к Linux и macOS.
remote_cluster.tcp.keep_interval
(Статический, integer) Конфигурирует параметр TCP_KEEPINTVL для транспортных сокетов, определяющий время в секундах между отправкой TCP-зондирований keepalive. По умолчанию transport.tcp.keep_interval, если установлено, или системное значение по умолчанию в противном случае. Это значение не может превышать 300 секунд. В случаях, когда системное значение по умолчанию выше, чем 300, значение автоматически понижается до 300. Применимо только к Linux и macOS.
remote_cluster.tcp.keep_count
(Статический, integer) Конфигурирует параметр TCP_KEEPCNT для транспортных сокетов, определяющий количество неопознанных TCP-зондирований keepalive, которые могут быть отправлены по соединению перед его разрывом. По умолчанию transport.tcp.keep_count, если установлено, или системное значение по умолчанию в противном случае. Применимо только к Linux и macOS.
remote_cluster.tcp.no_delay
(Статический, boolean) Конфигурирует параметр TCP_NODELAY для транспортных сокетов, определяющий, включен ли алгоритм Nagla. По умолчанию transport.tcp.no_delay.
remote_cluster.tcp.reuse_address
(Статический, boolean) Конфигурирует параметр SO_REUSEADDR для сетевых сокетов, определяющий, может ли адрес быть повторно использован. По умолчанию transport.tcp.reuse_address.
remote_cluster.tcp.send_buffer_size
(Статический, значение байта) Размер буфера отправки TCP для транспортного трафика. По умолчанию transport.tcp.send_buffer_size.
remote_cluster.tcp.receive_buffer_size
(Статический, значение байта) Размер буфера приема TCP для транспортного трафика. По умолчанию transport.tcp.receive_buffer_size.

Отслеживание запросов

Вы можете отслеживать отдельные запросы, выполненные на уровнях HTTP и транспорта.

Отслеживание может генерировать чрезвычайно большой объем логов, что может дестабилизировать кластер. Не включайте отслеживание запросов в загруженных или важных кластерах.

Трейсер запросов REST

Уровень HTTP имеет специализированный трейсер, который регистрирует входящие запросы и соответствующие исходящие ответы. Активируйте трейсер, установив уровень логгера org.elasticsearch.http.HttpTracer в значение TRACE:

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.http.HttpTracer": "TRACE"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      "logger.org.elasticsearch.http.HttpTracer": 'TRACE'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.http.HttpTracer": "TRACE",
  },
});
console.log(response);
PUT _cluster/settings
{
   "persistent" : {
      "logger.org.elasticsearch.http.HttpTracer" : "TRACE"
   }
}

Вы также можете контролировать, какие URI будут отслеживаться, используя набор шаблонов подстановки для включения и исключения. По умолчанию отслеживаются все запросы.

resp = client.cluster.put_settings(
    persistent={
        "http.tracer.include": "*",
        "http.tracer.exclude": ""
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'http.tracer.include' => '*',
      'http.tracer.exclude' => ''
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "http.tracer.include": "*",
    "http.tracer.exclude": "",
  },
});
console.log(response);
PUT _cluster/settings
{
   "persistent" : {
      "http.tracer.include" : "*",
      "http.tracer.exclude" : ""
   }
}

По умолчанию трейсер регистрирует сводку каждого запроса и ответа, соответствующего этим фильтрам. Чтобы записывать также тело каждого запроса и ответа, установите системную переменную es.insecure_network_trace_enabled в значение true, а затем установите уровни логгеров org.elasticsearch.http.HttpTracer и org.elasticsearch.http.HttpBodyTracer в значение TRACE:

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.http.HttpTracer": "TRACE",
        "logger.org.elasticsearch.http.HttpBodyTracer": "TRACE"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      "logger.org.elasticsearch.http.HttpTracer": 'TRACE',
      "logger.org.elasticsearch.http.HttpBodyTracer": 'TRACE'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.http.HttpTracer": "TRACE",
    "logger.org.elasticsearch.http.HttpBodyTracer": "TRACE",
  },
});
console.log(response);
PUT _cluster/settings
{
   "persistent" : {
      "logger.org.elasticsearch.http.HttpTracer" : "TRACE",
      "logger.org.elasticsearch.http.HttpBodyTracer" : "TRACE"
   }
}

Каждое тело сообщения сжимается, кодируется и разбивается на фрагменты, чтобы избежать обрезки:

[TRACE][o.e.h.HttpBodyTracer     ] [master] [276] response body [part 1]: H4sIAAAAAAAA/9...
[TRACE][o.e.h.HttpBodyTracer     ] [master] [276] response body [part 2]: 2oJ93QyYLWWhcD...
[TRACE][o.e.h.HttpBodyTracer     ] [master] [276] response body (gzip compressed, base64-encoded, and split into 2 parts on preceding log lines)

Каждый фрагмент снабжается внутренним идентификатором запроса ([276] в данном примере), который вы должны использовать для сопоставления фрагментов с соответствующими строками сводки. Для восстановления выходных данных выполните декодирование данных в base64 и разархивируйте их, используя gzip. Например, в системах Unix-подобных системах:

cat httptrace.log | sed -e 's/.*://' | base64 --decode | gzip --decompress

Тела запросов и ответов HTTP могут содержать конфиденциальную информацию, например, учетные данные и ключи, поэтому отслеживание тел HTTP отключено по умолчанию. Вы должны явно включить его на каждом узле, установив системную переменную es.insecure_network_trace_enabled в значение true. Эта функция предназначена в первую очередь для тестовых систем, не содержащих конфиденциальной информации. Если вы установите эту переменную в системе, содержащей конфиденциальную информацию, необходимо защитить свои логи от несанкционированного доступа.

Трейсер транспорта

Уровень транспорта имеет специализированный трейсер, который регистрирует входящие и исходящие запросы и ответы. Активируйте трейсер, установив уровень логгера org.elasticsearch.transport.TransportService.tracer в значение TRACE:

resp = client.cluster.put_settings(
    persistent={
        "logger.org.elasticsearch.transport.TransportService.tracer": "TRACE"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      "logger.org.elasticsearch.transport.TransportService.tracer": 'TRACE'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "logger.org.elasticsearch.transport.TransportService.tracer": "TRACE",
  },
});
console.log(response);
PUT _cluster/settings
{
   "persistent" : {
      "logger.org.elasticsearch.transport.TransportService.tracer" : "TRACE"
   }
}

Вы также можете контролировать, какие действия будут отслеживаться, используя набор шаблонов подстановки для включения и исключения. По умолчанию все запросы будут отслеживаться, за исключением пингов обнаружения сбоев:

resp = client.cluster.put_settings(
    persistent={
        "transport.tracer.include": "*",
        "transport.tracer.exclude": "internal:coordination/fault_detection/*"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'transport.tracer.include' => '*',
      'transport.tracer.exclude' => 'internal:coordination/fault_detection/*'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "transport.tracer.include": "*",
    "transport.tracer.exclude": "internal:coordination/fault_detection/*",
  },
});
console.log(response);
PUT _cluster/settings
{
   "persistent" : {
      "transport.tracer.include" : "*",
      "transport.tracer.exclude" : "internal:coordination/fault_detection/*"
   }
}

Модель потоков для сетевого взаимодействия

В этом разделе описывается модель потоков, используемая сетевым подсистемой Elasticsearch. Эта информация не требуется для использования Elasticsearch, но может быть полезной для продвинутых пользователей, диагностирующих сетевые проблемы в кластере.

Узлы Elasticsearch обмениваются данными через набор TCP-каналов, которые вместе образуют транспортное соединение. Клиенты Elasticsearch взаимодействуют с кластером через HTTP, который также использует один или несколько TCP-каналов. Каждый из этих TCP-каналов принадлежит ровно одному из transport_worker потоков в узле. Этот владеющий поток выбирается при открытии канала и остается неизменным на протяжении всего жизненного цикла канала.

Каждый transport_worker поток несет полную ответственность за отправку и получение данных через каналы, которыми он владеет. Кроме того, каждый сокет HTTP и транспортного сервера назначается одному из transport_worker потоков. Этот рабочий поток отвечает за прием новых входящих подключений к сокету сервера, которым он владеет.

Если поток в Elasticsearch хочет отправить данные через определенный канал, он передает данные владеющему transport_worker потоку для фактической передачи.

Обычно transport_worker потоки не полностью обрабатывают получаемые ими сообщения. Вместо этого они выполняют небольшую предварительную обработку и затем перенаправляют (передают) сообщение в другой пул потоков для дальнейшей обработки. Например, сообщения bulk перенаправляются в write пул потоков, запросы поиска — в один из search пулов потоков, а запросы на статистику и другие задачи управления — в основном в management пул потоков. Однако в некоторых случаях обработка сообщения ожидается настолько быстрой, что Elasticsearch выполнит всю обработку в transport_worker потоке, а не тратит время на его перенаправление.

По умолчанию существует один transport_worker поток на процессор. В отличие от этого, иногда может быть десятки и тысячи TCP-каналов. Если данные поступают по TCP-каналу, и владеющий transport_worker поток занят, данные не обрабатываются, пока поток не закончит текущую работу. Аналогично, исходящие данные не отправляются по каналу, пока владеющий transport_worker поток свободен. Это означает, что каждый transport_worker поток должен часто быть в состоянии ожидания. Незанятый transport_worker поток может выглядеть примерно так в дампе стека:

"elasticsearch[instance-0000000004][transport_worker][T#1]" #32 daemon prio=5 os_prio=0 cpu=9645.94ms elapsed=501.63s tid=0x00007fb83b6307f0 nid=0x1c4 runnable  [0x00007fb7b8ffe000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.EPoll.wait(java.base@17.0.2/Native Method)
	at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@17.0.2/EPollSelectorImpl.java:118)
	at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@17.0.2/SelectorImpl.java:129)
	- locked <0x00000000c443c518> (a sun.nio.ch.Util$2)
	- locked <0x00000000c38f7700> (a sun.nio.ch.EPollSelectorImpl)
	at sun.nio.ch.SelectorImpl.select(java.base@17.0.2/SelectorImpl.java:146)
	at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:813)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at java.lang.Thread.run(java.base@17.0.2/Thread.java:833)

В API горячих потоков узлов незанятый transport_worker поток отображается следующим образом:

   0.0% [cpu=0.0%, idle=100.0%] (500ms out of 500ms) cpu usage by thread 'elasticsearch[instance-0000000004][transport_worker][T#1]'
     10/10 snapshots sharing following 9 elements
       java.base@17.0.2/sun.nio.ch.EPoll.wait(Native Method)
       java.base@17.0.2/sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:118)
       java.base@17.0.2/sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:129)
       java.base@17.0.2/sun.nio.ch.SelectorImpl.select(SelectorImpl.java:146)
       io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:813)
       io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460)
       io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
       io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
       java.base@17.0.2/java.lang.Thread.run(Thread.java:833)

Обратите внимание, что transport_worker потоки всегда должны быть в состоянии RUNNABLE, даже при ожидании ввода, потому что они блокируются в методе native EPoll#wait. Время idle= показывает долю времени, которую поток потратил на ожидание ввода, а время cpu= показывает долю времени, потраченного потоком на обработку полученного ввода.

Если transport_worker поток не часто находится в состоянии ожидания, может образоваться очередь необработанных задач. Это может привести к задержкам при обработке сообщений по каналам, которыми он владеет. Сложно точно предсказать, какая работа будет задержана:

  • Каналов намного больше, чем потоков. Если работа, связанная с одним каналом, вызывает задержки в рабочем потоке, все другие каналы, которыми владеет этот поток, также будут испытывать задержки.
  • Сопоставление TCP-каналов с рабочими потоками фиксировано, но произвольно. Каждый канал назначается владеющему потоку в режиме round-robin при открытии канала. Каждый рабочий поток отвечает за многие разные типы каналов.
  • Между каждой парой узлов открыто много каналов. Для каждого запроса Elasticsearch будет выбирать из соответствующих каналов в режиме round-robin. Некоторые запросы могут оказаться на канале, которым владеет задержанный рабочий поток, в то время как другие идентичные запросы будут отправлены по работающему каналу.

Если очередь станет слишком большой, некоторые сообщения могут задержаться на много секунд. Узел может даже провалить проверки работоспособности и быть удален из кластера. Иногда можно найти доказательства занятых transport_worker потоков с помощью API горячих потоков узлов. Однако этот API сам отправляет сетевые сообщения, поэтому он может работать неправильно, если transport_worker потоки слишком заняты. Наиболее надежно использовать jstack для получения дампов стека или Java Flight Recorder для получения профилирующего трассировки. Эти инструменты независимы от любой работы, выполняемой JVM.

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

org.elasticsearch.transport.InboundHandler
Этот логгер выводит предупреждение, если обработка входящего сообщения занимает сетевой поток необоснованно долго, что почти наверняка является ошибкой. Предупреждение содержит информацию, которую можно использовать для идентификации сообщения, обработка которого заняла необоснованно много времени.
org.elasticsearch.transport.OutboundHandler
Этот логгер выводит предупреждение, если отправка исходящего сообщения занимает больше времени, чем ожидалось. Этот интервал включает время ожидания устранения сетевой загрузки и время обработки другой работы в том же сетевом потоке, поэтому не всегда указывает на наличие ошибки, связанной с исходящим сообщением, указанным в записи лога.
org.elasticsearch.common.network.ThreadWatchdog

Этот логгер выводит предупреждение и дамп потока, когда замечает, что сетевой поток не добился прогресса между двумя последовательными проверками, что, по всей видимости, является ошибкой:

[WARN ][o.e.c.n.ThreadWatchdog   ] the following threads are active but did not make progress in the preceding [5s]: [elasticsearch[instance-0000000004][transport_worker][T#1]]]
[WARN ][o.e.c.n.ThreadWatchdog   ] hot threads dump due to active threads not making progress [part 1]: H4sIAAAAAAAA/+1aa2/bOBb93l8hYLUYFWgYvWw5AQbYpEkn6STZbJyiwAwGA1qiY8US6ZJUHvPr90qk/JJky41TtDMuUIci...
[WARN ][o.e.c.n.ThreadWatchdog   ] hot threads dump due to active threads not making progress [part 2]: LfXL/x70a3eL8ve6Ral74ZBrp5x7HmUD9KXQz1MaXUNfFC6SeEysxSw1cNXL9JXYl3AigAE7ywbm/AZ+ll3Ox4qXJHNjVr6h...
[WARN ][o.e.c.n.ThreadWatchdog   ] hot threads dump due to active threads not making progress (gzip compressed, base64-encoded, and split into 2 parts on preceding log lines; ...

Для восстановления дампа потока выполните декодирование данных из base64 и разархивируйте их с помощью gzip. Например, в системах Unix-подобных:

cat watchdog.log | sed -e 's/.*://' | base64 --decode | gzip --decompress

Этот механизм можно настроить с помощью следующих настроек:

network.thread.watchdog.interval
(Статический, значение времени) Определяет интервал между проверками сторожа. По умолчанию 5s. Установите в 0, чтобы отключить сетевого сторожа.
network.thread.watchdog.quiet_time
(Статический, значение времени) Определяет интервал между предупреждениями сторожа. По умолчанию 10m.

Порт готовности TCP

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

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

Чтобы включить порт готовности TCP, используйте настройку readiness.port. Сервис готовности будет привязываться ко всем адресам хоста.

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

Успешное подключение к порту готовности TCP сигнализирует о том, что узел Elasticsearch готов. При подключении клиента к порту готовности сервер просто закрывает сокетное соединение. Клиенту не отправляются данные. Если клиент не может подключиться к порту готовности, узел не готов.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/modules-network.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API