我正在使用它来平衡和删除 http/https 集群中的失败实例,但注意到当与真实服务器的连接挂起时,ldirectord 永远不会将它们标记为静止,尽管如果连接被拒绝或无法建立(例如实例关闭或 nginx 停止),它会立即标记它们。
在这种情况下,这有点问题,因为服务器是云实例,偶尔会完全挂起,并使用应用服务器堆栈,偶尔会陷入无限循环直到重新启动;这两种情况都会导致连接挂起。
以下是 /etc/ha.d conf 的一个示例:
negotiatetimeout = 1
checkinterval = 1
quiescent = yes
fallback = 127.0.0.1
emailalert = "[email protected]"
virtual = <vip 1>:80
protocol = tcp
scheduler = wlc
real = <real ip 1>:80 ipip 5
real = <real ip 2>:80 ipip 5
[more reals]
checktype = negotiate
request = "/node-status"
receive = "OK"
virtual = <vip 2>:443
protocol = tcp
scheduler = wlc
real = <real ip 1>:443 ipip 5
real = <real ip 2>:443 ipip 5
[more reals]
checktype = negotiate
request = "/node-status"
receive = "OK"
一个平衡器是 Ubuntu 10.10,另一个是 10.04.2,两者上的 ldirectord 都是 1.186-ha。
请注意,这个 2002 线程暗示 ldirectord 当时没有捕获挂起的连接:http://archive.linuxvirtualserver.org/html/lvs-users/2002-05/msg00163.html
更新
请注意,当我试图解决这个问题时,上述时间是激进的,通常它们会更高,并且包括失败次数,但我发现上面和下面的设置都存在问题:
negotiatetimeout = 2
checkinterval = 2
failurecount = 5
此外,ldirectord 的日志文件不会显示任何在实际服务器上发生此类“中断”之前或期间的条目。但如果 http 服务或实例本身在“挂起”期间关闭,ipvsadm 和日志文件的显示会立即正确显示 IP 处于静止状态。
而且,当我说“服务器挂起”时,我的意思是整个(云)实例没有响应,所有连接尝试最终都会超时(ping,ssh,http等等)并且控制台也是如此。
不幸的是,我还没有找到导致服务器陷入这种状态的任何问题(服务器挂起和堆栈无限循环)的根本原因,所以我无法(暂时)根据需要重现这种情况。
答案1
我不确定,但使用 request & accept 时不需要“service=http”指令吗?您是否尝试过不使用 request/receive 而改用 checktype=connect?或者您所说的“服务器挂起”到底是什么意思?连接超时?您能添加日志文件吗?例如 logfile="/var/log/ldirectord_vhost.log"
一般情况下设置 checktimeout=10(不确定这里的默认值是多少)