Назад | Перейти на главную страницу

Соединение зависает и никогда не соединяется между экземплярами ec2 через порт 9200; быстро извне AWS

Я пытаюсь подключиться с экземпляра EC2 веб-сервера к экземпляру ec2 сервера ElasticSearch. Соединение медленное или отсутствует при подключении с EC2, но очень быстрое при подключении с обычного компьютера (не в AWS).

Если я сделаю запрос со своего ноутбука, он быстро:

laptop:~ jordan$ time curl -vvv search.example.org:9200
* About to connect() to search.example.org port 9200 (#0)
*   Trying 1.2.3.4... connected
* Connected to search.example.org (1.2.3.4) port 9200 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8y zlib/1.2.3
> Host: search.example.org:9200
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=UTF-8
< Content-Length: 294
< 
… snip …
* Connection #0 to host search.example.org left intact
* Closing connection #0

real    0m0.071s
user    0m0.004s
sys 0m0.005s
laptop:~ jordan$ 

Из экземпляра EC2 запрос сначала пробует один экземпляр из балансировщика нагрузки:

[jordan@ip-5-6-7-8 ~]$ time curl -vvv search.example.org:9200
* Rebuilt URL to: search.example.org:9200/
* Hostname was NOT found in DNS cache
*   Trying 1.2.3.4...

Затем он пробует другой экземпляр:

* connect to 1.2.3.4 port 9200 failed: Connection timed out
*   Trying 9.10.11.12...

Прежде чем полностью отказаться:

* connect to 9.10.11.12 port 9200 failed: Connection timed out
* Failed to connect to search.example.org port 9200: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to search.example.org port 9200: Connection timed out

Когда я смотрю на статистику своего ELB, он показывает несколько «Ошибок подключения к бэкэнду».

Обратите внимание, что search.example.org это домен, указывающий на ELB. Но, если я запрашиваю экземпляр, на который он указывает, он все равно обнаруживает тайм-аут соединения:

[jordan@ip-5-6-7-8 ~]$ time curl -vvv ec2-40-41-42-43.compute-1.amazonaws.com:9200
* Rebuilt URL to: ec2-40-41-42-43.compute-1.amazonaws.com:9200/
* Hostname was NOT found in DNS cache
*   Trying 40.41.42.43...

И все еще быстро из местоположения, отличного от EC2:

laptop:~ jordan$ time curl -vvv ec2-40-41-42-43.compute-1.amazonaws.com:9200
* About to connect() to ec2-40-41-42-43.compute-1.amazonaws.com port 9200 (#0)
*   Trying 40.41.42.43... connected
* Connected to ec2-40-41-42-43.compute-1.amazonaws.com (40.41.42.43) port 9200 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8y zlib/1.2.3
> Host: ec2-40-41-42-43.compute-1.amazonaws.com:9200
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=UTF-8
< Content-Length: 294
< 
… snip …
* Connection #0 to host ec2-54-85-45-128.compute-1.amazonaws.com left intact
* Closing connection #0

real    0m0.864s
user    0m0.006s
sys 0m0.011s
laptop:~ jordan$ 

у меня есть nginx работает на search сервер, и доступ к нему из любого места, включая другой экземпляр EC2, также выполняется быстро. Так что, похоже, это происходит исключительно в том случае, если я пытаюсь получить доступ к порту 9200. Обратите внимание, что все упомянутые серверы находятся в общей группе безопасности, которая включает входящий доступ к порту 9200.

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

AWS оптимизирует соединения, идущие снаружи, а не изнутри внутрь. Если вы используете общедоступные IP-адреса, которые он вам дает, вероятно, ваше соединение покидает AWS (или, по крайней мере, достигает граничного маршрутизатора), а затем направляется обратно в AWS.

Если у вас есть 2 внутренних экземпляра, используйте частный IP. Затем соединения проходят между локальными коммутаторами (это немного упрощено, потому что 2 сервера все еще могут быть очень далеко).

Если вы по-прежнему видите низкую производительность, проверьте размеры своих экземпляров ... маленькие и микросхемы имеют очень плохую задержку. Наконец, вы можете создать VPC. Это похоже на маленькое облачко в их облаке. Вы можете использовать свой собственный виртуальный маршрутизатор, и они попытаются разместить серверы для вас, поэтому в основном они находятся очень физически близко (если не в одной стойке).