【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(七) - 负载均衡及高可用

7. 负载均衡及高可用

7.1 本节目标

  1. 理解spine leaf网络下,服务高可用及负载均衡原理;
  2. 学习在leaf交换机和服务器上进行相关配置;

7.2 方案对比

在二层网络中,长长采用主备的方式保证服务的高可用,而spine leaf网络下则是采用多活的方式,克服了在全三层网络中不能使用keepalived等HA软件的缺陷,还且实现了负载均衡和高可用。

7.2.1 主备方式

 

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(七) - 负载均衡及高可用_第1张图片

如上图所示,再二层网络中,服务依靠keepalived选举出master和slave节点,vip(浮动ip)始终只在master节点上存在,交换机对vip的流量也是进行二层转发,向vip发起请求的流量都只会发送到master节点,slave节点不负载流量。当master节点不可用时,触发keepalived重新选举,slave被提升为master节点,vip随之漂移到新的master节点上,新的master节点开始接受vip的流量,实现了服务的高可用,然而在主备切换过程中,可能会出现网络闪断或服务短时间不可用的现象。

7.2.2 多活方式

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(七) - 负载均衡及高可用_第2张图片

如上图所示,在spine leaf网络下,服务所在的两个节点上都配置了vip,路由器上为vip配了两条ECMP等价路由,下一跳分别指向服务所在的两个节点,这样,向vip发起请求的流量就会以负载均衡的方式发送到了两个节点。当其中一个节点不可用时,路由器自动删除相应的路由条目,使流量只发往健康的节点,也保证了高可用,且不会由于单一节点的故障而造成业务闪断。

下面我们就介绍一下在spine leaf网络下如何根据不同场景,来配置服务的多活。

7.3 多活应用场景讨论

7.3.1 应用场景1 - 服务位于物理节点

要求

  1. 在devopsr01n01和devopsr01n02两台物理机上装有PGPOOL;
  2. 这两个PGPOOL以多活(而不是主备)的方式,同时对客户端提供服务;

拓扑

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(七) - 负载均衡及高可用_第3张图片

方案说明

  1. PGPOOL服务暴露一个vip(virtual ip)给客户端用于连接;
  2. 由于两个物理节点需要以多活的方式提供服务,因此需要在两个物理节点上都配置这个vip;
  3. 在服务所在物理节点(devopsr01n01,devopsr01n02)所接的一对leaf交换机(leaf01/02)上,配置目标为vip静态路由,以ECMP方式设置下一跳为两个PGPOOL节点;

配置

  1. 在物理节点上配置vip,用于PGPOOL服务;

    ip address add 10.10.30.21/32 dev br0  	# 设vip为 10.10.30.21/32, 在两个pgpool节点上都配置该ip地址, 掩码为32位
  2. 在leaf交换机上配置等价路由

    # 在leaf01/02上同样配置
    ip route 10.10.30.21/32 10.10.10.21
    ip route 10.10.30.21/32 10.10.10.22
  3.   同前面两节中,需要判断路由有效性一样,需要在两个leaf交换机的PingCheck的脚本中加入下面内容

    # /mnt/flash/pingcheck/failed_3.conf
    no ip route 10.10.30.21/32 10.10.10.21
    
    # /mnt/flash/pingcheck/failed_4.conf
    no ip route 10.10.30.21/32 10.10.10.22
    
    # /mnt/flash/pingcheck/recover_3.conf
    ip route 10.10.30.21/32 10.10.10.21
    
    # /mnt/flash/pingcheck/recover_4.conf
    ip route 10.10.30.21/32 10.10.10.22

7.3.2 应用场景2 - 服务位于虚拟节点

要求

  1. 在ks1和ks2两台VM装有proxy服务;
  2. 这两个proxy以多活(而不是主备)的方式,同时对客户端提供服务;

拓扑

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(七) - 负载均衡及高可用_第4张图片

方案说明

  1. proxy服务暴露一个vip(virtual ip)给客户端用于连接;
  2. 由于两个proxy节点需要以多活的方式提供服务,因此需要在两个VM上都配置这个vip;
  3. 在服务所在VM(KS1,KS2)的宿主机所接的一对leaf交换机(leaf01/02)上,配置目标为vip静态路由,以ECMP方式设置下一跳为两个VM节点;
  4. 在VM的宿主机上配置到vip的路由,并根据VM的健康状态切换vip的路由;

配置

  1. 在VM上配置proxy服务的vip, 设为10.10.40.21

    # 在ks1/2上都配置proxy服务的vip
    ip address add 10.10.40.21/32 dev eth0
  2. 在宿主机上配置到vip的路由,由于vip在VM上, 可通过br0直接到达,因此在宿主机上将vip指向br0即可, 下一跳可以设为VM的业务ip,以devopsr01n01为例:

    ip route replace 10.10.40.21/32 via 10.10.20.21 dev br0
  3. 试想这样一种情形, 虚拟节点ks2宕机, devopsr01n01需要连接proxy服务,此时ks2应当向ks1上的proxy服务发起请求,然而,当devopsr01n01查询自己的路由表,发现proxy的vip指向了br0, 于是将请求发往了br0, 而永远也无法到达ks1,从而发生故障,因此,在devopsr01n01物理节点上,需要根据位于本物理节点上的proxy服务所在VM(ks2)的健康状态,来决定proxy vip的路由选择, 当ks2健康时,将proxy vip路由指向br0, 否则,使prxoy vip使用默认路由,发往leaf交换机,由交换机为proxy vip选择路由, 此处使用crontab运行脚本来实现健康检查及路由选择,以devopsr01n01为例,脚本如下:

    # 健康检查及路由切换脚本 /tmp/toggle_proxy_route.sh, 每3s检查ks1的状态,进行相应的路由切换
    #!/bin/bash
    for ((i=1; i<=20; i++))
    do
        ping -c 1 10.10.20.21 -w 1
        if [[ $? == 0 ]];then
            ip route replace 10.10.40.21/32 via 10.10.20.21 dev br0
        else
            ip route del 10.10.40.21/32 via 10.10.20.21 dev br0
        fi
        sleep 3
    done
  4. 在devopsr01n02上,按例进行配置即可。
  5. 在leaf交换机上进行相应配置,与应用场景1相似,在交换机上添加ECMP路由,并加入路由有效性判断即可

    # 在leaf01/02上配置
    ip route 10.10.40.21/32 10.10.20.21
    ip route 10.10.40.21/32 10.10.20.22
    
    # 加入路由有效性判断
    # /mnt/flash/pingcheck/failed_3.conf			# 检查进程为proxy服务所在物理节点对应的PingCheck进程
    no ip route 10.10.40.21/32 10.10.20.21          # 此处目标地址为proxy服务vip, 下一跳为proxy服务所在VM的业务ip地址
    
    # /mnt/flash/pingcheck/failed_4.conf
    no ip route 10.10.40.21/32 10.10.20.22
    
    # /mnt/flash/pingcheck/recover_3.conf
    ip route 10.10.30.41/32 10.10.20.21
    
    # /mnt/flash/pingcheck/recover_4.conf
    ip route 10.10.30.41/32 10.10.20.22

     

7.4 小结

本节介绍了spine leaf网络下,以多活的方式提供服务的原理及相关配置,并分别讨论了服务位于虚拟节点和物理节点上两种场景。

 

上一节: 叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(六) - 虚拟机路由方案及配置

你可能感兴趣的:(网络)