linux-LVS

发布时间 2023-04-18 22:56:03作者: wh459086748

LVS

一、概述

1.常见负载均衡

常见负载均衡对比 优势 缺点
硬件:F5 性能好 技术支持 价 格昂贵 购买2台1对 .
lvs 工作四层 效率极其高 对数据做的转发 负载均衡 部署 维护(运维成本较高)
nginx/tengine/openresty(lua) 使用简单 支持4层(1.9版本后支持)和7层 反向代理 缓 存 流量镜像(mirror) 处理数据代理模式 替用户去查找 找到后发送给用户 并发较大(1w以 上)
haproxy 相对复杂 支持4层和7层 反向代理 动态加载配置文件 处理数据代理模式 替用户去查找 找到后发送给用户 并发较大(1w以 上 比nginx多)
云服务: clb(slb) clb 4层和7层 只能支持url或者域名的转发
alb alb 7层 支持更多的7层的转发功能 基于用户请求头 http_user_agent 用户语言

2. 4层lb vs 7层lb

4层负载均衡 传输层 负载均衡最多认识到端口

7层负载均衡 应用层 url,uri 转发 http https

3.负载均衡 vs 反向代理

负载均衡: lvs 对数据进行转发

反向代理 :nginx/haproxy 做的代理 代替用户找 找到后发送给用户

lvs ngx
区别01 仅工作在4层,性能好 4层和7层,配置方便
区别02 lvs(DR模式)处理数据流程是转发 ngx对处理进行代理(2次请求,2次响应)

4.lvs 概述

linux virtual server linux虚拟服务器 负载均衡

lvs 放到Linux内核中内核模块 ip_vs

通过命令行管理工具或服务,间接管理lvs

  • 命令行管理命令 ipvsadm ()
  • 服务: keepalived通过配置文件的方式管理lvs. ( keepalived for lvs ) 控制管理 ip_vs内核模块

image-20230401142650124

二、lvs工作模式

dr direct routing 直接路由模式

nat

tun 隧道

full nat 完全nat模式

1.一些名词

名称 单词 含义
CIP client ip 客户端ip地址
VIP Virtual ip 虚拟ip
DIP director ip 负载均衡本身的ip
RS服务器 real server 真实服务器 处理用户请求.
RIP Real erver IP real server ip 真实服务器的ip地址

2.lvs -dr模式

image-20230401150557977

特点

  • lvs dr模式中lvs只负责转发并修改用户的目标IP的mac地址 dmact
  • lvs dr模式中服务端给用户的响应是通过后端rs服务器处理直接响应给用户. 不需要再通过lvs
  • lvs vip公网ip,rs服务器也要有公网ip.

优势

  • lvs dr支持更高并发(几万 几十万) ,nginx(1w)

局限性

  • lvs服务器和后端rs服务器,必须要在同1个局域网,涉及到arp解析
  • 用户请求过来的端口,无法修改的. 用户的请求是什么端口 ,后端rs服务器就要开端口
  • lvs dr模式需要lvs服务器进行配置,同时还要在后端rs服务端 lo网卡绑定vip, 抑制arp解析

3.lvs - nat模式

image-20230401150811734

特点

  • lvs服务器与rs服务器可以不在同一局域网
  • nat模式:流量进出都要经过lvs,效率性能不高
  • 端口也可以不同

基于nat模式进阶模式 full-nat模式(数据流入的时候与nat模式一致,数据流出的时候类似于dr模型,直接响应给用户)

三、dr模式

1.环境准备

主机 服务 ip
vip vip 10.0.0.3
lb01 lvs 10.0.0.5
web01 nginx 10.0.0.7
web01 nginx 10.0.0.8

2.准备web环境

#web01
[root@web01 ~]# mkdir -p /app/code/lvs
[root@web01 ~]# echo "`hostname` `hostname -I`" >/app/code/lvs/index.html
[root@web01 ~]# cat /etc/nginx/conf.d/lvs.conf
    server {
       listen 80;
       server_name   lvs.cn;
       root /app/code/lvs;
       location / {
          index index.html ;
       }
    }
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# curl -H Host:lvs.cn http://172.16.1.7

#web02
[root@web02 ~]# mkdir -p /app/code/lvs
[root@web02 ~]#  echo "`hostname` `hostname -I`" >/app/code/lvs/index.html
[root@web02 ~]# cat /etc/nginx/conf.d/lvs.conf
server {
   listen 80;
   server_name   lvs.cn;
   root /app/code/lvs;
   location / {
 	  index index.html ;
   }
}
[root@web02 ~]# systemctl restart nginx

3.关闭lb的keepliaved nginx

[root@lb01 ~]# systemctl stop keepalived.service nginx.service 

