高并发负载均衡

11/23/2020 LVSKeepalived

# 负载均衡

# 七层负载均衡

nginx是基于反向代理的负载均衡,做了三次握手

image-20210629141110991

# 四层负载均衡

请求到达传输控制层的时候只是看了一下端口号,做数据包转发,并没有走三次握手

image-20210628152920340

image-20210628233401765

# 负载均衡的模式

# D-NAT(目标地址转换)

image-20210628230346601

  • 非对称的
    • 发送数据包小,回复的数据包大

# DR(直接路由模式)

image-20210628231108849

  • 如何隐藏VIP

    image-20210629003028772

    对外隐藏,对内可见

    kernel parameter: 目标mac地址为全F,交换机触发广播 /proc/sys/net/ipv4/conf/IF/ arp_ignore: 定义接收到ARP请求时的响应级别; 0:只要本地配置的有相应地址,就给予响应; 1:仅在请求的目标(MAC)地址配置请求 到达的接口上的时候,才给予响应;

    arp_announce:定义将自己地址向外通告时的通告级别; 0:将本地任何接口上的任何地址向外通告; 1:试图仅向目标网络通告与其网络匹配的地址; 2:仅向与本地接口上地址匹配的网络进行通告;

# TUN(隧道技术 )

image-20210628234002218

  • DIP->RIP数据包背上CIP->VIP
  • VPN

# LVS

Linux内核集成了LVS叫ipvs模块,管理程序ipvsadmin

# 调度算法

# 静态调度方法

  • rr

    轮循

  • wrr

    加权轮询,根据权重轮询

  • dh:

  • sh:

# 动态调度方法

  • lc: 最少连接

  • wlc: 加权最少连接

  • sed: 最短期望延迟

  • nq: never queue

  • LBLC: 基于本地的最少连接

  • DH:

  • LBLCR: 基于本地的带复制功能的最少连接

# 如何知道哪个负载机负载了多少?

偷窥——只看不动手

偷窥握手和分手包信息,对负载机的负载进行管理

# LVS搭建

  • 安装管理程序

    yum install ipvsadmin -y
    
    1

# LVS配置

  • 管理集群服务

    • 添加:-A -t|u|f service-address [-s scheduler] -t: TCP协议的集群 -u: UDP协议的集群 service-address: IP:PORT -f: FWM: 防火墙标记 service-address: Mark Number
    • 修改:-E
    • 删除:-D -t|u|f service-address
    ipvsadm -A -t 192.168.9.100:80 -s rr
    
    1
  • 管理集群服务中的RS

    • 添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight] -t|u|f service-address:事先定义好的某集群服务 -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;

      [-g|i|m] : LVS类型

      -g: DR -i: TUN -m: NAT

      [ -w weight] 定义服务器权重

      ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
      ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
      
      1
      2
    • 修改:-e

    • 删除:-d -t|u|f service-address -r server-address

    • 查看 -L|l -n: 数字格式显示主机地址和端口 --stats:统计数据 --rate: 速率 --timeout: 显示tcp、tcpfin和udp的会话超时时长 -:c 显示当前的ipvs连接状况

    • 删除所有集群服务 -C:清空ipvs规则

    • 保存规则 -S

      ipvsadm -S > /path/to/somefile
      
      1
    • 载入此前的规则: -R

      ipvsadm -R < /path/form/somefile
      
      1

# LVS实验

# 拓扑图

image-20210629103629542

# 配置网络

  • node01

    ifconfig eth0:8 192.168.150.100/24
    
    1
  • node02 & node03

    • 修改内核协议

      cd /proc/sys/net/ipv4/conf/
      cd eth0
      echo 1 > arp_ignore
      echo 2 > arp_annonce
      cd ../all
      echo 1 > arp_ignore
      echo 2 > arp_annonce
      
      1
      2
      3
      4
      5
      6
      7
    • 设置隐藏的vip

      ifconfig lo2 192.168.150.100 netmark **255.255.255.255**
      #ifconfig lo2 down
      
      1
      2

# 安装启动服务

  • node02~node03:

    yum install httpd -y
    service httpd start
    vi   /var/www/html/index.html
    # from 192.168.150.1x
    
    1
    2
    3
    4

# LVS服务配置

  • node01:

    yum install ipvsadm
    ipvsadm -A  -t  192.168.150.100:80  -s rr
    ipvsadm -a  -t 192.168.150.100:80  -r  192.168.150.12 -g -w 1
    ipvsadm -a  -t 192.168.150.100:80  -r  192.168.150.13 -g -w 1
    ipvsadm -ln
    
    1
    2
    3
    4
    5

# 验证

​ 浏览器访问 192.168.150.100 看到负载 疯狂F5 ​ node01: ​ netstat -natp 结论看不到socket连接 ​ node02~node03: ​ netstat -natp 结论看到很多的socket连接 ​ node01: ​ ipvsadm -lnc 查看偷窥记录本 ​ TCP 00:57 FIN_WAIT 192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80 ​ FIN_WAIT: 连接过,偷窥了所有的包 ​ SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题

# 高用用

# 故障点

# lvs单点问题

  • 影响

    业务下线

  • 解决


# RS(Real Server)故障

  • 影响

    部分部分用户请求异常,lvs还存有这个rs的负载记录

  • 如何判断故障

    访问一下,返回200 ok ,底层验证的是应用层的http协议

# 解决方案分析

  • 单点问题

    一变多

    • 主备

      如何判断主挂了?

      • 方向性
        • 主定时广播
        • 备定时询问
      • 效率性
        • 定义判断条件
    • 主主

    实现

    • 修改源码加逻辑

    • 第三方

      • 人定期观察

        不可靠

        企业追求自动化,把人解耦

      • 程序实现HA

        keeplived

  • RS故障

# keepalived

# 职责

  • 监控自己的服务
  • Master通告自己还活着,backup监听master状态,Master挂了,一堆backup推举出新的Master
  • 配置,ip添加ipvs,keepalived是有配置文件的
  • 对后端Server做健康检查

# 实验

主机: node01~node04

  • node01:

    ipvsadm -C
    ifconfig eth0:8 down
    
    1
    2

  • node01,node04:

    • 安装程序
    yum install keepalived ipvsadm -y
    
    1
    • 配置:

      cd  /etc/keepalived/
      cp keepalived.conf keepalived.conf.bak
      vi keepalived.conf
      
      1
      2
      3
      • node01: vrrp:虚拟路由冗余协议!

        vrrp_instance VI_1 {
        	state MASTER         // node04  BACKUP
        	interface eth0       // 企业中一般会加多块网卡,用于传输不同的数据
        	virtual_router_id 51
        	priority 100		 //	 权重node04	 50
        	advert_int 1
        	authentication {
        		auth_type PASS
        		auth_pass 1111
        	}
        	virtual_ipaddress {
        		192.168.150.100/24 dev eth0 label  eth0:3
        	}
        }
        virtual_server 192.168.150.100 80 {
        	delay_loop 6
        	lb_algo rr
        	lb_kind DR
        	nat_mask 255.255.255.0
        	persistence_timeout 0   // session的时间,生产环境中需要设置一个合适值
        	protocol TCP
        
        	real_server 192.168.150.12 80 {
        		weight 1
        		HTTP_GET {
        			url {
        				path /
        				status_code 200
        			}
        			connect_timeout 3
        			nb_get_retry 3
        			delay_before_retry 3
        		}
        	}
        	real_server 192.168.150.13 80 {
        		weight 1
        		HTTP_GET {
        			url {
        				path /
        				status_code 200
        			}
        			connect_timeout 3
        			nb_get_retry 3
        			delay_before_retry 3
        		}
        	}
        }
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47

        ​ scp ./keepalived.conf root@node04:pwd

    • 启动

      service keepalived start

# 特点

  • Master挂掉恢复之后会抢回主

  • RS故障恢复之后

    keepalived能自动检查到并恢复提供服务

  • keepalived启动之后有三个keepalived进程

    主进程:广播自己还活着

    另外两个子进程:做RS的健康检查

  • 杀死keepalived进程

    造成两个lvs主机都配置了VIP,从到导致客户端数据包出现紊乱,握手包或者分手包可能会负载给不同的RS,破坏了原子性。出现不能建立连接或者丢包。

    为了解决上面的问题引入了一个不可靠的keepalived,出现了新的问题