Day06-01-lvs

0. 核心内容

  • 负载均衡选型项目
  • 负载均衡 lvs 工作模式 : dr nat tun full nat
  • 部署后通过wireshark抓包

1.负载均衡项目 选择

star法则:表达故障/项目 如何说的更流畅或逻辑性

  • s situation 场景/在什么情况下?
  • t task/target 目标/你要完成什么?
  • a action 动作/你是怎么做的?
  • r result 结果/最终结果如何?
负载均衡选择项目
s公司演变用户量越来越多.选择负载均衡 搭建多台web服务器.对比与选择 负载均衡
T选择1款 适合负载均衡
A1.找出市面上常见负载均衡: 硬件F5 A10 开源软件: lvs,nginx,haproxy
2.对比
3.根据公司实际需求选择
R根据当前访问量,选择 nginx负载均衡 nginx proxy缓存.
常见负载均衡对比优势缺点
硬件: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或者域名的转发
albalb 7层支持更多的7层的转发功能 基于用户请求头 http_user_agent 用户语言 镜像流量(申请,深圳)
  • 4层 lb vs 7层 lb
    • 4层负载均衡 传输层 负载均衡最多认识到端口
    • 7层负载均衡 应用层 url uri 转发 http https

image-20240524142026190

image-20240524142035506

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

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

  • lvs vs ngx区别

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

故障:

一.多个虚拟主机通过域名访问 直接访问web服务器ok 通过负载均衡 访问 只显示 第1个虚拟主机.

负载均衡向后端发出请求的时候 请求Host upstream 池塘 名称. 所以相当于是使用ip访问后端服务器.

访问第1个虚拟主机.

proxy_set_header Host $host;

二.使用负载均衡后端web服务器记录用户真实ip(客户端ip)地址

proxy_set_header X-Forwarded-For $remote_addr;

2.lvs 预备姿势-arp

  • DNS 域名解析 域名 -->ip

  • arp协议 地址解析协议 IP----->mac地址 3层协议工作在2层

    • ip(网络层 3层)
    • mac (2层)
  • arp解析过程

    • 发出广播 请求ip对应的mac地址是? Who has 10.0.0.8? Tell 10.0.0.7
    • 发出响应 单播 告诉对方我的mac地址是xxxx
    • 0.8 发请请求 询问 .7的mac地址 单播
    • 0.7 把自己mac地址 发送给.8
    • 0.7缓存1份mac地址(arp缓存)

image-20240526155250612

  • arp病毒
  • 老男孩教育-arp欺骗
    • 员工入职的时候 记录号 mac 或 mac和ip绑定
    • 找出mac 在网络设备 屏蔽

image-20240526155328283

3.lvs 概述

  • sersync /jumpserver
  • linux virtual server linux虚拟服务器 负载均衡
  • lvs 放到Linux内核中 内核模块 ip_vs
  • 通过命令行管理工具或服务,间接管理lvs
    • 命令行管理命令 ipvsadm ()
    • 服务: keepalived通过配置文件的方式管理lvs. ( keepalived for lvs ) 控制管理 ip_vs内核模块

image-20240524143419451

4. lvs工作模式

  • dr direct routing 直接路由模式

  • nat

  • tun 隧道

  • full nat 完全nat模式

4.1 预备姿势

image-20240526155531493

名称单词含义
CIPclient ip客户端ip地址
VIPVirtual ip虚拟ip
DIPdirector ip负载均衡本身的ip
RS服务器real server真实服务器 处理用户请求.
RIPReal erver IPreal server ip 真实服务器的ip地址

4.2 lvs-dr模式

image-20240526155757964

image-20240526155812337

  • 特点
    • 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解析

4.3 lvs-nat模式

image-20240524151936969

image-20240526160020441

image-20240526160036253

  • lvs-nat模式特点
    • lvs服务器与rs服务器可以不在同一局域网
    • nat模式:流量进出都要经过lvs,效率性能不高 .
    • 端口也可以不同
  • 基于nat模式进阶模式 full-nat模式(数据流入的时候与nat模式一致,数据流出的时候类似于dr模型,直接响应给用户)

4.4 小结

  • lvs dr模式 nat模式 tun(隧道模式) full nat模式
  • 官网传送门http://www.linuxvirtualserver.org/zh/lvs3.html#google_vignette

