Skip to content

阿里云 slb 的一些行为 #9

@inetfuture

Description

@inetfuture

引言

了解阿里云 slb 的一些行为可以帮助后端服务性能调优。

下文的示例中:

  • slb IP 为 116.62.90.87
  • slb 后端 ecs IP 为 192.168.1.155,简称 155 。
  • 同一网络内还有一台 ecs ,公网 IP 116.62.63.160 ,内网 IP 192.168.1.156,简称 156,这个并没有加到 slb 的后端列表,用来作为客户端。
  • 100 开头的 IP 都是 slb 的。

七层负载均衡

请求路径:156 => slb => 155,155 上就是一个简单的 nginx 。

slb 到 ecs 是长连接还是短连接

健康检查和请求代理都是短连接(Connection: close),连接由服务端主动关闭。

下图是健康检查的抓包:

screen shot 2017-04-27 at 10 28 57
screen shot 2017-04-27 at 10 35 33

注意,健康检查是 HEAD 请求,而且是 HTTP 1.0 ,HTTP 1.0 是不支持长连接的(至少规范没有明确定义),所以响应给的是 Connection: close

下图是请求代理的抓包:

screen shot 2017-04-27 at 10 42 56
screen shot 2017-04-27 at 10 40 24

请求里明确带了 Connection: close (HTTP 1.1 中的默认值是 keep-alive)。这个与客户端是怎么请求 slb 的无关,slb 都是以此种方式请求后端服务的。

另外,可以看到请求的 X-Forwarded-For header 里携带了客户端的 IP 。

slb 是一台机器吗

不是,是一个集群,如下图,IP 是在变的:

screen shot 2017-04-27 at 10 46 24

客户端到 slb 是长连接还是短连接

slb 遵守 HTTP 规范,所以取决于客户端如何请求。

例如,在 156 上使用 curl http://116.62.90.87/test1 http://116.62.90.87/test2 测试,抓包如下:


可以看到客户端没有使用 Connection header ,根据规范,默认值是 keep-alive ,所以 slb 返回了 Connection: keep-alive ,并保持连接打开,第二个请求重用了 TCP 连接。最后 curl 命令退出,客户端主动关闭了连接。

四层负载均衡

TCP 包到后端用的谁的 IP

客户端的,非 slb 的。

抓包如下图:

slb 会抹掉 TCP 包的 timestamp 吗

不会,抓包如下:

在客户端抓的,请求包的 timestamp 为 46264167

在后端 ecs 抓的,可以看到 timestamp 跟上面一样,没有发生变化。

参考资料

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions