lvs负载均衡

Claire ·
更新时间:2024-09-21
· 809 次阅读

1. 核心内容 负载均衡 lvs 负责对数据进行转发 一次请求,一次响应 反向代理 nginx/haproxy 负责代替用户找数据,找到后再发送给用户 两次请求,两次响应 2. arp DNS 为域名解析,将域名解析为IP地址 arp协议 为地址解析协议 将IP地址解析到mac地址 ip地址为网络层,3层 mac地址为2层 arp协议属于3层协议,但工作在2层 2.1 arp解析过程 假如有A、B、C、D四台设备连接在同一个交换机上,A想连接B,A知道B的IP地址10.0.0.8,但 不知道B的mac地址,A将会发广播:Who has 10.0.0.8?Tell 10.0.0.7(谁知道10.0.0.8的mac地址?请告诉A10.0.0.7”),B、C、D设备都会接受到该广播,但C、D设备的IP地址都不是10.0.0.8,则会丢弃该广播,B设备收到广播后知道A是要自己的mac地址,则B会悄悄(一对一)的将自己的mac地址发送给A,A收到B返回的信息后会缓存一份数据,用于下次连接B的时候用。 2.2 linux的arp缓存查看命令 arp -n # 若无此命令,则需要安装 net-tools 2.3 手动缓存其他设备的mac地址,只需手动在该设备上ping对应设备的IP地址 [root@lb01 ~]# arp -n Address HWtype HWaddress Flags Mask Iface 10.0.0.1 ether 00:50:56:c0:00:08 C eth0 10.0.0.254 ether 00:50:56:f2:d4:34 C eth0 [root@lb01 ~]# ping 10.0.0.7 PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data. 64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=3.37 ms 64 bytes from 10.0.0.7: icmp_seq=2 ttl=64 time=1.27 ms ^C --- 10.0.0.7 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 1.272/2.324/3.376/1.052 ms [root@lb01 ~]# arp -n Address HWtype HWaddress Flags Mask Iface 10.0.0.1 ether 00:50:56:c0:00:08 C eth0 10.0.0.7 ether 00:0c:29:8e:5d:df C eth0 10.0.0.254 ether 00:50:56:f2:d4:34 C eth0 [root@lb01 ~]# 2.4 通过抓包查看缓存mac地址过程 Vmware_86:09:1d Broadcast ARP 60 Who has 10.0.0.7? Tell 10.0.0.5 #Broadcast为广播 Vmware_8e:5d:df Vmware_86:09:1d ARP 60 10.0.0.7 is at 00:0c:29:8e:5d:df Vmware_c0:00:08 Vmware_86:09:1d ARP 42 Who has 10.0.0.5? Tell 10.0.0.1 Vmware_86:09:1d Vmware_c0:00:08 ARP 60 10.0.0.5 is at 00:0c:29:86:09:1d

5问:谁有7的mac地址?

7回:我有,地址是…

7问:谁有5的mac地址?

5回:我有,地址是…

说明:第一次讯问为广播,一旦有回应之后,则进行缓存,下次再讯问则不是广播,而是直接按照缓存去一对一连接。

2.5 删除arp 缓存命令 # arp -d ip地址,例如: arp -d 10.0.0.7 2.6 arp欺骗 描述:A和B都连接与同一个交换机,并都通过这个交换机上网,即A和B也都缓存着这个交换机的mac地址,突然有一天B大量的发出广播“交换机的mac地址是我B设备的mac地址”,慢慢的其他设备会逐渐替换并缓存B广播的这个假消息,导致其他设备误认为B设备为交换机,导致不能上网了。 3. lvs

lvs专业名称为:linux virtual server 即linux虚拟服务器

因为lvs处理请求支持的并发特别高,以至于lvs模块嵌入到了linux内核中,即 ip_vs

管理 ip_vs 有两种方式:通过ipvsadm管理命令 和 keepalived(keepalived for lvs)

