ArangoDB无法连接

时间:2015-09-13 13:39:35

标签: arangodb

arangod正在运行一段时间没有任何问题,但在某些时候不能再建立连接。 然后aranogsh显示以下错误消息:

  

错误消息'无法连接到' tcp://127.0.0.1:8529' ' connect()失败,#99 - 无法分配请求的地址''

在日志文件中,arangod仍会写入更多的跟踪信息。

重新启动aranogd后,它再次运行没有问题,直到问题突然再次发生。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

由于这个问题在时间上得到了回答,我将使用这个答案来详细说明如何深入研究这种情况,并对要查看的操作系统参数进行有价值的分析。我将它建立在linux目标上。

首先,我们需要找出当前正在使用netstat工具作为root用户的事情(我们只关心tcp端口):

netstat -alnpt
Proto Recv-Q Send-Q Local Address     Foreign Address    State       PID/Program name
...
tcp        0      0 0.0.0.0:8529      0.0.0.0:*          LISTEN      3478/arangod
tcp        0      0 127.0.0.1:45218   127.0.0.1:8529     ESTABLISHED 6902/arangosh
tcp        1      0 127.0.0.1:46985   127.0.0.1:8529     CLOSE_WAIT  485/arangosh

我们看到了3个可能值组的概述:

  • LISTEN:这些是为远程端提供tcp服务的守护进程,在这种情况下是arangod进程及其服务器套接字。它在系统的所有可用ipv4地址(8529)上绑定端口0.0.0.0,并接受来自任何远程位置的连接(0.0.0.0:*
  • ESTABLISHED:在arangosharangod之间,这是一个有效的tcp连接; Arangosh的客户端端口(45218)位于更高的范围内,连接端口8529上的arangod。
  • CLOSE_WAIT:这是终止状态下的连接。拥有它们是正常的。操作系统的TCP堆栈会让它们保持一段时间,以便知道在哪里对可能已经发送的杂散TCP包进行排序,但是没有按时生成。

如您所见,TCP端口是16位无符号整数,范围从065535。服务器套接字从较低端开始,并且大多数操作系统要求进程以root身份运行以绑定低于1024的端口。客户端套接字从上端开始,并在客户端范围内下调到指定的限制。由于多个客户端可以连接一个服务器,而服务器端口范围似乎很窄,它通常是客户端端口磨损。如果客户端经常关闭并重新打开连接,您可能会看到许多套接字处于CLOSE_WAIT状态,正如网络提示中的许多讨论一样,这些是您的系统最终耗尽资源的症状。通常,此问题的解决方案是通过keepalive功能重新使用现有连接。

由于the solaris ndd command彻底解释了它可以修改哪些参数以及solaris内核中的哪些后果,所以这里解释的术语对于tcp套接字是相当通用的,并且可以通过其他方式在许多其他操作系统上找到;在linux中 - 我们专注于此 - 通过/proc/sys/net - 文件系统。

有一些有价值的开关:

  • ipv4/ip_local_port_range这是本地套接字的范围。您可以尝试缩小范围,并使用arangob --keep-alive false来探索如果您的系统耗尽这些内容会发生什么。
  • time wait(通常缩写为tw)是控制TCP-Stack应该对CLOSE_WAIT状态中已经关闭的套接字执行的操作的部分。 Linux内核可以在这里做一些技巧 - 它可以立即重新使用该状态下的连接进行新连接。 Vincent Bernat explains very nicely which screws to turn and what the differnt parameters in the kernel mean.

因此,一旦您决定更改/proc中的某些值,以便主机更好地扩展到给定的情况,您需要让它们持续重启 - 因为/ proc是易变的并且不会记住值重新启动。

因此,大多数Linux系统都提供/etc/sysctl.[d|conf]文件;它将proc文件系统中的斜杠映射到点,因此/proc/sys/net/ipv4/tcp_tw_reuse将转换为net.ipv4.tcp_tw_reuse