4.lb安装lvs

[root@lb01 ~]# yum -y install ipvsadm
#软件包内容
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm           #管理lvs规则 ip_vs
/usr/sbin/ipvsadm-restore   #恢复从文件中恢复lvs规则
/usr/sbin/ipvsadm-save      #保存lvs规则

#检查 ip_vs 内核模块是否加载
[root@lb01 ~]# lsmod |grep ip_vs
ip_vs                 145458  0 
nf_conntrack          139264  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

5.lvs服务端配置

#手动添加vip,后面是由keepalived生成
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
[root@lb01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:fb:43:58 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/24 scope global secondary eth0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fefb:4358/64 scope link 
       valid_lft forever preferred_lft forever

#查看lvs规则
[root@lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

#清空规则,要备份
[root@lb01 ~]# ipvsadm -C

#设置 tcp超时时间
[root@lb01 ~]# ipvsadm --set 30 5 60

#添加规则 ngx upstream
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#-A add-service 创建池塘  
#-t tcp-service tcp协议
#10.0.0.3:80 组名称
#-s scheduler 轮询算法    wrr weight 加权轮询   rr  lc wlc
#-p persistent 会话保持时间

[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20

#添加规则 向upsteam中添加server
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
#-a 添加 rs服务器  
#-t tcp协议
#-r 指定rs服务器ip
#-g gatewaying dr模式 默认的
#-w 权重

[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
  -> 10.0.0.7:80                  Route   1      0          0         
  -> 10.0.0.8:80                  Route   1      0          0 
#规则的备份与恢复
ipvsadm-save -n > /root/ipvs.txt
ipvsadm-restore < /root/ipvs.txt

6.web服务器 RS服务端配置

#lo网卡绑定 vip
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.3
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback

[root@web01 ~]# systemctl restart network
[root@web01 ~]# ip a s lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 brd 10.0.0.3 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

[root@web02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.3
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
[root@web02 ~]# systemctl restart network
[root@web02 ~]# ip a s lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 brd 10.0.0.3 scope global lo:1
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
       
#抑制arp解析
[root@web01 ~]# cat >>/etc/sysctl.conf<<EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.lo.arp_ignore = 1
> net.ipv4.conf.lo.arp_announce = 2
> EOF
[root@web01 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2


[root@web02 ~]# cat >>/etc/sysctl.conf<<EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.lo.arp_ignore = 1
> net.ipv4.conf.lo.arp_announce = 2
> EOF
[root@web02 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

7.调试

不要在lvs本地进行测试

lvs应对高并发负载均衡,访问量比较少的时候,不会像nginx 1:1

C:\Windows\System32\drivers\etc
10.0.0.3 lvs.cn

image-20230401154305322

image-20230401154137131

8.lvs 与keepalived配合

#加注释
virtual_server 10.0.0.3 80 {  #创建组 池塘
   delay_loop 6        
   lb_algo wrr              
   #轮询算法   lc leastconn 最小连接数  
   #         wlc  weighted round robin     
   lb_kind DR              
   # lvs DR模式    
   nat_mask 255.255.255.0   
   #vip对应的子网掩码
   persistence_timeout 50   
   #会话保持时间   -p  
   protocol TCP             
   #协议 -t 
   #ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80   -g-w 1  
	   #添加rs服务器
       real_server 10.0.0.7 80 {   
       weight 1 
	   #健康检查 检查端	   
       TCP_CHECK {                 
		   connect_timeout 8      
		   nb_get_retry 3
		   delay_before_retry 3
		   connect_port 80
       }
   }
    
    #ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1  
		#添加rs服务器
       real_server 10.0.0.8 80 {   
       weight 1 
		#健康检查 检查端	   
       TCP_CHECK {                 
		   connect_timeout 8      
		   nb_get_retry 3
		   delay_before_retry 3
		   connect_port 80
       }
   }
}


[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   router_id lb01
}


vrrp_instance vip_3 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev eth0 label eth0:0
    }
}

virtual_server 10.0.0.3 80 {  
	   delay_loop 6
	   lb_algo wrr              													
	   lb_kind DR              
	   nat_mask 255.255.255.0  
	   persistence_timeout 50  
	   protocol TCP            
	   real_server 10.0.0.7 80 {  
	   weight 1              
	   TCP_CHECK {                
		   connect_timeout 8      
		   nb_get_retry 3
		   delay_before_retry 3
		   connect_port 80
	   }
	}    
	   real_server 10.0.0.8 80 {  
	   weight 1              
	   TCP_CHECK {                
		   connect_timeout 8      
		   nb_get_retry 3
		   delay_before_retry 3
		   connect_port 80
	   }
	}
}

[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lb01 ~]# systemctl start keepalived.service