4. lvs的工作模式 dr direct routing 直接路由模式(使用较多) nat (使用较多) tun 隧道模式(使用少) full nat(使用少) 4.1 预备知识 名词 用户 用的IP地址为:CIP 负载均衡 负载均衡利用高可用软件生成的的IP地址为:VIP 负载均衡设备本身的IP地址为:DIP 真实服务器(RS服务器) 真实服务器的IP地址为:RIP 4.2 nat模式 用户访问过程: 用户发出请求时携带源IP(CIP)、目标IP(VIP)到达复杂均衡服务器,lvs执行DNAT,将用户数据包的目标IP地址修改为RIP(网络设备会保存修改记录用于相同访问使用)发给RS服务器,RS服务器收到并处理后将RIP设为源IP、CIP设为目标IP发送给lvs,lvs执行SNAT,将RS服务器发来的源IP由RIP修改为VIP,即此时的数据包源IP为VIP,目标IP为CIP,由负载均衡发给用户。 此过程只涉及IP地址,不涉及mac地址。 特点: lvs与RE服务器可以不再同一局域网 用户访问端口和后端RS服务器响应的端口可以不一致 nat模式流量出入都要经过lvs,效率、性能不高 4.3 dr模式

用户访问过程:

用户发出请求时携带源IP(CIP)、目标IP(VIP)到达复杂均衡服务器,lvs将用户数据包的目标IP的mac地址修改为RS服务器的mac地址(随机选择任一台RS服务器)发给RS服务器,RS服务器收到后校对mac地址时发现与自己mac地址一致,所以接受并解封装数据包,因为所有RS服务器的lo网卡已经绑定了VIP,所以拆数据包时发现目标IP与自己绑定的VIP一致,所以RS服务器将处理结果直接发给用户。

小知识:windows中删除arp缓存方法

# 用管理员权限打开cmd arp -d

为什么要做arp抑制

因为所有RS服务器的lo回环网卡都绑定了VIP,所以lvs服务器以及所有RS服务器都有了VIP,当用户查询具有VIP的服务器的mac地址时,如果不做抑制,则lvs服务器以及所有RS服务器都会同时响应用户的请求,这样就发生混乱导致用户不能正常访问,给所有RS服务器做arp抑制之后,用户请求时,RS服务器不会响应,仅lvs服务器响应,则用户可以正常访问。

特点

