ArangoDB无法连接

ArangoDB无法连接,arangodb,Arangodb,arangod已经运行了一段时间,没有任何问题,但在某个时候无法建立更多的连接。 aranogsh随后显示以下错误消息: 错误消息“无法连接到”tcp://127.0.0.1:8529“”connect()因#99失败-无法分配请求的地址“” 在日志文件中,arangod仍会写入更多跟踪信息 重新启动aranogd后,它再次正常运行,直到问题再次出现 为什么会发生这种情况?因为这个问题是由时间来回答的,所以我将用这个答案详细说明如何深入研究这种情况,并对要查看的操作系统参数进行有价值的分析。我将

arangod已经运行了一段时间,没有任何问题,但在某个时候无法建立更多的连接。 aranogsh随后显示以下错误消息:

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

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

重新启动aranogd后,它再次正常运行,直到问题再次出现


为什么会发生这种情况?

因为这个问题是由时间来回答的,所以我将用这个答案详细说明如何深入研究这种情况,并对要查看的操作系统参数进行有价值的分析。我将以linux目标为基础

首先,我们需要了解以root用户身份使用
netstat
工具当前正在进行的操作(我们只关心tcp端口):

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

  • LISTEN
    :这些是为远程终端提供tcp服务的守护进程,在本例中是带有服务器套接字的
    arangod
    进程。它绑定系统所有可用ipv4地址(
    0.0.0.0
    )上的端口
    8529
    ),并接受来自任何远程位置的连接(
    0.0.0:
  • 已建立
    :在这种情况下,这是
    arangosh
    arangod
    之间的活动tcp连接;Arangosh的客户端端口(
    45218
    )位于更高的范围内,连接端口
    8529
    上的arangod
  • CLOSE\u WAIT
    :这是一个处于终止状态的连接。拥有它们是正常的。操作系统的TCP堆栈让他们保持了一段时间,以便知道在何处对可能已发送但未及时发送的散乱TCP包进行排序
如您所见,TCP端口是16位无符号整数,范围从
0
65535
。服务器套接字从低端开始,大多数操作系统要求进程以根用户身份运行,以绑定1024以下的端口。客户端套接字从客户端的上端开始,一直到客户端上的指定限制。由于多个客户端可以连接一台服务器,而服务器端口范围似乎很窄,因此通常是客户端端口磨损。如果客户端频繁关闭并重新打开连接,您可能会看到许多套接字处于
CLOSE\u WAIT
状态,正如网络上的许多讨论所暗示的那样,这些都是系统最终耗尽资源的症状。通常,此问题的解决方案是通过
keepalive
功能重新使用现有连接

正如在solaris内核中透彻地解释了它可能修改哪些参数并产生哪些后果一样,这里解释的术语对于tcp套接字来说是相当通用的,并且可能以其他方式在许多其他操作系统上找到;在linux中—我们在这里重点介绍—通过
/proc/sys/net
—文件系统

一些有价值的开关有:

  • ipv4/ip\本地\端口\范围
    这是本地套接字的范围。您可以尝试缩小它的范围,并使用
    arangob--keep alive false
    来探索如果您的系统耗尽这些资源会发生什么
  • time wait
    (通常短至
    tw
    )是控制TCP堆栈在
    CLOSE\u wait
    状态下对已关闭的套接字应执行的操作的部分。Linux内核可以在这里做一个技巧——它可以立即重用处于该状态的连接来创建新的连接。文森特·伯纳特
因此,一旦您决定更改
/proc
中的某些值,以便您的主机更好地适应给定的情况,您就需要让它们持久地重新启动—因为/proc是易变的,在重新启动时不会记住值


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

您能否提供更多的上下文信息,例如您在哪个平台上使用的ArangoDB的哪个版本,以及在无法进行进一步连接时有关工作负载的一些信息。此外,在无法建立连接后,arangod在日志文件中记录了哪些跟踪信息?您还可以确认arangod进程仍在运行,但无法建立进一步的连接吗?我做了一些分析,发现当arangod处于静止状态时,它总是挂起FIN_WAIT2(netstat)上的一个端口。在目前运行的系统版本2.6.7中,关于Node.js和Java client的视图是erfolgen。是否有可能系统当时没有临时端口?例如,当您为每个请求建立新连接时,操作系统将为每个连接分配一个新的临时端口。如果在短时间内建立大量新连接,系统可能会耗尽临时端口。如果是这种情况,则问题应在一段时间后自动消失,具体取决于TCP堆栈配置。您是否可以检查是否总是建立新连接,或者是否使用某种可以重用现有连接的连接池?您是否还可以检查是否使用HTTP/1.1并保持连接的活动状态?使用HTTP/1.1和Keep-Alive将是有益的,至少与HTTP 1.0和不使用Keep-Alive相比是如此。当然,为了从Keep-Alive中获益,在客户端重用连接是有意义的。连接使用Keep-Alive的时间为1000毫秒。我计算了netstat上打开的端口数,当挂起时,端口数在20到100之间。操作系统是debian。
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