5. lvs-dr模式

5.1 环境准备

主机服务ip
lb01lvs10.0.0.5
vipvip10.0.0.3
lb0210.0.0.6
web01nginx10.0.0.7
web02nginx10.0.0.8
  • lvs.oldboylinux.com
lb01 lb02 #nginx 关闭  
web01 web02 lvs.oldboylinux.com    
/code/lvs/index.html      
#web01
cat index.html  
lvs web01

#web02
cat index.html
lvs web02

[root@web01 ~]# cat /etc/nginx/conf.d/lvs.oldboylinux.com.conf
server {
   listen 80;
   server_name lvs.oldboylinux.cn;
   root /app/code/lvs;
   location / {
   index index.html ;
   }
}
[root@web01 ~]# curl -H Host:lvs.oldboylinux.com 172.16.1.7
lvs web01 10.0.0.7 172.16.1.7
[root@web01 ~]# curl -H Host:lvs.oldboylinux.com  172.16.1.8
lvs web02 10.0.0.8 172.16.1.8

#lb01 lb02
##关闭 keepalived   nginx负载均衡
systemctl stop keepalived nginx  
systemctl disable keepalived nginx  

yum install  -y 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                 145497  0
nf_conntrack          139264  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

5.2 lvs-dr模式配置流程

1) lvs服务端配置

#01.手动添加vip,后面是由keepalived生成
ip addr add 10.0.0.3/24 dev eth0 label eth0:0

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

#03. 清空规则,要备份
ipvsadm -C     #clear清除 #iptables -F flush

#04. 设置 tcp超时时间
ipvsadm --set 30 5 60   #设置tcp 超时时间

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

#添加规则 ngx upstream
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 会话保持时间  

#添加规则 向upsteam中添加server  
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

ipvsadm -ln
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1

#-a 添加 rs服务器  
#-t tcp协议
#-r 指定rs服务器ip
#-g --gatewaying dr模式 默认的
#-w 权重
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

[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        
[root@lb01 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port
TCP  10.0.0.3:80                         0        0     0        0        0
-> 10.0.0.7:80                          0        0      0        0        0
-> 10.0.0.8:80                         0        0       0        0        0

upstream web_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
location / {
proxy_pass http://web_pools;
}
}
  • 加载lvs内核模块
[root@lb01 ~]# lsmod |grep ip_vs
[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 ~]# lsmod |grep ip_vs
ip_vs                 145497  0
nf_conntrack          133095  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack
  • lb负载均衡 规则的备份与恢复
#ipvsadm 规则的备份与恢复
[root@lb01 ~]# ipvsadm-save -n >/root/ipvs.txt
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port  Forward WeightActiveConn 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        
[root@lb01 ~]# ipvsadm -C
[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 ~]# ipvsadm-restore <root/ipvs.txt
[root@lb01 ~]# ipvsadm -ln
[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

2) web服务器 RS服务端配置

#lo网卡绑定 vip
#ip addr add 10.0.0.3/32 dev lo label lo:1
[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@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 brd00: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解析
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
sysctl -p

3) 小结

  • lvs服务器: 配置
  • 后端rs服务: 配置:lo vip ;抑制arp解析

4) 调试

  • 不要在lvs本地进行测试

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

  • 抓包wireshark

  • 测试 准备 wireshark 抓包

  • curl 10.0.0.[7-8]

  • 浏览器10.0.0.3/index.html

  • 不要在 lvs本地进行测试 curl

  • lvs 高并发 大访问量使用的 nginx 接近于1:1

5.3 抓包查看lvs dr

image-20240526163455393

image-20240526163507099

5.4 lvs规则 备份与恢复

  • 后面我们通过keepalived管理lvs
  • ipvsadm-save -n
  • ipvsadm-restore <
