基于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模型,故不考虑其它诸如高可用之类的 请求及响应过程以上图为参考,客户端所访问的服务为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 | cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=192.168.10.6PREFIX=24EOF[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=192.168.10.7PREFIX=24EOF[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
setenforcesed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
systemctl disable --now firewalldiptables -F[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
[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 httpd[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
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_announce[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
web服务已配置完成,此时配置VIP,将VIP绑定在lo接口的别名lo:0上,以下操作两个节点都进行 ap addr add 192.168.10.5 dev lo:0[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
配置客户端客户端无需过多的配置,确保网络能到达路由器且路由器能返回数据包即可 cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-ens192DEVICE=ens192NAME=ens192BOOTPROTO=staticIPADDR=172.22.35.180PREFIX=16GATEWAY=172.22.35.181ONBOOT=yesEOF[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
Router配置根据事先规划,Router节点需要添加两块网卡,分别配置上两个网络的地址,路由器无需指定网关
| ifname | IP | prefix |
| :-: | :-: | :-: |
| eth0 | 172.22.35.181 | 16 |
| eth1 | 192.168.2.11 | 24 | 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=yesEOF[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/net.confsysctl --system[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
setenforcesed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
systemctl disable --now firewalldiptables -F[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
Director节点配置| 节点 | DIP | DIP | GW |
| :-: | :-: | :-: | :-: |
| Director | 192.168.10.8 | 192.168.10.5 | 192.168.10.11 | cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0NAME=eth0BOOTPROTO=staticIPADDR=192.168.10.8PREFIX=24GATEWAY=192.168.10.11ONBOOT=yesEOF[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
setenforcesed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
systemctl disable --now firewalldiptables -F[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
ip addr add 192.168.10.5 dev lo:0[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
yum install -y ipvsadm[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
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 1[size=0.8em]Bash
[size=0.8em][url=]Copy[/url]
Client 访问测试while true; do curl 192.168.10.5; sleep 1; done
|