Linux,network,system,http,web

基于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模型,故不考虑其它诸如高可用之类的

请求及响应过程

以上图为参考,客户端所访问的服务为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 |

配置实现

假设ClientRouterR1接口上的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-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.6
PREFIX=24
EOF
  • 配置RS2 IP
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.7
PREFIX=24
EOF
  • SELinux临时关闭,并设置开机禁用
setenforce
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  • 关闭firewalld禁止开机自启
systemctl disable --now firewalld
iptables -F
  • 安装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 httpd
  • 修改内核参数
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

web服务已配置完成,此时配置VIP,将VIP绑定在lo接口的别名lo:0上,以下操作两个节点都进行

  • 配置VIP
ap addr add 192.168.10.5 dev lo:0

配置客户端

客户端无需过多的配置,确保网络能到达路由器且路由器能返回数据包即可

  • Client IP配置
cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-ens192
DEVICE=ens192
NAME=ens192
BOOTPROTO=static
IPADDR=172.22.35.180
PREFIX=16
GATEWAY=172.22.35.181
ONBOOT=yes
EOF

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-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=172.22.35.181
PREFIX=16
ONBOOT=yes
EOF

cat <<EOF | tee /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.10.11
PREFIX=16
ONBOOT=yes
EOF
  • 开启路由转发
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/net.conf
sysctl --system
  • SELinux临时关闭,并设置开机禁用
setenforce
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  • 关闭firewalld禁止开机自启
systemctl disable --now firewalld
iptables -F

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-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.10.8
PREFIX=24
GATEWAY=192.168.10.11
ONBOOT=yes
EOF
  • SELinux临时关闭,并设置开机禁用
setenforce
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  • 关闭firewalld禁止开机自启
systemctl disable --now firewalld
iptables -F
  • 绑定VIP
ip addr add 192.168.10.5 dev lo:0
  • 安装ipvs前端管理工具ipvsadm
yum install -y ipvsadm
  • 添加调度策略
ipvsadm -A -t 192.168.10.5:80 -s wrr
ipvsadm -a -t 192.168.10.5:80 -r 192.168.10.6 -w 1
ipvsadm -a -t 192.168.10.5:80 -r 192.168.10.7 -w 1

Client 访问测试

while true; do curl 192.168.10.5; sleep 1; done

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

微信扫一扫,向我赞赏

支付宝扫一扫,向我赞赏

回复

This is just a placeholder img.