写点什么

构建 LVS 负载均衡集群

作者:lyshark
  • 2023-01-25
    山东
  • 本文字数:8101 字

    阅读完需:约 27 分钟

LVS 即 Linux 虚拟服务器,目前 LVS 已经被集成到 Linux 内核模块中,该项目在 Linux 内核实现了基于 IP 的数据请求负载均衡调度方案,LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器.整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序.为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性.


LVS(Linux Virtual Server) 的作用


LVS 主要用于服务器集群的负载均衡,它工作在网络层,可以实现高性能,高可用的服务器集群技术.它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器.它易用,配置非常简单,且有多种负载均衡的方法.它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果.另外可扩展性也非常好.


LVS 自从 1998 年开始,发展到现在已经是一个比较成熟的技术项目了.可以利用 LVS 技术实现高可伸缩的、高可用的网络服务,例如 WWW 服务、Cache 服务、DNS 服务、FTP 服务、MAIL 服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用 LVS 架设的集群系统.


LVS 的体系结构,使用 LVS 架设的服务器集群系统有三个部分组成:

● 最前端的负载均衡层,用 Load Balancer 表示● 中间的服务器集群层,用 Server Array 表示● 最底端的数据共享存储层,用 Shared Storage 表示


LVS(Linux Virtual Server) 负载均衡机制


LVS 是四层负载均衡,也就是说建立在 OSI 模型的第四层传输层之上,传输层上有我们熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的负载均衡.因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的.


Load Balancing 负载均衡,可以减轻单台服务器压力,不同节点之间相互独立,不共享任何资源.通过一定算法将客户端的访问请求平分到群集的各个节点上,充分利用每个节点的资源.负载均衡扩展了网络设备和服务器带宽,增加吞吐量,加强网络数据处理能力.


负载均衡集群分类


软件实现: LVS RAC MySQLProxy Nginx HaProxy 硬件实现: F5 citrix array 深信服 梭子鱼


负载均衡集群的区别


1.触发条件不同


四层负载均衡:工作在传输层,转发数据依靠的是三层的 IP 地址 和 四层的端口(PORT).七层负载均衡:工作在应用层,转发数据依靠 URL 或主机名.


2.实现原理不同


四层负载均衡:TCP 连接建立一次,客户端和 RS 主机之间.七层负载均衡:TCP 连接建立两次,第一次是客户端和负载调度器,第二次是负载调度器和 RS 主机.


3.应用场景不同


四层负载均衡:TCP 应用为主或者 ERP 软件七层负载均衡:以 HTTP 协议为主,例如 apache 服务器


4.安全性不同


四层负载均衡:转发攻击七层负载均衡:拦截攻击


IPVS:钩子函数,内核机制,在请求没有到达目的地址之前,捕获并取得优先控制权的函数.IPVSADM:工作在用户空间,负责为 ipvs 内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器.


负载调度算法分类



下面我们将依次配置三种模式的集群方案,并说明原理.<br>

LVS-NAT 模式

NAT 模式简介


NAT (Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使位于企业内部的私有 IP 可以访问外网,以及外部用户可以访问位于公司内部的私有 IP 主机.LVS-NAT 工作模式拓扑结构如下图,所示 LVS 负载调度器使用两块网卡配置不同的 IP 地址,eth0,设置为私钥 IP 与内部网络通过交换设备相互连接, eth1 设置为外网 IP 与外部网络联通.



原理图解:


a).客户端将请求交给负载调度器,客户端发出数据包,此时这个数据包的源 ip 为 CIP,目标 ip 为 VIP (集群 ip).b).数据包到达负载调度器后,修改数据包的目标 ip 地址为真实服务器的 ip,此时数据包的源 ip 为 CIP,目标 ip 为 RIP.c).将数据包发送给 RS,之后 RS 响应将数据包发回给负载调度器,此时数据包的源 ip 为 RIP,目标 ip 为 CIP.d).负载调度器再转发时,会将源 ip 地址改为自己的 VIP 地址,然后再发给客户端,此时数据包的源 ip 为 VIP,目标 ip 为 CIP.


LVS-NAT 模式特点:


1.负载调度器和真实服务器,必须位于同一网络.2.真实服务器的网关必须指向 DIP.3.负载调度器必须位于客户端和真实服务器之间.4.RIP 通常都是私有地址,仅用于各个集群节点通信.5.支持端口映射,可映射为任意地址.6.真实服务器可以使用任意操作系统,负载调度器必须是 LINUX 系统.7.所有数据报文都要经过负载调度器、压力过大、最多 10 台 RS.


实验环境 IP 分配:


