LVS
一、LVS入门介绍
1.1.LVS负载均衡简介
1.2.负载均衡的工作模式
1.2.1.地址转换NAT(Network Address Translation)
1.2.2.IP隧道TUN(IP Tunneling)
1.2.3.直接路由DR(Direct Routing)
1.3.LVS常用的负载调度算法
1.4.LVS管理工具ipvsadm
二、NFS共享存储服务
2.1.NFS简介
2.2.NFS共享存储服务实战
2.2.1.NFS服务器的安装配置
2.2.2.NFS客户端访问挂载
三、LVS负载均衡集群实战
3.1.地址转换模式(LVS-NAT)
3.1.1.案例描述
3.1.2.案例实施
3.1.3.验证测试
3.2.直接路由模式(LVS-DR)
3.2.1.案例描述
3.2.2.案例实施
3.2.3.验证测试
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出了一种高效的解决方法。
LVS现在已经成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够实现自动调用,在CentOS 7系列中通过“modprobe ip_vs”加载该模块。
lvs工作在四层,只转发请求不涉及流量,效率更高
nginx工作在七层能够针对域名、目录做特定转发,功能更全面
关于集群的负载调度技术,可以基于IP、端口、内容等进行分发。其中基于IP的负载调度效率最高,基于IP的负载均衡模式中,常见的有地址转换、IP隧道和直接路由三种工作模式,如下图:
1.2.1.地址转换NAT(Network Address Translation)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 LVS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
LVS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同LVS/TUN技术一样,LVS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。
以上三种工作模式中,NAT方式只需要一个公网IP地址,从而成为最易用的一种负载均衡模式,安全性也比较好,许多硬件负载均衡设备就采用这种方式;相对而言,DR模式和TUN模式负载能力更加强大,适合范围更广,但是节点的安全性要稍差一些。
针对不同的网络服务和配置需要,LVS调度器提供多种不同的负载调度算法,其中最常见的如下所示:
轮询(Round Robin):
将收到的访问请求按照顺序轮流分配给集群中的各节点服务器,均等地对待每台节点服务器,而不考虑服务器实际的连接数和系统负载等条件;当所有节点服务器的配置都相近或一致时一般采用这种方式。
加权轮询(Weighted Round Bobin):
根据真实服务器的处理能力轮流分配收到的访问请求,调度器可以自动查询各节点的负载情况,并动态调整其权重。这样可以保证处理能力强的服务器承担更多的访问流量。
最少连接(Least Connections):
根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。如果所有的服务器节点性能相近,采用这种方式可以更好地负载均衡。
加权最少连接(Weighted Least Connections):
在服务器节点的性能差异较大情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大比例的活动连接负载。
ipvsadm是在负载调度器上使用的LVS集群管理工具,通过调用ip_vs模块添加、删除、查看负载均衡集群运行状态。在CentOS 7系列中需要手动安装ipvsadm管理工具。
# modprobe ip_vs //加载LVS功能模块
# yum install -y ipvsadm //安装
# ipvsadm -v //查看已安装的ipvsadm版本
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
# man ipvsadm //查询ipvsadm使用手册
创建虚拟服务器
若集群的VIP地址为192.168.1.100,针对TCP 80端口提供负载分流服务,使用的调度算法为轮询,则对应的ipvsadm命令操作如下,对于负载均衡调度器来说,VIP地址必须是本机实际已启用的IP地址。
# ipvsadm -A -t 192.168.1.100:80 -s rr
//-A /表示添加虚拟服务器
//-t /指定VIP地址以及端口
//-s /指定负载调度算法,轮询/rr、加权轮询/wrr、最少连接/lc、加权最少连接/wlc
添加节点服务器
为虚拟服务器192.168.1.100添加四个节点服务器,命令如下,若希望使用保持连接,还应添加“-p 60”选项,其中60为保持时间,单位为秒
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -m -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30:80 -m -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.40:80 -m -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.50:80 -m -w 1
//-a /表示添加节点服务器
//-t /指定VIP地址以及端口
//-r /指定RIP地址以及端口
//-m /表示使用NAT集群模式,-g为DR模式、-i为TUN模式
//-w /指定权重,权重值越高被分配的用户请求数量就越多,权重为0时,表示停用该节点服务器
查看LVS集群状态
# 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.1.100:80 rr
-> 192.168.1.20:80 Masq 1 0 0
-> 192.168.1.30:80 Masq 1 0 0
-> 192.168.1.40:80 Masq 1 0 0
-> 192.168.1.50:80 Masq 1 0 0
Forward :负载均衡集群模式,Masq为NAT,Route为DR模式,Tunnel为TUN模式
Weight :权重,该值越大被分配的请求就越多,都一致时,表示均匀地接受请求
ActiveConn :活跃的连接数
InActConn:已处理的连接数
删除集群相关条目
# ipvsadm -d -r 192.168.1.20:80 -t 192.168.1.100:80 //删除单条节点服务器
# ipvsadm -D -t 192.168.1.100:80 //删除虚拟服务器,包括所有节点服务器
NFS是Network File System的缩写,中文意思是网络文件系统。它的主要功能是通过TCP/IP网络让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为‘应用/节点’服务器)可以通过mount挂载的方式将NFS服务器端共享的存储目录挂载到NFS客户端本地系统中,从客户端本地来看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。在互联网中小型网站集群架构后端常用NFS进行数据共享,如果是大型网站,可能还会用到更复杂的分布式文件系统。例如Moosefs/MFS、GlusterFS、FastDFS。
NFS服务的实现依赖于RPC(Remote Process Call,远程过程调用)机制,以完成远程到本地的映射过程,在CentOS 7系列系统中,需要安装nfs-utils、rpcbind软件包来提供NFS共享服务。前者用于NFS共享发布和访问,后者用于RPC支持。
NFS的RPC服务的主要功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的,这个RPC服务类似NFS服务器端和NFS客户端之间的一个中介。
案例描述:
通过NFS服务实现共享文件,使得两台Web服务器能够同时访问该共享获取同样的数据。
案例环境:
主机 | 操作系统 | IP地址 | 主要软件 |
NFS Server | CentOS 7.5_64 | 192.168.1.14/24 | nfs-utils、rpcbind |
Web Client_1 | CentOS 7.5_64 | 192.168.1.12/24 | |
Web Client_2 | CentOS 7.5_64 | 192.168.1.13/24 |
# yum install -y nfs-utils rpcbind
# systemctl enable nfs
# systemctl enable rpcbind
NFS设置共享目录
# mkdir -p /var/www/html
# echo "这是NFS存储服务器!" > /var/www/html/index.html
# vim /etc/exports //该文件用于设置NFS共享项目,指定共享目录、权限等
/var/www/html 192.168.1.0/24(rw,sync,no_root_squash)
或者
/var/www 192.168.1.0/24(rw) ,192.168.2.1(ro)
编辑以上配置文件时客户机可以是主机名、IP地址、网段、且允许使用*、?
通配符
权限中rw表示读写、ro表示只读,sync表示同步写入,no_root_squash表示>
当客户机用root登录时赋予本地root权限
# systemctl restart rpcbind //先启动该服务
# systemctl restart nfs
查看本地共享的项目:
# showmount -e
"clnt_create: RPC: Unknown host" //首次查看时可能会报此错误
解决方法:
# vim /etc/hosts
192.168.1.14 pillarx1m //加入当前主机IP地址与对应的主机名
# showmount -e //再次查看当前服务器的共享项目
Export list for pillarx1m:
/var/www/html 192.168.1.0/24
NFS协议的目标是提供一种网络文件系统因此对NSF共享的访问也使用mount命令来进行挂载,对应的文件系统类型为nfs。即可以手动挂载也可以加入fstab配置文件实现开机自动挂载,考虑到集群系统网络稳定性,NFS服务器和NFS客户端之间最好是使用专用网络来进行连接。
# yum install -y nfs-utils rpcbind //rpcbind客户机必须安装,nfs用于支持showmount命令
# systemctl enable rpcbind
# systemctl start rpcbind
# showmount -e 192.168.1.14 //查询NFS服务器的共享项目
Export list for 192.168.1.14:
/var/www/html 192.168.1.0/24
客户端手动挂载NFS服务器共享的目录
# mkdir /var/www
# mount 192.168.1.14:/var/www/ /var/www
查看客户机中的网页是否为NFS服务器的内容:
# cat /var/www/html/index.html
这是NFS存储服务器!
此时通过# mount 命令同样可以查看到已挂载的项目中有当前的NFS项目
客户端实现开机自动挂载:
# vim /etc/fstab
192.168.1.14:/var/www /var/www/ nfs rw 0 0
添加开机自动挂载配置文件后,重启电脑后可以查看到该项目已经挂载
也可以在当前状态下输入# mount -a实现立即加载fstab配置文件
在NAT模式的集群中,LVS负载调度器是所有节点访问互联网的网关服务器,其外网地址192.168.1.10同时也作为整个集群的VIP地址,LVS服务器具备两块网卡,分别连接内网和外网。关于客户机访问服务器的数据流量的大致流向是这样的:
client --> LVS --> RS --> LVS --> client。此外,在接下来的案例中,均不再结合NFS共享存储,原因是加上NFS后当客户端访问服务器时,无论如何都只会显示一个网页内容,因此验证效果不明显。
案例架构图如下:
案例环境:
主机 | 操作系统 | IP地址 | 主要软件 |
LVS Server | CentOS 7.5_64 | 192.168.1.10/24 192.168.2.10/24 | ipvsadm |
Web Server_1 | CentOS 7.5_64 | 192.168.2.20/24 | httpd-2.4.6-45.el7.centos.x86_64 |
Web Server_2 | CentOS 7.5_64 | 192.168.2.30/24 |
对于LVS负载调度器来说,需要开启路由转发规则,以便节点服务器能够访问到互联网,所有的节点服务器、共享存储均位于内网中,其默认网关设置为LVS负载调度器的内网IP地址(192.168.2.10)。
LVS Server操作
开启路由转发:
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
配置负载分配策略
# yum install -y ipvsadm
# ipvsadm -A -t 192.168.1.10:80 -s rr
# ipvsadm -a -t 192.168.1.10:80 -r 192.168.2.20:80 -m -w 1
# ipvsadm -a -t 192.168.1.10:80 -r 192.168.2.30:80 -m -w 1
若要验证权重分配几率,最好是采用wrr来实现,CentOS 7中通过rr无法体现出权重的几率
# 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.1.10:80 rr
-> 192.168.2.20:80 Masq 1 0 0
-> 192.168.2.30:80 Masq 1 0 0
两台Web Server配置
Web Server_1配置:
指定网关为LVS服务器的内网IP地址:
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY="192.168.2.10"
# systemctl restart network
安装配置提供给客户端的应用服务程序
# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS负载均衡集群之Web Server_1" > /var/www/html/index.html
Web Server_2配置:
指定网关为LVS服务器的内网IP地址:
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY="192.168.2.10"
# systemctl restart network
安装配置提供给客户端的应用服务程序
# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS负载均衡集群之Web Server_2" > /var/www/html/index.html
外网客户机测试:
通过外网客户机访问集群VIP地址访问集群,发现不断刷新或重新连接能够出现不同的页面信息,不过这些信息都来自于节点服务器中的数据,此时再查看LVS服务器的负载情况,也是有所变化的:
# 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.1.10:80 rr
-> 192.168.2.20:80 Masq 1 0 6
-> 192.168.2.30:80 Masq 1 0 5
此外,还可以直接查看节点服务器的访问日志,由于此种集群方式采用的是转发请求,因此在节点服务器日志中是能够看到外网客户机访问的。
# cat /etc/httpd/logs/access_log
192.168.1.253 - - [11/Nov/2018:12:04:15 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"
默认lvs会话保持为五秒。
会话保持时间设置:
节点服务器:KeepAliveTimeout 10
lvs调度服务器:
# ipvsadm --list --timeout
# ipvsadm --set 720 120 300
在DR模式的集群中,LVS负载调度器作为集群的访问入口,但不作为网关使用;服务器池中的所有节点服务器各自接入互联网,发送给客户机的Web响应数据包不需要经过LVS负载调度器。这种方式入站、出站访问数据被分别处理,因此LVS负载调度器和所有的节点服务器都需要配置VIP地址,以便响应对整个集群的访问,考虑到数据存储安全性,共享存储设备会放在内部专用网络中。关于客户机访问服务器的数据流量的大致流向是这样的:client --> LVS --> RS --> client。此外,在接下来的案例中,均不再结合NFS共享存储,原因是加上NFS后当客户端访问服务器时,无论如何都只会显示一个网页内容,因此验证效果不明显。
案例架构图如下:
案例环境:
LVS Server操作
配置虚拟IP地址
采用虚接口的方式(ens32:0)为网卡ens32绑定一个VIP地址,以便响应集群访问,配置结果为ens32:192.168.1.10、ens32:0:192.168.1.100
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-ens32 ifcfg-ens32:0
# vim ifcfg-ens32:0 //只修改以下三部分内容即可
NAME=ens32:0
DEVICE=ens32:0
IPADDR=192.168.1.100
# ifup ens32:0
# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:0c:29:99:f9:ca txqueuelen 1000 (Ethernet)
调整/proc响应参数
对于DR集群来说,由于LVS负载调度器和各节点需要共用VIP地址,应该关闭Linux内核的重定向参数响应。
# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens32.send_redirects = 0 //此接口地址为lvs服务器正在使用的物理接口
# sysctl -p
配置负载分配策略
# yum install -y ipvsadm
# ipvsadm -A -t 192.168.1.100:80 -s rr
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20 -g -w 1
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.30 -g -w 1
# 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.1.100:80 rr
-> 192.168.1.20:80 Route 1 0 0
-> 192.168.1.30:80 Route 1 0 0
两台Web Server配置
使用DR模式时,节点服务器也需要配置VIP地址,并调整内核的ARP响应参数以阻止更新VIP的MAC地址,避免发生冲突,除此之外,WEB服务器的配置与NAT模式配置类似。
节点服务器配置VIP地址仅用作发送Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发),因此使用虚接口lo:0来承受VIP地址,并为本机添加一条路由记录,将访问VIP地址的数据限制在本地,避免通信紊乱。
Web Server_1配置:
设置VIP地址:
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0 //只修改以下三部分内容即可
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
# ifup lo:0
# ifconfig lo:0
添加路由
# /sbin/route add -host 192.168.1.100 dev lo:0
# vim /etc/rc.local
/sbin/route add -host 192.168.1.100 dev lo:0
调整/proc相应参数
# vim /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
# sysctl -p
安装配置提供给客户端的应用服务程序
# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS负载均衡集群之Web Server_1" > /var/www/html/index.html
Web Server_2配置:
设置VIP地址:
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0 //只修改以下三部分内容即可
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
# ifup lo:0
# ifconfig lo:0
添加路由
# /sbin/route add -host 192.168.1.100 dev lo:0
# vim /etc/rc.local
/sbin/route add -host 192.168.1.100 dev lo:0
调整/proc相应参数
# vim /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
# sysctl -p
安装配置提供给客户端的应用服务程序
# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd
# mkdir -p /var/www/html/
# echo "LVS负载均衡集群之Web Server_2" > /var/www/html/index.html
外网客户机测试:
通过外网客户机访问集群VIP地址访问集群,发现不断刷新或重新连接能够出现不同的页面信息,不过这些信息都来自于节点服务器中的数据,此时再查看LVS服务器的负载情况,也是有所变化的:
# ipvsadm -ln
此外,还可以直接查看节点服务器的访问日志,由于此种集群方式采用的是转发请求,因此在节点服务器日志中是能够看到外网客户机访问的。
# cat /etc/httpd/logs/access_log
192.168.1.253 - - [11/Nov/2018:12:04:15 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Wind ows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"