LVS:Linux Virtual Sevser,Linux虚拟服务器,由章文嵩先生成立的有关负载均衡的开源项目。基于Linux内核。优化后并发量可以达到百万级。
NAT模式NAT(Network Address Translation)网络地址转换,内网主机可以通过路由NAT实现访问外网主机。
- client请求资源,当报文到达director时,源和目标IP是CIP-VIP,IPVS会强行修改目标地址为RIP,将报文从INPUT发向POSTROUTING,源和目标IP修改为CIP-RIP,RS验证目标地址是本地地址,则接受报文并处理请求。
- RS响应请求,由于请求报文源IP是CIP,所以响应报文的目标IP是CIP;将响应报文发送给网关director后,director会通过SNAT将源IP修改为VIP,这样client才可以明确是响应它请求报文的数据包。
特点:
- director与RS必须在同一个局域网呢
- RS的网关必须指向director的私网DIP。
- 请求和响应报文都需要director转发,会成为整个系统的瓶颈。
- 支持端口映射,client访问80端口,director可以映射到RS的8080端口上。
- director必须是Linux系统。
- director需要两个网卡,一个与互联网通信的公网VIP,一个与RS通信的私网DIP。
IP隧道技术又称IP封装,在源和目标IP地址的基础上,利用新的源和目标IP地址对数据报文进行第二次封装。
- client请求资源,源和目标IP为CIP-VIP的报文到达director,IPVS会利用隧道技术将DIP-RIP封装在请求报文中,经POSTROUTING链发送至RS,RS本地需要配置tunl0地址为VIP,当RS接收到报文,二次封装的目标地址RIP为本地eth0地址,原始目标地址VIP为本地tunl0地址,所以RS就会认定是发送给自己的数据包,就会处理请求。
- RS响应请求,由于请求报文源和目标IP是CIP-VIP,所以响应报文的源和目标地址应为VIP-CIP;此时报文会经由RS的网关路由一直送达client。
特点:
- VIP、DIP、RIP都是公网IP。
- RS网关不会也不能指向DIP。
- 请求报文经过director,响应报文直接由RS发送给client,director不再成为系统瓶颈。
- RS必须支持隧道技术。
- 不支持端口映射。
- client请求资源,请求报文经过路由到达交换机,然后交换机查看目标IP为VIP,则修改源和目标MAC后再封装报文发送给director,IPVS则将报文源MAC修改为DIP的MAC地址,目标MAC修改为RIP的MAC地址,然后经POSTROUTING链发送出去,通过交换机转送给RS。DR模式会lo接口上配置一个虚拟地址VIP,当RS收到报文拆封发现目标MAC地址是自己,目标IP地址也是自己的lo地址VIP,就会处理请求。
- RS响应请求,由于请求报文的目标IP是VIP,所以响应报文就通过lo接口传送到eth0网卡发出。
特点:
- 保证前端路由将目标地址为VIP的报文全部发送给DS,而不是RS
- RS的RIP可以使用私有地址,但也可以使用公网地址
- RS和director必须在同一物理网络中
- 请求报文有director调度,但响应报文不一定经由director
- 不支持端口映射
- RS的网关不能指向DIP
调度算法:
- rr,轮询算法(round robin),调度器会将所有的请求平均分配给每个服务器。
- wrr,加权轮询(weight round robin),给每个RS分配权重比例。
- lc,最小连接(least connections),把新请求分配到当前连接数最小的服务器上,,集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载
- wlc,加权最小连接(weight least connections),在lc算法上为每台服务器分配上权重比例。
环境:
| 名称 | IP |
|---|---|
| LVS服务器(DR) | 192.168.72.138 |
| apache服务器(RS-1) | 192.168.72.135 |
| apache服务器(RS-2) | 192.168.72.131 |
[root@DR ~]# ip addr add 192.168.72.200/32 dev eth0 [root@DR ~]# ip a 1: lo:2.RS上配置arp内核参数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: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:2e:a5:d7 brd ff:ff:ff:ff:ff:ff inet 192.168.72.138/24 brd 192.168.72.255 scope global dynamic noprefixroute eth0 valid_lft 1744sec preferred_lft 1744sec inet 192.168.72.200/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe2e:a5d7/64 scope link valid_lft forever preferred_lft forever [root@DR ~]#
[root@RS-1 ~]# vim /etc/sysctl.conf [root@RS-1 ~]# tail -2 /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 [root@RS-1 ~]# [root@RS-1 ~]# sysctl -p net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 [root@RS-1 ~]# [root@RS-2 ~]# vim /etc/sysctl.conf [root@RS-2 ~]# tail -2 /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 [root@RS-2 ~]# sysctl -p net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 [root@RS-2 ~]#3.RS上配置VIP
一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告
LVS服务器的eth0网卡的IP:192.168.72.200作为VIP
两台RS上都要做[root@RS-1 ~]# ip addr add 192.168.72.200/32 dev lo [root@RS-2 ~]# ip addr add 192.168.72.200/32 dev lo所有RS上都要做
[root@RS-1 ~]# route add -host 192.168.72.200/32 dev lo [root@RS-1 ~]# cd /etc/sysconfig/network-scripts [root@RS-1 network-scripts]# ls [root@RS-1 network-scripts]# cat route-lo 192.168.72.200/32 via dev lo [root@RS-1 network-scripts]# [root@RS-2 ~]# route add -host 192.168.72.200/32 dev loDR上配置lvs-dr转发规则
[root@DR ~]# yum -y install ipvsadm Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. 上次元数据过期检查:1:11:58 前,执行于 2021年10月14日 星期四 04时51分23秒。 依赖关系解决。 ============================================= 软件包 架构 版本 仓库 大小 ============================================= 安装: ipvsadm x86_64 1.31-1.el8 AppStream 59 k 事务概要 ============================================= 安装 1 软件包 总下载:59 k 安装大小:86 k 下载软件包: ipvsadm-1.31 144 kB/s | 59 kB 00:00 --------------------------------------------- 总计 143 kB/s | 59 kB 00:00 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 安装 : ipvsadm-1.31-1.el8.x86_64 1/1 运行脚本: ipvsadm-1.31-1.el8.x86_64 1/1 验证 : ipvsadm-1.31-1.el8.x86_64 1/1 Installed products updated. 已安装: ipvsadm-1.31-1.el8.x86_64 完毕! [root@DR ~]# ipvsadm -A -t 192.168.72.200:80 -s rr [root@DR ~]# ipvsadm -a -t 192.168.72.200:80 -r 192.168.72.135:80 -g [root@DR ~]# ipvsadm -a -t 192.168.72.200:80 -r 192.168.72.131:80 -g [root@DR ~]# ipvsadm -Sn -A -t 192.168.72.200:80 -s rr -a -t 192.168.72.200:80 -r 192.168.72.131:80 -g -w 1 -a -t 192.168.72.200:80 -r 192.168.72.135:80 -g -w 1 [root@DR ~]# [root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm [root@DR ~]#4.RS上配置http并启动
[root@RS-1 ~]# yum -y install httpd [root@RS-1 ~]# echo 'rs1' > /var/www/html/index.html [root@RS-1 ~]# systemctl start httpd [root@RS-2 ~]# yum -y install httpd [root@RS-2 ~]# echo 'rs2' > /var/www/html/index.html [root@RS-2 ~]# systemctl start httpd5.客户端访问测试
[root@localhost ~]# for i in $(seq 10);do curl 192.168.72.250:80;done rs2 rs1 rs2 rs1 rs2 rs1 rs2 rs1 rs2 rs1 [root@localhost ~]# ``lvs的NAT模式配置http负载均衡
//在DR上配置DIP(135)和VIP(250) [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE="Ethernet" BOOTPROTO="static" NAME="eth0" DEVICE="eth0" onBOOT="yes" IPADDR0=192.168.72.138 GATEWAY=192.168.72.1 NETMASK0=255.255.255.0 IPADDR1=192.168.72.250 GATEWAY1=192.168.72.1 //在RS上分别配置RIP,并将网关指向DIP [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE="Ethernet" BOOTPROTO="static" NAME="eth0" DEVICE="eth0" onBOOT="yes" IPADDR=192.168.72.135 PREFIX=24 GATEWAY=192.168.72.138 DNS1=114.114.114.114 DNS2=8.8.8.8 [root@localhost ~]# [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes NAME=eth0 DEVICE=eth0 onBOOT=yes IPADDR=192.168.72.131 PREFIX=24 GATEWAY=192.168.72.138 DNS1=192.168.72.1 //在DR上开启IP转发,配置转发规则 [root@localhost ~]# sysctl -p net.ipv4.ip_forward = 1 [root@localhost ~]# //配置规则 [root@localhost ~]# ipvsadm -A -t 192.168.72.250:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.72.250:80 -r 192.168.72.131:80 -m [root@localhost ~]# ipvsadm -a -t 192.168.72.250:80 -r 192.168.72.135:80 -m [root@localhost ~]# ipvsadm -Sn -A -t 192.168.72.250:80 -s rr -a -t 192.168.72.250:80 -r 192.168.72.131:80 -m -w 1 -a -t 192.168.72.250:80 -r 192.168.72.135:80 -m -w 1 //保存 [root@localhost ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm //在RS上分别配置HTTP [root@localhost ~]# echo 'rs1' > /var/www/html/index.html [root@localhost ~]# echo 'rs2' > /var/www/html/index.html //验证 [root@localhost ~]# for i in $(seq 10);do curl 192.168.72.250:80;done rs1 rs2 rs1 rs2 rs1 rs2 rs1 rs2 rs1 rs2



