目录
Linux Virtual Server,负载调度器,内核集成,章文嵩(花名正明), 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现
LVS的核心组件包括:
IPVS(IP Virtual Server):这是LVS的核心模块,运行在Linux内核空间,用于实现负载均衡功能。它通过虚拟IP地址接收客户端请求,然后根据预定义的调度算法将请求分发给后端的真实服务器。
LVS-DR(Direct Routing):一种负载均衡方式,数据包直接从客户端发送到负载均衡器,然后直接路由到后端服务器,响应则直接返回客户端,避免了负载均衡器成为瓶颈。
LVS-NAT(Network Address Translation):另一种负载均衡方式,所有流量都通过负载均衡器进行NAT转换,这样可以支持不在同一网段的服务器,但会增加负载均衡器的负担。
LVS-TUN(IP Tunneling):通过IP隧道将请求发送到后端服务器,适用于地理上分布的服务器集群。
LVS通常与其他高可用性和监控工具(如Keepalived、HAProxy等)结合使用,以实现更复杂和健壮的集群管理方案。
主要特点:
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态
分为两种:
静态方法: 不管后端真实服务器的 状态,根据自身 算法进行调度
动态方法: 会根据后端服务器的状态来进行调度
1、RR:roundrobin,轮询,较常用
2、WRR:Weighted RR,加权轮询,较常用 先算总权重 再用自己的 权重去除以 总权重
3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存 缓存
个参考值 来确定服务器是否忙 这个值越小 代表服务器 闲 就会优先调度给闲的服务器
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
1、LC:least connections 适用于长连接应用 最小连接数 不考虑权重
Overhead=activeconns*256+inactiveconns
2、WLC:Weighted LC,默认调度方法,较常用 默认调度 加权最小连接数 第一轮不合理 都是 一样的 优先级
Overhead=(activeconns*256+inactiveconns)/weight
3、SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接 权重小的 空闲的
Overhead=(activeconns+1)*256/weight
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等 检查 后端服务器忙不忙
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等
-A: 添加虚拟服务器
-D: 删除整个虚拟服务器
-s: 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc)
-a: 添加真实服务器(节点服务器)
-d: 删除某一个节点
-t: 指定VIP地址及TCP端口
-r: 指定RIP地址及TCP端口
-m: 表示使用NAT群集模式
-g: 表示使用DR模式
-i: 表示使用TUN模式
一w: 设置权重(权重为0时表示暂停节点)
-p 60: 表示保持长连接60秒
-l: 列表查看 LVS虚拟服务器(默认为查看所有)
-n: 以数字形式显示地址、端口等信息,常与"-l“选项组合使用。ipvsadm -ln
(1)配置LVS调度服务器
新增一个网卡ens36,并修改为仅主机模式
复制网卡ens33配置文件到ens36,并修改网卡ens36,IP地址和网关为12.0.0.1
并重启网卡
开启路由转发
下载安装epel源和ipvsadm服务
- yum install epel-release.noarch -y
- yum install ipvsadm -y
保存配置文件,启动 ipvsadm服务 指定服务器地址
- [root@localhost network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
- #保存配置文件
- [root@localhost network-scripts]# systemctl start ipvsadm.service
- #开启服务
- [root@localhost network-scripts]# ipvsadm -A -t 12.0.0.1:80 -s rr
- #指定IP地址 外网的入口 -s rr 轮询
- [root@localhost network-scripts]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.240.12:80 -m
- ##先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
- [root@localhost network-scripts]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.240.13:80 -m
- [root@localhost network-scripts]# ipvsadm -Ln
- #查看规则
- IP Virtual Server version 1.2.1 (size=4096)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- TCP 12.0.0.1:80 rr
- -> 192.168.240.12:80 Masq 1 0 0
- -> 192.168.240.13:80 Masq 1 0 0
(2)配置真实服务器192.168.240.12
下载http服务,开启http服务,并制作网页
- [root@localhost network-scripts]# systemctl stop nginx
- [root@localhost network-scripts]# systemctl start httpd
- [root@localhost network-scripts]#
- [root@localhost network-scripts]# echo zxy12 > /var/www/html/index.html
(3)配置真实服务器192.168.240.13
重启网卡systemctl restart network
- [root@localhost network-scripts]# yum install httpd -y
- [root@localhost network-scripts]# systemctl start httpd
- [root@localhost network-scripts]# systemctl restart network
- [root@localhost network-scripts]# echo zxy13 > /var/www/html/index.html
(4)修改客户机192.168.240.10
修改IP地址为12.0.0.100,网关为12.0.0.1,网卡类型为仅主机
- [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
-
- NAME=ens33
- DEVICE=ens33
- ONBOOT=yes
- IPADDR=12.0.0.100
- METMASK=255.255.255.0
- GATEWAY=12.0.0.1
- DNS1=8.8.8.8
- [root@localhost ~]# systemctl restart network
(5)登录客户机使用curl命令访问12.0.0.1 进行测试
(1)配置调度服务器
关闭防火墙
- systemctl stop firewalld.service
- setenforce 0
yum 安装 ipvsadm.x86_64
[root@localhost ~]#yum install ipvsadm.x86_64 -y
配置虚拟网卡
- [root@localhost ~]# cd /etc/sysconfig/network-scripts
- [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
- [root@localhost network-scripts]# vim ifcfg-ens33:0
- NAME=ens33:0
- DEVICE=ens33:0
- ONBOOT=yes
- IPADDR=192.168.240.188
- NETMASK=255.255.255.255
- [root@localhost network-scripts]#systemctl restart network
- [root@localhost network-scripts]#ifup ifcfg-ens33:0
- #启动网卡
- [root@localhost network-scripts]#ifconfig ifcfg-ens33:0
调整/proc响应参数
- [root@localhost network-scripts]# vim /etc/sysctl.conf
- net.ipv4.ip_forward = 0
- net.ipv4.conf.all.send_redirects = 0
- net.ipv4.conf.default.send_redirects = 0
- net.ipv4.conf.ens33.send_redirects = 0
-
- [root@localhost network-scripts]#sysctl -p
- #刷新配置
- #调整/proc响应参数 对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
加载模块,配置负载分配策略
- [root@localhost network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
- ##保存设置
- [root@localhost network-scripts]# systemctl start ipvsadm.service
- [root@localhost network-scripts]# ipvsadm -C #清空策略
- [root@localhost network-scripts]# ipvsadm -A -t 192.168.240.188:80 -s rr
- [root@localhost network-scripts]# ipvsadm -a -t 192.168.240.188:80 -r 192.168.240.12:80 -g
- [root@localhost network-scripts]# ipvsadm -a -t 192.168.240.188:80 -r 192.168.240.13:80 -g
- [root@localhost network-scripts]# ipvsadm -Ln
- IP Virtual Server version 1.2.1 (size=4096)
- Prot LocalAddress:Port Scheduler Flags
- -> RemoteAddress:Port Forward Weight ActiveConn InActConn
- TCP 192.168.240.188:80 rr
- -> 192.168.240.12:80 Route 1 0 0
- -> 192.168.240.13:80 Route 1 0 0
- #添加真实服务器-a 指定VIP地址及TCP端口-t 指定RIP地址及TCP端口 -r 指定DR模式-g
(2)配置节点服务器(真实服务器192.168.240.12)
关闭防火墙,下载启动http服务
- [root@localhost ~]#systemctl stop firewalld.service
- [root@localhost ~]#setenforce 0
- [root@localhost ~]#yum install httpd -y
- [root@localhost ~]#systemctl start httpd
制作网页
- [root@localhost ~]# cd /var/www/html
- [root@localhost html]# ls
- [root@localhost html]# echo zxy12 > /var/www/html/index.html
修改回环网卡名,IP地址,子网掩码,配置路由
- [root@localhost ~]# cd /etc/sysconfig/network-scripts/
- [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
- [root@localhost network-scripts]# vim ifcfg-lo:0
- #修改回环网卡名,IP地址,子网掩码
- DEVICE=lo:0
- IPADDR=192.168.240.188
- NETMASK=255.255.255.255
- NETWORK=127.0.0.0
- ONBOOT=yes
- [root@localhost network-scripts]# systemctl restart network
- [root@localhost network-scripts]# route add -host 192.168.240.188 dev lo:0
- #设置路由
- [root@localhost network-scripts]# route -n
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 192.168.240.2 0.0.0.0 UG 100 0 0 ens33
- 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
- 192.168.240.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
- 192.168.240.188 0.0.0.0 255.255.255.255 UH 0 0 0 lo
开机执行命令,或者写入 /etc/profile 文件
- [root@localhost network-scripts]#vim /etc/rc.d/rc.local
- /usr/sbin/route add -host 192.168.240.188 dev lo:0
- [root@localhost network-scripts]#chmod +x /etc/rc.d/rc.local
- [root@localhost network-scripts]#ll /etc/rc.d/rc.local
调整/proc响应参数
- [root@localhost network-scripts]#vim /etc/sysctl.conf
- #添加系统只响应目的IP为本地IP的ARP请求
- #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.all.arp_announce = 2
- net.ipv4.conf.default.arp_ignore = 1
- net.ipv4.conf.default.arp_announce = 2
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- [root@localhost network-scripts]#sysctl -p #刷新配置
(3)配置节点服务器(真实服务器192.168.240.13)
关闭防火墙,下载启动http服务
- [root@localhost ~]#systemctl stop firewalld.service
- [root@localhost ~]#setenforce 0
- [root@localhost ~]#yum install httpd -y
- [root@localhost ~]#systemctl start httpd
制作网页
- [root@localhost ~]# cd /var/www/html
- [root@localhost html]# ls
- [root@localhost html]# echo zxy13 > /var/www/html/index.html
修改回环网卡名,IP地址,子网掩码,配置路由
- [root@localhost ~]# cd /etc/sysconfig/network-scripts/
- [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
- [root@localhost network-scripts]# vim ifcfg-lo:0
- #修改回环网卡名,IP地址,子网掩码
- DEVICE=lo:0
- IPADDR=192.168.240.188
- NETMASK=255.255.255.255
- NETWORK=127.0.0.0
- ONBOOT=yes
- [root@localhost network-scripts]# systemctl restart network
- [root@localhost network-scripts]# route add -host 192.168.240.188 dev lo:0
- #设置路由
- [root@localhost network-scripts]# route -n
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 192.168.240.2 0.0.0.0 UG 100 0 0 ens33
- 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
- 192.168.240.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
- 192.168.240.188 0.0.0.0 255.255.255.255 UH 0 0 0 lo
开机执行命令,或者写入 /etc/profile 文件
- [root@localhost network-scripts]#vim /etc/rc.d/rc.local
- /usr/sbin/route add -host 192.168.240.188 dev lo:0
- [root@localhost network-scripts]#chmod +x /etc/rc.d/rc.local
- [root@localhost network-scripts]#ll /etc/rc.d/rc.local
调整/proc响应参数
- [root@localhost network-scripts]#vim /etc/sysctl.conf
- #添加系统只响应目的IP为本地IP的ARP请求
- #系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.all.arp_announce = 2
- net.ipv4.conf.default.arp_ignore = 1
- net.ipv4.conf.default.arp_announce = 2
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- [root@localhost network-scripts]#sysctl -p #刷新配置
(4)测试结果
LVS工作模式总结和比较
NAT | TUN | DR | |
---|---|---|---|
优点 | 端口转换 | WAN | 性能最好 |
缺点 | 性能瓶颈 | 服务器支持隧道模式 | 不支持跨网段 |
真实服务器要求 | any | Tunneling | Non-arp device |
支持网络 | private(私网) | LAN/WAN(私网/公网) | LAN(私网) |
真实服务器数量 | low (10~20) | High (100) | High (100) |
真实服务器网关 | lvs内网地址 | Own router(网工定义) | Own router(网工定义) |
工作原理:
特点:
优缺点:
工作原理:
特点:
优缺点:
工作原理:
特点:
优缺点: