多层SLB架构中会话保持和分流获取客户真实IP

一、故障问题描述


    由于外层SLB和内层SLB配置问题,导致了后端的APP集群分流不均,甚至只有某一台有流量。经过反复的测试最终实现会话保持和分流。

二、架构


    外网slb---nginx---内网slb---app server


三、基本原理


  1. slb的tcp模式,是基于访问IP进行负载分配的;会话保持基于IP地址,将同一IP地址的请求转发到同一台后端云服务器处理。
  2. slb的http模式,是基于http请求中进行负载分配的;会话保持基于cookie,“植入cookie”模式通过增加一个名为serverID的cookie来标识请求与后端服务器的对应关系。

所以:

  1. 内层slb不能用tcp,因为只识别了nginx的IP。
  2. 所以内层只能使用http。如果需要会话保持,需要在内层设置,才能锚定app server。
  3. 不能使用两层http且同时打开“植入cookie”会话保持。因为cookie字段名一样,会相互覆盖。(如果这个字段名是随机,或者自定义的,就没这种问题了。)


四、调试过程


原始配置


  • 外网 slb : https 443 ----http 443 【开启会话保持】
  • nginx : 443 ----8080 【正常】
  • 内网slb : tcp 8080 --- tcp 8080【开启会话保持】

问题

所有访问都在一台,偶尔在两台上。 因为内网slb使用tcp,识别的是nginx的IP,所以后端APP无法获得访问客户真实IP。


配置2


  • 外网 slb : https 443 ----http 443 【开启会话保持】
  • nginx : 443 ----8080
  • 内网slb : http 8080 --- http 8080【开启会话保持】

问题

流量均匀分布,但无法会话保持。同一个客户端访问,一会儿在A机器,一会在B机器。 原因后来知道是两层http植入cookie,外层cookie覆盖了内层cookie,导致内层slb获取到的cookie无法定位到后端app机器。


配置3


  • 外网 slb : tcp 80 ----tcp 80 【开启会话保持】
  • nginx : 80 ----8080
  • 内网slb : http 8080 --- http 8080【开启会话保持】

问题

流量均匀,会话保持。但没有了ssl。


配置4


  • 外网 slb : tcp 8443 ----tcp 8443 【开启会话保持】
  • nginx : 8443 ----8080 +ssl on
  • 内网slb : http 8080 --- http 8080【开启会话保持】

问题

因为tcp无法增加ssl,就在nginx中增加了ssl。通过nginx的ip可以访问,但外部slb无法访问到nginx。原因未知。


配置5


  • 外网 slb : https 443 ----http 443 【关闭会话保持】
  • nginx : 443 ----8080
  • 内网slb : http 8080 --- http 8080【开启会话保持】

通过


内层http通过植入cookie锁定了request与app server的对应关系。外层http不改动cookie。外层http提供ssl。