lvs dr模式中,lvs只负责转发并修改用户请求的目标mac地址,称为dmact lvs dr模式中,后端RS服务器处理完的数据直接响应给用户 lvs dr模式中,RS服务器也要有公网IP lvs dr模式中,支持更高的并发数,几万甚至几十万 lvs dr模式中,lvs服务器和后端RS服务器必须在同一个局域网 lvs dr模式中,用户请求过来的端口是不能修改的,所以后端RS服务器就要开启用户访问的端口 4.4 dr模式环境准备 4.4.1 配置web01、web02 # web01要能够访问http://10.0.0.7/oldboy.html # web02要能够访问http://10.0.0.8/oldboy.html [root@web01 ~]# cat /etc/nginx/nginx.conf worker_processes 1; events { worker_connections 1024; } http{ server { server_name www.oldboy.com; listen 80; root /usr/share/nginx/html/ ; } } # 在oldboy.html中写入主机名 [root@web01 ~]# echo 'hostname' >/usr/share/nginx/html/oldboy.html # 关闭nginx [root@web01 ~]# pkill nginx # 重启nginx [root@web01 ~]# systemctl restart nginx 4.4.2 配置lb01、lb02 # 关闭lb01、lb02的keeplived nginx负载均衡 [root@lb01 ~]# systemctl stop keepalived nginx [root@lb01 ~]# systemctl disable keepalived nginx # lb01安装ipvsadm [root@lb01 ~]# yum install -y ipvsadm # lb01手动添加vip [root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth:0 # lb01手动添加池塘 [root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20 #参数:-A 创建池塘(VIP:端口) -t tcp协议 -s 轮询算法 wrr 加强轮询 -p 会话保持时间,默认是300秒 # lb01手动添加RS服务器 [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 dr模式 -w 权重 # lb01查看ipvs规则 [root@lb01 ~]# ipvsadm -Ln #注意:与iptables进行区分(-nL) # lb01查看ipvs规则及详细信息(查看具体流量信息) [root@lb01 ~]# ipvsadm -Ln --stats # 清空ipvs规则命令 [root@lb01 ~]# ipvsadm -C # 设置tcp超时时间 [root@lb01 ~]# ipvsadm --set 30 # 常用超时时间为30 5 60 # 注意:ipvsadm是linux管理ip_vs的命令,无需启动操作,直接使用。 4.4.3 配置RS服务器(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 # 所有RS服务器抑制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 # RS服务器检查lo网卡 [root@web01 ~]# ip a s lo # 注意: # 1. 不要在lvs服务器本地进行curl测试,会失败; # 2. lvs负载均衡当用户与访问量巨大的时候,才会使各个RS服务器的分配接近1:1,而平时测试访问量小的时 候,会长时间分配在同1台RS服务器上,要等1-2分钟才会变。 # 此时可以通过浏览器访问VIP网页测试 # 如访问失败,故障排查流程: # 1. 浏览器通过负载均衡访问 10.0.0.3/oldboy.html # 2. RS服务器通过ping/telnet连接负载均衡,查看是否成功 # 3. 在RS服务器上通过命令行curl 负载均衡vip网址 # 4. 浏览器单独访问RS服务器 RIP地址的网页,查看是否能正常访问 # 5. 查看RS服务器配置是否正确 4.4.4 lvs规则的备份与恢复 # 将ipvs规则打印到屏幕上 [root@lb01 ~]# ipvsadm-save -n # 将ipvs规则保存到文件 [root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.conf # 将ipvs规则从文件恢复 [root@lb01 ~]# ipvsadm-restore </root/ipvsadm.conf 5. lvs与keepalived配合使用 # 清除lb上手动添加的VIP,最简单的办法是重启网卡 systemctl restart network # 配置lb01的keepalived配置文件(主) [root@lb01 ~]# vim /etc/keepalived/keepalived.conf global_defs { router_id lb01 #keepalived身份 id 每个keepalived 不同 } 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 } } virtual_server 10.0.0.3 80 { #创建组 池塘 delay_loop 6 lb_algo wrr #轮询算法 lb_kind DR # lvs DR模式 nat_mask 255.255.255.0 #vip对应的子网掩码 persistence_timeout 50 #会话保持时间 -p protocol TCP #协议 -t real_server 10.0.0.7 80 { #rs服务器的配置 weight 1 #权重 TCP_CHECK { #-t TCP_CHECK 检查 传输层 connect_timeout 8 nb_get_retry 3 #number of get retry 重试的次数 delay_before_retry 3 #每次检查之前 等待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 } } } # 重启lb01的keepalived,并查看ipvs规则 [root@lb01 ~]# systemctl restart keepalived.service [root@lb01 ~]# ipvsadm -Ln # 配置lb02的keepalived配置文件(备) [root@lb02 ~]# vim /etc/keepalived/keepalived.conf #GLOBAL CONFIGURATION 全局定义部分 global_defs { router_id lb02 #keepalived身份 id 每个keepalived 不同 } #VRRPD CONFIGURATION vrrp实例部分 虚拟路由冗余协议 ##vrrp vrrp_instance oldboy { #实例名称 在同1对主备之间 要一致 state BACKUP #MASTER BACKUP interface eth0 #指定网卡 公网网卡 virtual_router_id 62 #虚拟路由id 同1对 主备之间要一致 在同1个keepalived文件中要不同 priority 50 #优先级 主>备 相差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 } } virtual_server 10.0.0.3 80 { #创建组 池塘 delay_loop 6 lb_algo wrr #轮询算法 lb_kind DR # lvs DR模式 nat_mask 255.255.255.0 #vip对应的子网掩码 persistence_timeout 50 #会话保持时间 -p protocol TCP #协议 -t real_server 10.0.0.7 80 { #rs服务器的配置 weight 1 #权重 TCP_CHECK { #-t TCP_CHECK 检查 传输层 connect_timeout 8 nb_get_retry 3 #number of get retry 重试的次数 delay_before_retry 3 #每次检查之前 等待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 } } } # 重启lb02的keepalived,并查看ipvs规则 [root@lb02 ~]# systemctl restart keepalived.service [root@lb02 ~]# ipvsadm -Ln
作者:独具vs慧眼



lvs负载均衡 lvs

需要 登录 后方可回复, 如果你还没有账号请 注册新账号