Мы запускаем Logstash на сервере, который отправляет журналы в кластер Elasticsearch. В журналах Logstash мы видим, что он теряет соединение с серверами Elasticsearch с ошибкой сброса соединения. Мы видим это между всеми нашими экземплярами logstash и elasticsearch на всех серверах. В этом примере мы видим, что logstash3 (192.168.1.133) теряет соединение с elasticsearch4 (192.168.1.88)
[2018-08-21T20:21:21,414][WARN ][logstash.outputs.elasticsearch] Marking url as dead. Last error: [LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError] Elasticsearch Unreachable: [http://elasticsearch4:9200/][Manticore::SocketException] Connection reset {:url=>http://elasticsearch4:9200/, :error_message=>"Elasticsearch Unreachable: [http://elasticsearch4:9200/][Manticore::SocketException] Connection reset", :error_class=>"LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError"}
Заглянув в системный журнал, мы видим, что UFW блокирует пакет за несколько секунд до этого:
Aug 21 20:21:03 logstash3 kernel: [1760565.386970] [UFW BLOCK] IN=enp0s31f6 OUT= MAC=90:1b:0e:cc:50:95:30:b6:4f:d8:05:51:08:00 SRC=192.168.1.88 DST=192.168.1.133 LEN=40 TOS=0x0 PREC=0x00 TTL=57 ID=442 DF PROTO=TCP SPT=9200 DPT=59338 WINDOW=0 RES=0x00 RST URGP=0
У нас есть правило в ufw, разрешающее все соединения между этими серверами. Первоначально мы просто разрешали определенные порты, но я открыл его для всех портов на случай, если это было проблемой. Правило, разрешающее подключения:
logstash3:~$ sudo ufw status | grep '\.88'
Anywhere ALLOW 192.168.1.88
Если мы перезапустим logstash, эти разорванные соединения исчезнут на время (~ 1 час), но затем начнут повторяться.
Поскольку мы видим, что это начинает происходить через некоторое время, я склонен думать, что это где-то переполняется очередь. Соединение не прекращается, мы просто начинаем время от времени терять пакеты. Я подумал, что это может быть связано с отслеживанием соединений, но мы не видим никаких журналов по этому поводу. Мы увеличили conntrack_max
ранее, поскольку мы видели в этом проблему, но в данном случае это не помогает.
elasticsearch4:~$ cat /proc/sys/net/nf_conntrack_max
262144
Нет свидетельств каких-либо общих отбрасываний пакетов:
logstash3:~$ ifconfig
enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.133 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 2a01:4f8:121:53b7::2 prefixlen 64 scopeid 0x0<global>
inet6 fe80::921b:eff:fecc:5095 prefixlen 64 scopeid 0x20<link>
ether 90:1b:0e:cc:50:95 txqueuelen 1000 (Ethernet)
RX packets 7746452399 bytes 8566845158411 (8.5 TB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5792178105 bytes 5164493104253 (5.1 TB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 16 memory 0xef000000-ef020000
По совету @Lenniey я попытался отключить UFW и посмотреть, видим ли мы все еще ошибки в журналах logstash. Я отключил ufw на нескольких серверах и увидел, что мы все еще Connection reset
сообщения в журналах между серверами с отключенным ufw, поэтому кажется, что записи ufw в syslog могут быть симптомом, а не причиной.
Я произвел захват пакета (sudo tcpdump -i enp0s31f6 -s 65535 -w logstash.pcap 'port 9200'
) пока мы видели ошибку
[2018-08-23T07:20:11,108][WARN ][logstash.outputs.elasticsearch] Marking url as dead. Last error: [LogStash::Outputs::ElasticSearch::
HttpClient :: Pool :: HostUnreachableError] Недоступен Elasticsearch: [http: // elasticsearch3: 9200 /] [Manticore :: Socket Исключение] Сброс подключения {: url =>http: // elasticsearch3: 9200 /,: error_message => «Elasticsearch недоступен: [http: // elasticsearch3: 9200 /] [Manticore :: SocketException] Сброс соединения»,: error_class => «LogStash :: Outputs :: ElasticSe arch :: HttpClient :: Pool :: HostUnreachableError "}
В захвате пакета я вижу, что elasticsearch отвечает с ошибкой 400:
HTTP/1.0 400 Bad Request
content-type: application/json; charset=UTF-8
content-length: 203
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "text is empty (possibly HTTP/0.9)"
}
],
"type": "illegal_argument_exception",
"reason": "text is empty (possibly HTTP/0.9)"
},
"status": 400
}
Затем я вижу 5 пакетов TCP RST от elasticsearch до logstash. Последний пакет RST был в 07:20:11.107663
, что соответствует времени ошибки logstash, 07:20:11,108
.
Я нахожу захват пакетов немного запутанным. Я отфильтровал захват пакетов до IP-адресов рассматриваемого сервера logstash и ES, а также до портов, на которых мы видим 400 и RST, однако до 400, похоже, есть _bulk
выполняется запрос, затем ответ 414 во время запроса в середине _bulk
запрос, затем _bulk
запрос продолжается, затем мы получаем 400:
Logstash -> ES
POST /_bulk HTTP/1.1
Connection: Keep-Alive
Content-Type: application/json
Content-Length: 167481062
Host: elasticsearch3.channelgrabber.com:9200
User-Agent: Manticore 0.6.1
Accept-Encoding: gzip,deflate
{ ... data ... }
ES -> Logstash
HTTP/1.1 413 Request Entity Too Large
content-length: 0
Logstash -> ES
{ ... data continues ... }
ES -> Logstash
HTTP/1.0 400 Bad Request
content-type: application/json; charset=UTF-8
content-length: 203
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"text is empty (possibly HTTP/0.9)"}],"type":"illegal_argument_exception","reason":"text is empty (possibly HTTP/0.9)"},"status":400}
Есть ли какие-нибудь предложения о том, на что еще мне следует обратить внимание?