[root@lb01 ~]# ipvsadm-save -n
-A -t 10.0.0.3:80 -s wrr -p 20
-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
-A -t 10.0.0.4:80 -s wrr -p 20
-a -t 10.0.0.4:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.4:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.conf
[root@lb01 ~]# ipvsadm -C
[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 ~]# ipvsadm-restore < /root/ipvsadm.conf
[root@lb01 ~]# ipvsadm-restore < /root/ipvsadm.conf
[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        
TCP  10.0.0.4:80 wrr persistent 20
  -> 10.0.0.7:80                 Route   1      0  0        
  -> 10.0.0.8:80                 Route   1      0  0

6. lvs 负载均衡排错流程

image-20240526163853420

故障:

  1. 不通过浏览器访问 命令行进行访问 测试 10.0.0.3
  2. ping/telnet
  3. 直接访问后端rs服务器进行测试
  4. 某一台web服务器配置是否正常

7. lvs 与keepalived配合

  • keepalived for lvs

  • 配置文件分为几个部分?

#GLOBAL CONFIGURATION 全局配置部分
route_id 每个keepalived软件 独一无二 id

#VRRPD CONFIGURATION     配置vip vrrp实例部分

#LVS CONFIGURATION   配置管理lvs
#GLOBAL CONFIGURATION   全局定义部分
global_defs {
      router_id lb01      #keepalived身份 id 每个keepalived 不同
}
#VRRPD CONFIGURATION vrrp实例部分   虚拟路由冗余协议vrrp
vrrp_instance oldboy {    #实例名称   在同1对主备之间 要一致
 state MASTER          #MASTER BACKUP
 interface eth0        #指定网卡 公网网卡
 virtual_router_id 62  #虚拟路由id 同1对 主备之间要一致 在同1个keepalived文件中要不同
 priority 100          #优先级 主>备 相差50
 advert_int 1          #interval 间隔 心跳间隔 秒 每隔1秒检查
 authentication {      #认证 方式
   auth_type PASS    #简单认证
   auth_pass 1234    #在同1对 主备之间一直 
   }
 virtual_ipaddress {   #vip  
  10.0.0.3/24 dev eth0 label eth0:0   #ip addr add 10.0.0.3/24 dev eth0 label eth0:0
  }
}

#ip addr add
#LVS CONFIGURATION 管理lvs
##ipvsadm 通过命令
##keepalived 通过 配置文件控制lvs
#               vip     端口
#ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#相当于ngx的upstream
virtual_server 10.0.0.3 80 {  #创建组 池塘  
##ipvsadm -A -t 10.0.0.3:80 -s wrr -p 50
     delay_loop 6         
     lb_algo wrr              #轮询算法   lc least conn 最小连接数   或者 lvs_sched
                              #         wlc
                              #weighted round robin
     lb_kind DR               # lvs DR模式       lvs_method
     nat_mask 255.255.255.0   #vip对应的子网掩码
     persistence_timeout 20   #会话保持时间   -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 {  #rs服务器的配置
     weight 1               #权重
     TCP_CHECK {            #-t TCP_CHECK 检查 传输层 tcp/udp 端口
                            #三次握手 建立连接 与你的端口建立连接
                            #四次挥手
                            # 或者 指定url进行http检查 HTTP_GET
     connect_timeout 8      
     nb_get_retry 3         #number of get retry重试的次数  
     delay_before_retry 3   #每次检查之前 等待3秒
     connect_port 80        #检查端口
     }
   }  
#                        HTTP_GET   {
#                             url {
#                               #path指定uri
# #                             path /nginx_status
#                               status_code 200
#                             }
#   connect_timeout 8
# nb_get_retry 3
# delay_before_retry 3
                               
#   }
   
#nginx负载均衡
#upstream web_pools {
#server 10.0.0.7:80 wegiht=1 max_fails=3fail_timeout=30s ;
#}
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
         }
      }
  }
 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  

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  
real_server 10.0.0.7 80 {   #添加rs服务器
       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  
       real_server 10.0.0.8 80 {   #添加rs服务器
       weight 1
       TCP_CHECK {                 #健康检查 检查端口
       connect_timeout 8
       nb_get_retry 3
       delay_before_retry 3
       connect_port 80
       }
     }
   }

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
        }
      }
    }
  • 搭建与检测
  • 关闭keepalived 是否切换 ok

image-20240526164414075

image-20240526164425072

  • 关闭某一个web服务器:nginx

8. lvs

  • lvs-arp ip(3层) -->mac(2层) 工作在哪层? 3层协议工作在2层.
  • lvs 常见模式 dr nat tun(隧道) full nat
  • lvs+keepalived
  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值