[实验环境]
[类型] [网卡] [IP地址] [接入模式]
LVS-NAT ens32 192.168.1.12 桥接 ens32 192.168.20.14 NAT
Read-Ser1 ens32 192.168.20.15 NATRead-Ser2 ens32 192.168.20.16 NAT
复制代码

配置 LVS 调度器

1.通过 YUM 仓库快速安装 Ipvsadm 内核管理工具.


[root@localhost ~]# yum install -y ipvsadm
Package ipvsadm-1.27-7.el7.x86_64 already installed and latest versionNothing to do
复制代码


2.开启 IP 转发,让其具有转发数据包的能力.


[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward[root@localhost ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf[root@localhost ~]# sysctl –pnet.ipv4.ip_forward=1
复制代码


3.配置 LVS-NAT 调度器,访问本机的 80 端口自动负载均衡到 15-16 这两台机器上.


[root@localhost ~]# ipvsadm -A -t 192.168.1.12:80 -s rr      #指定网卡1地址#-------------------------------------------------------------------------------#[参数说明]    -A    添加规则    -t    TCP 指定分发器VIP    -s    指定调度算法    rr    代表轮询round-robin#-------------------------------------------------------------------------------[root@localhost ~]# ipvsadm -a -t 192.168.1.12:80 -r 192.168.20.15 -m[root@localhost ~]# ipvsadm -a -t 192.168.1.12:80 -r 192.168.20.16 -m#-------------------------------------------------------------------------------#[参数说明]    -a    添加real-server地址    -r    指定real-server地址    -m    表示masquerade NAT方式的LVS#-------------------------------------------------------------------------------
复制代码


4.查看并保存结果,下面就是我们的配置结果啦.


[root@localhost ~]# ipvsadm -L -n                     #查看规则
IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.1.12:80 rr -> 192.168.20.15:80 Masq 1 0 0 -> 192.168.20.16:80 Masq 1 0 0
[root@localhost ~]# /sbin/ipvsadm-save #保存规则
复制代码


4.配置防火墙 SNAT,指定 NAT 表的 POSTROUTING.


iptables -t nat -A POSTROUTING \          #指定NAT表的POSTROUTING-s 192.168.1.0/24 \                       #指定内网的网段-o eno16777728 \                          #指定外网口网卡名称-j SNAT \                                 #指定为SNAT--to-source 59.110.167.239                #指定外网卡的地址
[root@localhost ~]# iptables -t nat -L #查看添加的规则
复制代码

配置 RS 节点

提示:RelServer 客户端每个节点都应该配置,每个节点都要执行以下操作


1.安装测试 Apache,后端的两台主机都要配置 Apache.


[root@localhost ~]# yum install -y httpd[root@localhost ~]# echo "web 1" > /var/www/html/index.html[root@localhost ~]# systemctl restart httpd
复制代码


2.RelServer 节点指定网关,指向主调度器的 eth1 网口.


[root@localhost ~]# route add default gw 192.168.20.14
复制代码


<br>

LVS-DR 模式

LVS-DR 模式简介


DR 模式也叫做直接路由模式,其体系如下图所示,该模式中 LVS 依然承载数据的入站点请求以及算法的合理选择,不同之处在于 dR 模式只负责接受请求不负责发送,真正发送请求的是后端的主机节点,这样就在一定程度上缓解了服务器的压力,但是本模式要求调度器与后端的主机必须在一个局域网中.



原理图解:


a)客户端发出数据包,源 ip 是 CIP,目标 ip 是 VIP.b)依靠路由把数据发送给负载调度器,负载调度器将数据包的源 MAC 地址修改为 DIP 的 MAC 地址,将目标 MAC 地址修改为 RIP 的 MAC 地址,此时源 ip 和目标 ip 均未修改.c)由于 DS 和 RS 在同一网络中,所以通过二层来传输,通过路由再将数据包发到 RS.d)RS 接收数据包,之后通过 lo 接口传送给 eth0 向外发出,此时的源 ip 是 VIP,目标 ip 为 CIP.e)最后通过路由的方式发给客户端.


DR 模式特点:


1.负载路由器和真实服务器,必须位于同一网络.2.真实服务器的网关必须指向路由器.3.负载调度只处理入站请求.4.RIP 可以是私有地址,也可以是公网地址.5.真实服务器可以使用任意操作系统,负载调度器必须是 LINUX 系统.6.负载调度器压力较小,支持 100 台左右的 RS.


实验环境 IP 分配:


[实验环境]
[类型] [网卡] [IP地址] [VIP/IO] [接入模式]
LVS-DR ens32 192.168.1.5 192.168.1.10(VIP) 桥接
Read-Ser1 ens32 192.168.1.13 192.168.1.10(IO) 桥接Read-Ser2 ens32 192.168.1.14 192.168.1.10(IO) 桥接
#提示: 如果是在真实环境中 RealServer 应把网关指向路由器eth1口
复制代码

