部署LVS-DR群集

LVS-DR(Linux Virtual Server - Direct Routing)是Linux虚拟服务器的一种工作模式,常用于实现负载均衡群集。
LVS-DR的工作原理:
Director Server(负载均衡器)作为群集的访问入口,但不作为网关使用。为了响应对整个群集的访问,Director Server与Real Server(真实服务器)都需要配置VIP(虚拟IP地址),且它们需在同一个网络中,返回给客户端的数据不需要经过Director Server。客户端向目标VIP发送请求,负载均衡器接收后,根据负载均衡算法选择后端的真实服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为后端真实服务器的MAC地址,然后在局域网上发送。后端真实服务器收到这个帧,解封装后发现目标IP与本机匹配(事先绑定了VIP),于是处理这个报文,随后重新封装报文,将响应报文通过lo接口传送给物理网卡然后向外发出,客户端将收到回复报文,且客户端认为得到正常的服务,而不会知道是哪一台服务器处理的。如果跨网段,则报文通过路由器经由互联网返回给用户。


LVS-DR的特性包括:
1.Director Server和Real Server必须在同一个物理网络中。
2.Real Server可以使用私有地址,也可以使用公网地址。若使用公网地址,可通过互联网对RIP进行直接访问。
3.Director Server作为群集的访问入口,但不作为网关使用。
4.所有的请求报文经由Director Server,但回复响应报文不能经过Director Server。
5.Real Server的网关不允许指向Director Server IP,即Real Server发送的数据包不允许经过Director Server。
6.Real Server上的lo接口配置VIP的IP地址。


LVS-DR中的ARP问题及解决方法:
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都配置相同的VIP地址,会造成ARP通信紊乱。当ARP广播发送到集群时,负载均衡器和节点服务器都会接收。为解决此问题:
对节点服务器进行处理,使其不响应针对VIP的ARP请求。可使用虚接口lo:0承载VIP地址,并设置内核参数arp_ignore=1,让系统只响应目的IP为本地IP的ARP请求。
Real Server返回报文(源IP是VIP)经路由器转发时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址,这可能导致路由器更新ARP表项,使Director的VIP失效。解决方法是对节点服务器进行处理,设置内核参数arp_announce=2,让系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址。
 

直接路由模式

直接路由模式(Direct Routing,简称DR模式)是一种常见的网络负载均衡技术。
DR模式的工作原理是:通过在调度器(通常称为 Director Server,简称 DS)上修改请求报文的目标MAC地址,将请求发给真实服务器(通常称为 Real Server,简称 RS),而真实服务器响应后的处理结果直接返回给客户端用户。
DR模式的特点包括:
1. 所有的请求报文都是由调度器进行调度的。
2.直接由后端服务器把数据返回给客户端,不需要逆向发送数据包,调度器只专注做调度,效率很高。
3.不支持端口映射。
4.RS 和 DS 必须在同一网络,可以不在同一网段,使用交换机即可。
5.MAC 地址在第二层数据链路层,还没有到 IP 所在的网络层。
6.Real Server 的 RIP(后端服务器的 IP 地址)和 Director 的 DIP(调度器和后端服务器通信的 IP)必须处于同一网段中,以便使用 MAC 地址进行通信。

要实现 DR 模式,需要进行如下配置:


1.在调度器上安装相关服务,如 ipvsadm。
2.为调度器设置两个 IP 地址:DIP 配置在接口上,VIP 配置在网卡接口别名上。
3.在各真实服务器上进行如下配置:RIP 配置在接口上,VIP 配置在 lo 的别名上;定义内核参数,禁止响应对 VIP 的 ARP 广播请求;添加一个路由,确保请求目标 IP 是 VIP 时,响应的源地址也显示为 VIP。
4.在调度器上使用相关命令添加集群服务和真实服务器信息。
5.DR 模式的优点是没有 IP 隧道的开销,对真实服务器也没有必须支持 IP 隧道协议的要求,且能极大地提高集群系统的伸缩性,在互联网中使用较多。但它要求调度器与真实服务器在同一个局域网环境。
6.在实际应用中,需注意网络环境的配置和相关参数的设置,以确保 DR 模式的正常工作和性能优化。同时,还需考虑到可能出现的问题,如恶意连接导致某台后端服务器瘫痪等,并采取相应的解决措施。

配置负载调度器

(1)配置虚拟IP地址VIP

[root@localhost ~]# cd /etc/sysconfig/network-scripts/

[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0

[root@localhost network-scripts]# vi ifcfg-ens33:0

TYPE=Ethernet

BOOTPROTO=static

NAME=ens33:0

DEVICE=ens33:0

ONBOOT=yes

IPADDR=192.168.10.172

NETMASK=255.255.255.0

[root@localhost network-scripts]# systemctl restart network

(2)调整内核参数,禁止转发重定向报文

由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭Linux 内核的重定向

[root@localhost ~]# vi /etc/sysctl.conf

在末尾添加:

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.ens33.send_redirects = 0

[root@localhost ~]# sysctl -p

(3)配置负载分配策略

[root@localhost ~]#yum -y install ipvsadm

[root@localhost ~]#ipvsadm -v           \\查看版本

[root@localhost ~]# setenforce 0

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]#ipvsadm -C

