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

Я пытаюсь подключиться с экземпляра веб-сервера EC2 к экземпляру ElasticSearch server ec2. При подключении с 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-адрес. Однако я бы предпочел не создавать внутренний балансировщик нагрузки, если я могу решить эту проблему другим способом.

1 ответ

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

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

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

Другие вопросы по тегам