haproxy的tcplog或httplog提供了一个"termination_state"字段,这个字段提供了一个session是如何中断的指示器。在tcplog中是2个字符,在httplog中是4个字符, 通常我们初步定位故障是用前两个字符。
该含义表示什么事件导致了session中断:
该字符表示当session被关闭时,该session当时所处的状态:
haproxy的log记录了每个request的相关信息,典型的HTTP log格式如下:
2019-07-06 15:48:12.503 localhost haproxy [pid:29670]info 30.8.3.100:49858 [06/Jul/2019:15:48:10.953] karbor_8799~ b_def_karbor_8799/controller1 34/0/95/1420/1550 200 473 - - ---- 5/5/5/5/0 0/0 "GET /v1/9b47d36a3ee44b42b45caf70b90f82f4/protection_capabilities HTTP/1.1"
下面对每个字段进行相关的说明:
30.8.3.100:49858
是client的IP地址和端口。根据配置的不同,这个IP可能是上级proxy的IP或是client的真实IP。[06/Jul/2019:15:48:10.953]
是TCP连接被打开的时间,之后的其他timer是基于这个时间的。karbor_8799~
HTTP request请求的frontend名称,也就是配置文件中定义的名称。b_def_karbor_8799/controller1
处理请求的backend(b_def_karbor_8799)名称和真正处理请求的server(controller1),也就是在配置文件中定义的。34/0/95/1420/1550
几个timer,这是查故障的重点关注对象,下一节详细说明。200
HTTP响应状态码473
发送给client的Bytes数,包括headers。5/5/5/5/0
在记录log这一时刻的队列状态,后面详细说明。0/0
这个表示request何时进入的backend/server队列,排在这个request之前有多少个请求需要被处理。日志如下:
Nov 26 07:08:16 localhost haproxy[20695]: 127.0.0.1:39508 [26/Nov/2015:07:08:16.154] http http/ -1/-1/-1/-1/410 400 187 - - PR-- 0/0/0/0/0 0/0 ""
说明request很可能没有被haproxy处理,可能问题出在haproxy的frontend配置或者是client到haproxy的网络有问题。
(-1/-1/-1/-1/410)
这几个timer的数值揭示了可能的原因。数值"-1"说明了request没有到达相应的阶段就被终止了。第一个"-1"说明HTTP request header还没有被完全接收完毕之前,连接就断掉了。另外""可以看到这个连接没有被任何backend服务器处理。
日志如下:
Nov 26 07:21:52 localhost haproxy[20695]: 127.0.0.1:41150 [26/Nov/2015:07:21:45.446] http app/app13 7476/0/1/4/7481 302 638 - - ---- 0/0/0/0/0 0/0 "GET / HTTP/1.1"
注意7476这个数值,即7476ms,超过了7s的时间。这表明上层proxy和haproxy之间网络连接可能有问题。通常来说HTTP头非常小,正常情况下一个TCP包就可以容纳,接收一个HTTP header不可能需要这么久。
例如:10/0/30/69/109
这些数字就是haproxy内部的timer,单位是ms,以下是依次详细说明:
当log中的Tr的值很高的时候,通常意味着问题出在了server这一边。为了进一步排查问题,在haproxy上已经不行了,需要到server服务器上去查找原因。如果server响应非常慢,那么可能你会看到队列计数器的值也跟着增加了。
例如:1/1/1/1/0
这个数值是当时队列状态的快照,以下是依次详细说明:
有时候我们可以需要通过在haproxy的日志中增加header的打印,来定位问题,具体操作如下:在frontend的配置中增加:
frontend http-in
...
capture request header Host len 20
capture request header Referer len 60
...
比如我在http的request的headers中增加了时间戳,在haproxy中则可以通过设置获取到
7d36a3ee44b42b45caf70b90f82f4/quotas HTTP/1.1"
2019-07-02 20:40:56.374 localhost haproxy [pid:113]info 30.8.3.100:52808 [02/Jul/2019:20:40:56.282] karbor_8799~ b_def_karbor_8799/controller1 7/0/48/35/90 200 269 - - ---- 2/2/2/2/0 0/0 {1562092915762} "GET /v1/9b47d36a3ee44b42b45caf70b90f82f4/checkpoint_items/count?resource_type=OS::Nova::Server&resource_type=OS::Ironic::BareMetalServer HTTP/1.1"
2019-07-02 20:40:56.390 localhost haproxy [pid:113]info 30.8.3.100:52806 [02/Jul/2019:20:40:56.273] karbor_8799~ b_def_karbor_8799/controller1 10/0/40/64/115 200 9467 - - ---- 1/1/1/1/0 0/0 {1562092915760} "GET /v1/9b47d36a3ee44b42b45caf70b90f82f4/checkpoint_items?resource_type=OS::Nova::Server&resource_type=OS::Ironic::BareMetalServer&limit=10 HTTP/1.1"