LVS负载均衡的两种调度模式:NAT和DR
概述:Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。我国章文嵩博士在1998年五月创建,默认编译为ip_vs内核模块,而在linux kernel的2.6版本之后kernel是直接支持ipvs的;
LVS是工作在OSi模型中的第四层,也就是传输层。
优势:LVS承受负载能力高、稳定、占用服务器资源小
缺点:适配场景、配置较麻烦、不支持节点的健康检查机制
LVS一般有三种工作模式:NAT、TUN、DR,其中常用的是NAT和DR模式
案例一:搭建LVS的NAT模式
其中CIP和VIP是外网地址(本地测试用VMWare桥接模式来模拟)
DIP和RIP是内网地址(本地测试用VMnet1仅主机模式模拟)
因为客户端访问的目标地址是VIP,与RS服务器的不一致,所以RS服务器接受的请求不能直接返回给客户端,而是要通过调度器再返回到客户端,所以调度器的压力会很大,调度器也容易成为整个集群框架的瓶颈
系统 | 所需IP | 所需软件 |
CentOS7.4/lB |
DIP:192.168.92.101 VIP:192.168.0.88 |
镜像ISO文件里面有 |
CentOS7.4/RS1 | RIP1:192.168.92.102 | 镜像ISO文件里面有 |
CentOS7.4/RS2 | RIP2:192.168.92.103 | 镜像ISO文件里面有 |
CentOS7.4/RS3 | RIP3:192.168.92.104 | 镜像ISO文件里面有 |
CentOS7.4/Client | CIP:192.168.0.104 | 镜像ISO文件里面有 |
1.安装三台Real Server的httpd服务,由于是测试这里直接采用yum安装的方式(要注意Real Server的网关要指向LB的DIP)
1 2 3 4 5 6 7 | [root@rs1 ~] #yum -y install httpd [root@rs1 ~] #echo "this is $(hostname)" > /var/www/html/index.html #三个服务器都写一个简单的页面,用来确定客户端访问的时候是访问的那一台Real Server [root@rs1 ~] #systemctl start httpd [root@rs1 ~] #systemctl enable httpd |
2.配置lb服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@lb ~] #echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf #开启路由转发功能 [root@lb ~] #sysctl -p #使设置生效 [root@lb ~] #modprobe ip_vs #加载ip_vs内核模块 [root@lb ~] #lsmod |grep ip_vs #查看内核模块是否开启 [root@lb ~] #yum -y install ipvsadm #安装ip_vs规则编写工具 [root@lb ~] #systemctl stop ipvsadm #清空原有内部规则 [root@lb ~] #ipvsadm -A -t 192.168.0.88:80 -s -rr #指定集群的VIP地址,rr表示调度算法为轮询 [root@lb ~] #ipvsadm -a -t 192.168.0.88:80 -r 192.169.92.102 -m #添加ld所能调度的服务器:RS1;-m表示NAT模式 [root@lb ~] #ipvsadm -a -t 192.168.0.88:80 -r 192.168.92.103 -m #添加ld所能调度的服务器:RS2 [root@lb ~] #ipvsadm -a -t 192.168.0.88:80 -r 192.168.92.104 -m #添加ld所能调度的服务器:RS3 [root@lb ~] #ipvsadm-save > /etc/ipvsadm_guize #将规则保存到指定文件里(该文件可以自己定义),当规则清除了的时候可以通过:ipvsadm -R < /etc/ipvsadm_guize 命令来重新生成规则 [root@lb ~] #ipvsadm -L -n #查看规则情况 |
3.客户端访问测试
1 2 3 | [root@client ~] #yum -y install elinks [root@client ~] #elinks --dump http://192.168.0.88 #重复执行盖命令看执行访问页面是否会变化 |
案例二:搭建LVS的DR模式
DR模式由于RS服务器也有一个VIP,所以当RS服务器收到请求之后,可以直接通过网关(路由器)直接将请求返回给客户端,因此相比于NAT模式来说LVS调度器的压力会小很多
系统 | 所需IP | 所需软件 |
CentOS7.4/LB |
DIP:192.168.92.101 VIP:192.168.92.88 |
镜像ISO文件里面有 |
CentOS7.4/RS1 |
RIP:192.168.92.102 VIP:192.168.92.88 |
镜像ISO文件里面有 |
CentOS7.4/RS2 |
RIP:192.168.92.103 VIP:192.168.92.88 |
镜像ISO文件里面有 |
CentOS7.4/RS3 |
RIP:192.168.92.104 VIP:192.168.92.88 |
镜像ISO文件里面有 |
CentOS7.4/GW |
①ens33:192.168.0.100 ②ens37:192.68.92.100 |
镜像ISO文件里面有 |
CentOS7.4/Client | CIP:192.168.0.140 | 镜像ISO文件里面有 |
1.三台RS服务器安装httpd服务,采用yum安装的方式,这里只列举一台
1 2 3 4 5 6 7 | [root@rs1 ~] #yum -y install httpd [root@rs1 ~] #echo "this is $(hostname)" >> /var/www/html/index.html [root@rs1 ~] #systemctl start httpd [root@rs1 ~] #systemctl enable httpd |
2.配置LVS调度器的VIP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@lb ~] #cat <<END >/etc/sysconfig/network-scripts/ifcfg-ens33:0 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no NAME=ens33:0 DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.92.88 PREFIX=24 GATEWAY=192.168.92.100 END [root@lb ~] #systemctl restart network [root@lb ~] #ip a|grep 192.168 |
3.开启调度器的ip_vs内核调度功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@lb ~] #modprobe ip_vs [root@lb ~] #lsmod |grep ip_vs [root@lb ~] #yum -y install ipvsadm [root@lb ~] #systemctl stop ipvsadm [root@lb ~] #ipvsadm -A -t 192.168.92.88:80 -s -rr [root@lb ~] #ipvsadm -a -t 192.168.92.88:80 -r 192.169.92.102 -g #-g表示采用DR模式调度,DR模式调度不支持端口转发, [root@lb ~] #ipvsadm -a -t 192.168.92.88:80 -r 192.168.92.103 -g [root@lb ~] #ipvsadm -a -t 192.168.92.88:80 -r 192.168.92.104 -g [root@lb ~] #ipvsadm -Ln [root@lb ~] #ipvsadm-save > /etc/ipvsadm_guize |
4.在RS上的本地回环网卡添加一个VIP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@lb ~] #echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore #抑制arp广播 [root@lb ~] #echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce [root@lb ~] #echo "1" > /proc/sys/net/ipv4/conf/all/arp_announce [root@lb ~] #echo "2" > /proc/sys/net/ipv4/conf/all/arp_ignore [root@lb ~] #cat <<END >/etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 IPADDR=192.168.92.88 NETMASK=255.255.255.255 ONBOOT=yes NAME=lo:0 END [root@lb ~] #systemctl restart network [root@lb ~] #ip a|grep 192.168 |
5.客户端访问测试
1 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话