我已将haproxy配置为通过server-template
指向领事DNS(SRV)创建后端服务器:
resolvers foo
nameserver consul 127.0.0.1:8600
resolve_retries 30
timeout retry 2s
hold valid 10s
accepted_payload_size 8192
backend bar
mode http
balance roundrobin
server-template bar 50 _bar.service.consul.myorg.internal check port 8080 inter 5s rise 2 fall 3 resolvers foo resolve-prefer ipv4
在检查show servers state
时,我发现haproxy中有一些非常老的服务器,其srv_op_state = SRV_ST_STOPPED和srv_time_since_last_change =〜19天。这些服务器是在几天前销毁的,不再从dig _bar.service.consul.myorg.internal SRV;
请求中返回,但是由于某些原因,它们仍处于haproxy状态。
这表现出预期的效果(例如,由于运行状况检查失败,haproxy不会将流量路由到该路由),直到不可避免地重用了srv_addr为止。如果新服务器不是“ bar”应用程序,但恰好通过了运行状况检查,则haproxy会将“ bar”请求路由到该应用程序,这会导致问题,因为新服务器无法正确处理“ bar”请求。
当服务器不再处于领事DNS中时,如何使haproxy将其从状态中删除?
编辑:将服务器模板的大小设置为1并使用新IP(领事DNS中SRV记录正确的)重新创建服务后,haproxy状态将继续反映单个旧的不正常服务器。
编辑2:使用第7层HTTP运行状况检查(option httpchk GET /health HTTP/1.1\r\nHost:\ haproxy
)导致服务器模板生成的服务器更新其地址以匹配领事的DNS。
编辑3:将服务器模板大小增加到50,启动10个正确注册到DNS的服务正常实例,并终止5个实例(导致运行状况检查失败)之后,haproxy将关闭的服务器存储为{{ 1}}似乎是无限期的。是否有任何自动机制使haproxy驱逐这些服务器,以使恰好在同一地址启动并通过运行状况检查的另一服务不会错误地处理流量?