[root@localhost ~]# ipvsadm -A -t 192.168.10.172:80 -s rr

[root@localhost ~]# ipvsadm -a -t 192.168.10.172:80 -r 192.168.10.102 -g -w 1

[root@localhost ~]# ipvsadm -a -t 192.168.10.172:80 -r 192.168.10.103 -g -w 1

[root@localhost ~]# ipvsadm-save

-A -t localhost.localdomain:http -s rr

-a -t localhost.localdomain:http -r 192.168.10.102:http -g -w 1

-a -t localhost.localdomain:http -r 192.168.10.103:http -g -w 1

[root@localhost ~]# systemctl enable ipvsadm

3:配置web节点服务器

(1)配置虚拟ip地址VIP

[root@localhost ~]# setenforce 0

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]#cd /etc/sysconfig/network-scripts/

[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0

[root@localhost network-scripts]# vi ifcfg-lo:0

修改

DEVICE=lo:0

NETMASK=255.255.255.255           \\子网掩码必须为255.255.255.255

IPADDR=192.168.10.172

ONBOOT=yes

[root@localhost network-scripts]# systemctl restart network

[root@localhost network-scripts]# ifconfig

[root@localhost network-scripts]# cd

[root@localhost ~]# vi /etc/rc.local

添加

/sbin/route add -host 192.168.10.172 dev lo:0

[root@localhost ~]# route add -host 192.168.10.172 dev lo:0

(2)调整内核参数

[root@localhost ~]# vi /etc/sysctl.conf

添加:

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.default.arp_ignore = 1

net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

注释:

arp_ignore =1    

当收到arp请求时,只有ARP请求数据包所请求的IP地址属于当前网卡的IP地址,才会回应ARP响应数据包。

arp_announce = 2

当发送arp请求时,忽略IP数据包的源IP地址,总是选择网卡所配置的首选IP地址作为ARP请求数据包的发送方IP地址

目的:因为lo:0的ip地址和调度器的ens33:0的ip地址是一样的,为了不造成ip冲突,要禁止更新VIP的mac地址。

[root@localhost ~]# sysctl -p

(3)安装httpd创建测试网页

[root@localhost ~]# yum -y install httpd

yum install nfs-utils

[root@localhost ~]# mount 192.168.10.105:/opt/wwwroot /var/www/html

[root@localhost ~]#vi /var/www/html/index.html

<h1>LVS负载均衡群集--测试页面01</h1>

(4)启用httpd服务

[root@localhost ~]# systemctl start httpd

(5)配置第二台web节点

配置方法与第一台完全相同

注意:在实验环境中,为了验证负载过程,第二台web服务器的网站可以可第一个不一样,所以这两个web服务器就没有必要使用NFS,直接在web服务器本地创建测试网页文件即可

4:在client上测试网站

http://192.168.10.172

测试时频繁刷新页面

也可以用脚本测试:

[root@localhost ~]# for i in $(seq 10); do curl http://192.168.10.172  ;done

5:在LVS调度器上查看LVS策略

[root@localhost ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.10.172:80 rr

  -> 192.168.10.102:80             Route   1      0          0         

  -> 192.168.10.103:80             Route   1      0          0  

相关推荐

  1. 部署LVS-DR

    2024-07-09 21:50:04       5 阅读
  2. 部署LVS-DR

    2024-07-09 21:50:04       10 阅读

最近更新

  1. python 基础知识点(一)

    2024-07-09 21:50:04       0 阅读
  2. Python利用psutil库进行监控进程和资源

    2024-07-09 21:50:04       0 阅读
  3. SpringBoot RestHighLevelClient 按版本更新

    2024-07-09 21:50:04       0 阅读
  4. 跨域问题几种解决方法

    2024-07-09 21:50:04       0 阅读
  5. Python面试整理-文件处理

    2024-07-09 21:50:04       0 阅读
  6. 分式

    2024-07-09 21:50:04       0 阅读
  7. Spring WebFlux 介绍与效果演示示例

    2024-07-09 21:50:04       0 阅读
  8. django 需要修改的文件

    2024-07-09 21:50:04       0 阅读

热门阅读

  1. WordPress禁止用户注册某些用户名

    2024-07-09 21:50:04       9 阅读
  2. go内存返还系统相关代码

    2024-07-09 21:50:04       8 阅读
  3. 如何使用 Puppeteer 避免机器人检测?

    2024-07-09 21:50:04       6 阅读
  4. 面试经典 150 题

    2024-07-09 21:50:04       7 阅读
  5. MySQL8之mysql-community-common的作用

    2024-07-09 21:50:04       6 阅读
  6. 机器学习综述

    2024-07-09 21:50:04       7 阅读
  7. Qt | Qt常用类列举和说明

    2024-07-09 21:50:04       5 阅读