一、故障问题描述
由于外层SLB和内层SLB配置问题,导致了后端的APP集群分流不均,甚至只有某一台有流量。经过反复的测试最终实现会话保持和分流。
二、架构
外网slb---nginx---内网slb---app server
三、基本原理
- slb的tcp模式,是基于访问IP进行负载分配的;会话保持基于IP地址,将同一IP地址的请求转发到同一台后端云服务器处理。
- slb的http模式,是基于http请求中进行负载分配的;会话保持基于cookie,“植入cookie”模式通过增加一个名为serverID的cookie来标识请求与后端服务器的对应关系。
所以:
- 内层slb不能用tcp,因为只识别了nginx的IP。
- 所以内层只能使用http。如果需要会话保持,需要在内层设置,才能锚定app server。
- 不能使用两层http且同时打开“植入cookie”会话保持。因为cookie字段名一样,会相互覆盖。(如果这个字段名是随机,或者自定义的,就没这种问题了。)
四、调试过程
原始配置
问题
所有访问都在一台,偶尔在两台上。 因为内网slb使用tcp,识别的是nginx的IP,所以后端APP无法获得访问客户真实IP。
配置2
问题
流量均匀分布,但无法会话保持。同一个客户端访问,一会儿在A机器,一会在B机器。 原因后来知道是两层http植入cookie,外层cookie覆盖了内层cookie,导致内层slb获取到的cookie无法定位到后端app机器。
配置3
问题
流量均匀,会话保持。但没有了ssl。
配置4
问题
因为tcp无法增加ssl,就在nginx中增加了ssl。通过nginx的ip可以访问,但外部slb无法访问到nginx。原因未知。
配置5
通过
内层http通过植入cookie锁定了request与app server的对应关系。外层http不改动cookie。外层http提供ssl。