前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >构建LVS负载均衡集群

构建LVS负载均衡集群

作者头像
微软技术分享
发布2022-12-28 16:29:15
8950
发布2022-12-28 16:29:15
举报

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内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器.

负载调度算法分类

轮询方式

解释

rr(轮循)

从1开始到n结束

wrr(加权轮循)

按权重比例进行调度,权重越大,负责的请求越多.

sh(源地址hash)

实现会话绑定,保留之前建立的会话信息.将来自于同一个ip地址的请求发送给一个真实服务器.

dh(目标地址hash)

将同一个目标地址的请求,发送给同一个服务器节点.提高缓存命中率.

LC(最少连接)

将新的连接请求分配给当前连接数最少的服务器.公式:活动连接*256+非活动连接.

WLC(加权最少连接)

最少连接的特殊模式.公式:(活动连接*256+非活动连接)/权重

SED(最短期望延迟)

加权最少连接的特殊模式.公式:(活动连接 +1)*256/权重

NQ(永不排队)

sed的特殊模式,当某台真实服务器连接为0时,直接分配不计算.

LBLC(基于局部性的最少连接)

dh的特殊模式既要提高缓存命中率又要考虑连接数量.先根据请求的目标IP地址寻找最近的该目标IP地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器.

LBLCR(带复制的基于局部性的最少连接)

LBLCR=LBLC+缓存共享机制

动态算法

既要考虑算法本身,也要考虑服务器状态(原理:通过hash表记录连接状态active/inactive)

静态算法

只考虑算法本身,不考虑服务器状态.

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

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分配:

代码语言:javascript
复制
[实验环境]

[类型]       [网卡]	      [IP地址]		[接入模式]

LVS-NAT         ens32		192.168.1.12		桥接
                ens32		192.168.20.14		NAT

Read-Ser1	ens32		192.168.20.15		NAT
Read-Ser2	ens32		192.168.20.16		NAT

配置LVS调度器

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

代码语言:javascript
复制
[root@localhost ~]# yum install -y ipvsadm

Package ipvsadm-1.27-7.el7.x86_64 already installed and latest version
Nothing to do

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

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

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

代码语言:javascript
复制
[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.查看并保存结果,下面就是我们的配置结果啦.

代码语言:javascript
复制
[root@localhost ~]# ipvsadm -L -n                     #查看规则

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  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.

代码语言:javascript
复制
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.

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

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

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

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分配:

代码语言:javascript
复制
[实验环境]

[类型]		[网卡]		[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内核管理工具.

代码语言:javascript
复制
[root@localhost ~]# yum install -y ipvsadm

Package ipvsadm-1.27-7.el7.x86_64 already installed and latest version
Nothing to do

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

代码语言:javascript
复制
[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 = 0
net.ipv4.conf.ens32.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

[root@localhost ~]# modprobe ip_vs && echo "ok" || echo "error"   #查看内核是否加载
ok

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

代码语言:javascript
复制
[root@localhost ~]# ifconfig ens32
ens32: 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:0
ens32: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 -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens32
192.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 -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
192.168.1.10    0.0.0.0         255.255.255.255 UH    0      0        0 ens32

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

代码语言:javascript
复制
[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的轮询配置规则,并保存配置文件,此处记得放行放火墙规则.

代码语言:javascript
复制
[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:Port
TCP  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转发,这里有两种方法,临时关闭与永久关闭.

代码语言:javascript
复制
#--------------------------------------------------------------------------------
#[临时关闭]
[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=1
net.ipv4.conf.ens32.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

[root@localhost ~]# sysctl -p
#--------------------------------------------------------------------------------

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

代码语言:javascript
复制
[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                     #添加路由记录

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分配:

代码语言:javascript
复制
[实验环境]

[类型]		[网卡]		[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)	外网IP
Read-Ser2	eno16777728	200.168.10.3	200.168.10.10(Tunl)	外网IP

配置LVS调度器

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

代码语言:javascript
复制
[root@localhost ~]# yum install -y ipvsadm

Package ipvsadm-1.27-7.el7.x86_64 already installed and latest version
Nothing to do

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

代码语言:javascript
复制
[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 = 0
net.ipv4.conf.ens32.send_redirects = 0
net.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网段.

代码语言:javascript
复制
[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调度器.

代码语言:javascript
复制
[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.配置网卡子接口.

代码语言:javascript
复制
[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.修改环境变量,写入配置文件开机自动加载.

代码语言:javascript
复制
[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,测试隧道效果.

代码语言:javascript
复制
[root@localhost ~]# elinks http://200.168.10.10
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LVS-NAT 模式
    • 配置LVS调度器
      • 配置RS节点
      • LVS-DR 模式
        • 配置LVS调度器
          • 配置RS节点
          • LVS-TUN 模式
            • 配置LVS调度器
              • 配置RS节点
              相关产品与服务
              负载均衡
              负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档