企业运维训练营之云上网络原理与实践课程
第二讲 负载均衡CLB(中)- 最佳实践
视频地址:
https://developer.aliyun.com/learning/course/991/detail/14970
一、 负载均衡CLB典型使用场景
1. 海量访问流量分发:负载均衡SLB作为业务流量入口处理超高并发流量。
海量访问流量分发
2. 多层次容灾架构:DNS跨地域部署和双AZ多活实现不同层次的业务容灾。
多层次容灾架构
无论是业务上直接把域名解析为CLB地址,还是使用DNS进行轮询,通过多个A记录将流量分批转发给不同的实例,CLB在拓扑架构中都处于比较靠近入口处的设备。
二、 存储日志
开启访问日志及健康检查日志:
日志存储在日志服务云产品中,通过控制台可以进行条件筛选,获得相应的结果,简单,实时,弹性。
三、 配置监控
1. 使用HTTPS监听
- HTTP 1.0:增加Header、状态码,增加HEAD、POST方法,默认TCP短连接;
- HTTP 1.1:默认TCP长连接,支持Range,支持伪管道传输(Pipeline),增加了Host头;
- HTTP 2.0:基于二进制格式,支持多路复用,全双工通信;
- HTTP 3.0 (GQUIC):基于UDP,强制加密;
另外,CLB提供HTTP重定向到HTTPS的功能,部分高级功能依赖HTTPS (如HTTP2、WebSocket),因此建议尽可能使用HTTPS,将证书可托管在CLB。
2. 配置报警规则
使用云监控配置报警规则,重点关注:
时序类报警:
- 实例维度:后端不健康服务器数量;
- 4层监听维度:丢弃连接、丢弃数据包、出入流量;
- 7层监听维度:5xx(服务端异常)、4xx状态码(客户端异常)、XXX
事件类报警:
- 7层监听:证书到期提醒(提前N天)
3. 获取客户端真实IP
在不同的监听下,获取客户端真实的IP地址的方式不同,如下图:
- IPv4四层监听
- 通过toa可直接获取到客户端真实IP
- 可通过Proxy Protocol获取客户端真实IP
- IPv6四层监听
- 可通过Proxy Protocol获取客户端真实IP
- 七层监听
- 通过请求头中的x-forwarded-for获取客户端真实IP
通过toa获取客户端真实IP
目标IP为VPC下绑定了EIP的SLB,五元组如下:
120.195.13.68:12345-TCP->123.56.169.153:443
TCP三次握手第三个ACK包的完整十六进制dump,加粗部分即为完整的TCP Option:
0000 00 16 3e 34 07 96 58 60 5f 72 1e 00 08 00 45 14
0010 00 3c ac a3 40 00 2f 06 e9 7b 64 79 b8 15 0a 19
0020 8e e1 7c da 01 bb 88 77 6a 56 ad 5c bc aa a0 10
0030 00 e5 35 62 00 00 fc 14 30 39 78 c3 0d 44 19 70
0040 09 00 c0 a8 00 5b 01 bb 01 01
依次为:
TCP Option Kind==252(0xfc)
长度(从Kind开始算):20字节(0x14)
客户端源端口: 12345->30 39(网络字节序/大端)
客户端IP地址:120.195.13.68->78 c3 0d 44
VPC TunnelID:618521->19 70 09 00(主机字节序/小端)
vip: 192.168.0.91->c0 a8 00 5b
vport: 443->01 bb (网络字节序/大端)
通过Proxy Protocol获取客户端真实IP
五元组:120.195.13.68.34270-TCP->47.98.108.43.10086
0000 00 16 3e 12 90 f5 ee ff ff ff ff ff 08 00 45 00
0010 00 8c 7a b7 40 00 66 06 49 cb 78 c3 0d 44 c0 a8
0020 09 3a 85 de 01 bb 10 a9 24 18 c2 df 78 02 50 18
0030 13 88 64 6f 00 00 0d 0a Od 0a 00 Od 0a 51 55 49
0040 54 0a 21 11 00 54 78 c3 0d 44 2f 62 6c 2b 85 de
0050 27 66 03 00 04 8a 65 79 c5 04 00 3e 0o 00 00 00
0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090 00 00 00 00 00 00 00 00 00 00
从加粗的第0x36个字节开始,是TCP的payload(加粗部分),接下去就是:
1.12个字节是Proxy Protocol的固定签名:
\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A
2.4bit的版本号,这里是0x2,意为V2的版本
3.4bit的command,这里是0x1,意为Proxy(0x0==Local)
4.4bit的地址族,这里是0x1,意为AF_INET(IPv4),其余的为0x0// AF_UNSPEC 0x2 // AF_INET6(IPv6)0x3 //AF_UNIX
5.4bit的transport protocol,提示接下去是哪一种传输层的协议,这里是0x1,意为STREAM(TCP),其余的为0x0 //UNSPEC 0x2 // DGRAM(UDP)
6.2字节表明接下去的长度,网络字节序,这里是0x0054==84,说明接下去的84字节都是PP本身的payload(斜体部分)
7.4字节的源IP,78 c3 0d 44 转换成点分十进制即为120.195.13.68
8.4字节的目标IP,2f 62 6c 2b 转换成点分十进制即为47.98.108.43
9.2字节的源端口,网络字节序,0x85de==34270
10.2字节的目标端口,网络字节序,0x2766==10086
通过请求头中的x-forwarded-for获取真实客户端IP
在后端ECS上抓包,打印请求头中包含以下key-value:
X-Forwarded-For: 用户真实IP,代理服务器1-IP,代理服务器2-IP,……