配置 LVS 调度器

1.通过 YUM 仓库快速安装 Ipvsadm 内核管理工具.


[root@localhost ~]# yum install -y ipvsadm
Package ipvsadm-1.27-7.el7.x86_64 already installed and latest versionNothing to do
复制代码


2.修改内核参数,防止相同网络地址广播冲突.


[root@localhost ~]# echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf[root@localhost ~]# echo "net.ipv4.conf.ens32.send_redirects = 0" >> /etc/sysctl.conf[root@localhost ~]# echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p #刷新内核参数net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.ens32.send_redirects = 0net.ipv4.conf.default.send_redirects = 0
[root@localhost ~]# modprobe ip_vs && echo "ok" || echo "error" #查看内核是否加载ok
复制代码


3.配置一个网卡子接口,此处我们在ens32接口上配置一个子接口ens32:0,这个子接口也就是VIP的地址,并添加一条路由记录.


[root@localhost ~]# ifconfig ens32ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 192.168.1.5  netmask 255.255.255.0  broadcast 192.168.1.255        inet6 fe80::5fbb:43ab:da3:f589  prefixlen 64  scopeid 0x20<link>        ether 00:0c:29:1e:14:e2  txqueuelen 1000  (Ethernet)        RX packets 4597  bytes 5186429 (4.9 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 1711  bytes 177437 (173.2 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]# ifconfig ens32:0 192.168.1.10 netmask 255.255.255.0 #在ens32添加子接口,VIP的地址[root@localhost ~]# ifconfig ens32:0ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 ether 00:0c:29:1e:14:e2 txqueuelen 1000 (Ethernet)
[root@localhost ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens32192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32
[root@localhost ~]# route add -host 192.168.1.10 dev ens32 #在ens32上添加一条路由记录[root@localhost ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens32192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32192.168.1.10 0.0.0.0 255.255.255.255 UH 0 0 0 ens32
复制代码


4.接下来配置我们的 LVS 负载调度器,指定 VIP 地址和使用轮询算法,并保存永久生效.


[root@localhost ~]# ipvsadm -A -t 192.168.1.10:80 -s rr                   #添加虚拟服务指定VIP地址#---------------------------------------------------------------------------------#[参数说明]  -A  添加规则  -t  TCP 指定分发器VIP  -s  指定调度算法  rr  代表轮询round-robin#---------------------------------------------------------------------------------[root@localhost ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.13:80 -g    #针对虚拟服务添加RS节点[root@localhost ~]# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.14:80 -g    #针对虚拟服务添加RS节点#---------------------------------------------------------------------------------#[参数说明]  -a  添加real-server地址  -r  指定real-server地址  -m  以NAT模式分配  -g  以DR模式分配  -w  指定权值#---------------------------------------------------------------------------------
复制代码


5.检查 LVS 的轮询配置规则,并保存配置文件,此处记得放行放火墙规则.


[root@localhost ~]# ipvsadm -L -n --stats         #查看VIP和RS是否已经配置成功IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes  -> RemoteAddress:PortTCP  192.168.1.10:80                     0        0        0        0        0  -> 192.168.1.13:80                     0        0        0        0        0  -> 192.168.1.14:80                     0        0        0        0        0
[root@localhost ~]# /sbin/ipvsadm-save #保存规则
复制代码

配置 RS 节点

提示:RelServer 客户端每个节点都应该配置,每个节点都要执行以下操作如果是图形界面,需要关闭图形管理工具 systemctl stop NetworkManager


1.首先关闭 ARP 宣告,和 ARP 转发,这里有两种方法,临时关闭与永久关闭.


#--------------------------------------------------------------------------------#[临时关闭][root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_announce [root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_ignore#--------------------------------------------------------------------------------#--------------------------------------------------------------------------------#[永久关闭][root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.ens32.arp_ignore=1net.ipv4.conf.ens32.arp_announce=2net.ipv4.conf.all.arp_ignore=1net.ipv4.conf.all.arp_announce=2
[root@localhost ~]# sysctl -p#--------------------------------------------------------------------------------
复制代码


2.添加本地回环口,并设置 24 位的掩码,添加本地回环路由记录,这里设置成 VIP 的地址.


[root@localhost ~]# ifconfig lo:0 192.168.1.10 netmask 255.255.255.255      #添加本地回环口,设置24位掩码[root@localhost ~]# route add -host 192.168.1.10 dev lo                     #添加路由记录
复制代码


<br>

LVS-TUN 模式

LVS-IP-TUN 模式简介


IP-TUN 也叫做 IP 隧道模式,它的配置不受空间的限制,TUN 模式的思路就是将请求与相应数据分离,让调度器仅仅处理数据请求,而让真是服务器返回数据包,但是 IP 隧道模式由于物理主机不在一起,效率比较低下.



原理图解:


a)客户端发送数据包到负载调度器,此时数据包的源 ip 为 CIP,目标 ip 为 VIP.b)负载调度器会在数据包的外面再次封装一层 ip 数据包,封装源 ip 为 DIP,目标 ip 为 RIP.此时源 ip 为 DIP,目标 ip 为 RIP.c)之后负载调度器将数据包发给 RS(因为在外层封装多了一层 ip 首部,所以可以理解为此时通过隧道传输),此时源 ip 为 DIP,目标 ip 为 RIP.d)RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来拆除掉最外层的 IP 后会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP,那么此时 RS 开始处理此请求,处理完成之后通过 lo 接口送给 eth0 网卡,然后向外传递.此时的源 IP 地址为 VIP,目标 IP 为 CIP.e)之后将数据包发给客户端.


