连接挂起并且无法通过端口 9200 在 EC2 实例之间建立连接;从 AWS 外部快速连接

连接挂起并且无法通过端口 9200 在 EC2 实例之间建立连接;从 AWS 外部快速连接

我正在尝试从 Web 服务器 EC2 实例连接到 ElasticSearch 服务器 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。它就像是他们云中的一小片云。您可以使用自己的虚拟路由器,他们会尝试为您共置服务器,因此基本上它们在物理上非常接近(如果不在同一个机架中)。

相关内容