基于LVS DR(Direct Routing)模型负载均衡集群实现
基于LVS DR(Direct Routing)模型负载均衡集群实现LVS工作模式直接路由,LVS默认模式,请求报文要经由Director,但响应报文由RS直接发往Client,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标 IP/PORT均保持不变[*]Director和各RS都配置有VIP
[*]在RS上修改内核参数以限制arp通告及应答级别(也可在路由器绑定MAC地址),确保前端路由器将目标IP为VIP的请求报文发往Director
[*]RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络; RIP的网关不能指向DIP,以确保响应报文不会经由Director
[*]RS和Director要在同一个物理网络
[*]请求报文要经由Director,但响应报文不经由Director,而由RS直接发往 Client
[*]不支持端口映射(端口不能修败)
[*]RS可使用大多数操作系统系统
如下图,此处只为演示LVS DR模型,故不考虑其它诸如高可用之类的https://www.s4lm0x.com/usr/uploads/2019/05/3593319031.png请求及响应过程以上图为参考,客户端所访问的服务为http,通信过程可简单划分为五个阶段
[*]第一阶段: 客户端发起请求,此时源地址为客户端地址(CIP),源MAC地址为客户端AMC地址,目的地址为VIP,MAC地址为Router的R1接口MAC地址
[*]第二阶段: 路由器收到数据报文后,通过查看路由表,得知目标地址是VIP,将报文转发至VIP,对应地址如下表
[*]第三阶段: LVS根据负载均衡算法选择一台active的RealServer(假设是RS1),将此RIP所在网卡的MAC地址作为目标MAC地址,发送到局域网里
[*]第四阶段: RealServer(RS1)在局域网中收到数据报文,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文,随后重新封装报文,发送到路由器
[*]第五阶段: 路由器将数据包路由转发至CIP
| - | SRC | DEST |
| :-: | :-: | :-: |
| 1 | Client MAC,CIP xxxx | R1 MAC,VIP 80 |
| 2 | R2 MAC,CIP xxxx | VIP MAC,VIP 80 |
| 3 | VIP MAC,CIP xxxx | RS1 MAC,VIP 80 |
| 4 | RS1 MAc,VIP 80 | R2 MAC,CIP xxxx |
| 5 | R1 MAC,VIP 80 | Client MAC,CIP xxxx |配置实现假设Client与RouterR1接口上的IP地址以及VIP为公网IP地址,那么理论上Client是不可以直接访问Real Server的Real Server配置Real Server为CentOS 7,在RS1,RS2上安装httpd,理论上两个节点所提供的内容完全一致,为能清楚的看到调度,故两个节点提供不同的内容以示区别
[*]两个节点IP地址配置如下,将网关指向Router的R2接口,其上都运行httpd以提供服务
| 节点 | RIP | VIP | GW | Application |
| :-: | :-: | :-: | :-: | :-: |
| RS1 | 192.168.10.6 | 192.168.10.5 | 192.168.10.11 | httpd |
| RS2 | 192.168.10.7 | 192.168.10.5 | 192.168.10.11 | httpd |
[*]配置RS1 IP
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=192.168.10.6PREFIX=24EOFBash
Copy
[*]配置RS2 IP
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=192.168.10.7PREFIX=24EOFBash
Copy
[*]将SELinux临时关闭,并设置开机禁用
setenforcesed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/configBash
Copy
[*]关闭firewalld禁止开机自启
systemctl disable --now firewalldiptables -FBash
Copy
[*]安装httpd,并配置
[root@rs1 ~# yum install -y httpd[root@rs1 ~# echo "<h1>test page on RS1</h1>" > /var/www/html/index.html[root@rs1 ~# systemctl start httpd[root@rs2 ~# yum install -y httpd[root@nrs2 ~# echo "<h1>test page on RS2</h1>" > /var/www/html/index.html[root@rs2 ~# systemctl start httpdBash
Copy
[*]修改内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 1 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announceecho 2 > /proc/sys/net/ipv4/conf/lo/arp_announceBash
Copy
web服务已配置完成,此时配置VIP,将VIP绑定在lo接口的别名lo:0上,以下操作两个节点都进行
[*]配置VIP
ap addr add 192.168.10.5 dev lo:0Bash
Copy
配置客户端客户端无需过多的配置,确保网络能到达路由器且路由器能返回数据包即可
[*]Client IP配置
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-ens192DEVICE=ens192NAME=ens192BOOTPROTO=staticIPADDR=172.22.35.180PREFIX=16GATEWAY=172.22.35.181ONBOOT=yesEOFBash
Copy
Router配置根据事先规划,Router节点需要添加两块网卡,分别配置上两个网络的地址,路由器无需指定网关| ifname | IP | prefix |
| :-: | :-: | :-: |
| eth0 | 172.22.35.181 | 16 |
| eth1 | 192.168.2.11 | 24 |
[*]配置IP
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=172.22.35.181PREFIX=16ONBOOT=yesEOFcat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth1DEVICE=eth1NAME=eth1BOOTPROTO=staticIPADDR=192.168.10.11PREFIX=16ONBOOT=yesEOFBash
Copy
[*]开启路由转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/net.confsysctl --systemBash
Copy
[*]将SELinux临时关闭,并设置开机禁用
setenforcesed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/configBash
Copy
[*]关闭firewalld禁止开机自启
systemctl disable --now firewalldiptables -FBash
Copy
Director节点配置| 节点 | DIP | DIP | GW |
| :-: | :-: | :-: | :-: |
| Director | 192.168.10.8 | 192.168.10.5 | 192.168.10.11 |
[*]配置DIP
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=192.168.10.8PREFIX=24GATEWAY=192.168.10.11ONBOOT=yesEOFBash
Copy
[*]将SELinux临时关闭,并设置开机禁用
setenforcesed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/configBash
Copy
[*]关闭firewalld禁止开机自启
systemctl disable --now firewalldiptables -FBash
Copy
[*]绑定VIP
ip addr add 192.168.10.5 dev lo:0Bash
Copy
[*]安装ipvs前端管理工具ipvsadm
yum install -y ipvsadmBash
Copy
[*]添加调度策略
ipvsadm -A -t 192.168.10.5:80 -s wrripvsadm -a -t 192.168.10.5:80 -r 192.168.10.6 -w 1ipvsadm -a -t 192.168.10.5:80 -r 192.168.10.7 -w 1Bash
Copy
Client 访问测试while true; do curl 192.168.10.5; sleep 1; done
页:
[1]