IP-TUN 隧道 模式特点:


1.所有真实服务器节点既要有 RIP,又要有 VIP,并且 RIP、必须是公网 ip.2.负载调度器和真实服务器必须支持隧道功能.3.负载调度器只处理入站请求.4.真实服务器一定不能使用负载雕塑群做默认网关.5.不支持端口映射.6.可跨互联网搭建集群,对网络环境要求较高.


实验环境 IP 分配:


[实验环境]
[类型] [网卡] [IP地址] [VIP/Tunl] [接入模式]
LVS-IPTUN eno16777728 200.168.10.1 200.168.10.10(VIP) 外网IP
Read-Ser1 eno16777728 200.168.10.2 200.168.10.10(Tunl) 外网IPRead-Ser2 eno16777728 200.168.10.3 200.168.10.10(Tunl) 外网IP
复制代码

配置 LVS 调度器

1.通过 YUM 仓库快速安装 Ipvsadm 内核管理工具.


[root@localhost ~]# yum install -y ipvsadm
Package ipvsadm-1.27-7.el7.x86_64 already installed and latest versionNothing to do
复制代码


2.修改内核参数,防止相同网络地址广播冲突.


[root@localhost ~]# echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf[root@localhost ~]# echo "net.ipv4.conf.ens32.send_redirects = 0" >> /etc/sysctl.conf[root@localhost ~]# echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p #刷新内核参数net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.ens32.send_redirects = 0net.ipv4.conf.default.send_redirects = 0
[root@localhost ~]# modprobe ip_vs && echo "ok" || echo "error" #查看内核是否加载ok
复制代码


3.LVS 服务器配置虚拟 IP,虚拟一个隧道 IP,4 个 255 代表它自己一个网段,把网段添加到路由表防止走200.168.10.0网段.


[root@localhost ~]# ifconfig tunl0 200.168.10.10 netmask 255.255.255.255 up    #虚拟一个隧道IP 4个255代表它自己一个网段[root@localhost ~]# route add -host 200.168.10.10 dev tunl0                   #把网段添加到路由表 防止走 200.168.10.0 网段[root@localhost ~]# route -n                                                  #查看路由
复制代码


2.设置 LVS 调度器.


[root@localhost ~]# ipvsadm -C[root@localhost ~]# ipvsadm -A -t 200.168.10.10:80 -s rr[root@localhost ~]# ipvsadm -a -t 200.168.10.10:80 -r 200.168.10.2 -i[root@localhost ~]# ipvsadm -a -t 200.168.10.10:80 -r 200.168.10.3 -i[root@localhost ~]# ipvsadm -L -n --stat
复制代码

配置 RS 节点

提示:RelServer 客户端每个节点都应该配置,每个节点都要执行以下操作


1.配置网卡子接口.


[root@localhost ~]# ifconfig tunl0 200.168.10.10 netmask 255.255.255.255 up[root@localhost ~]# route add -host 200.168.10.10 dev tunl0
复制代码


2.修改环境变量,写入配置文件开机自动加载.


[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore        [root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore[root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
复制代码


3.访问集群 IP,测试隧道效果.


[root@localhost ~]# elinks http://200.168.10.10
复制代码


发布于: 刚刚阅读数: 4
用户头像

lyshark

关注

🏆 InfoQ写作平台-签约作者 2023-01-18 加入

【个人简介】致力于二进制安全,反病毒,算法还原技术研究。 【门户网站】https://www.lyshark.com

评论

发布
暂无评论
构建LVS负载均衡集群_Linux_lyshark_InfoQ写作社区