Я пытаюсь подключиться с экземпляра 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. Это похоже на маленькое облачко в их облаке. Вы можете использовать свой собственный виртуальный маршрутизатор, и они попытаются разместить серверы для вас, поэтому в основном они находятся очень физически близко (если не в одной стойке).