LVS(Linux Virtual Server)即Linux虚拟服务器,是一个高性能的服务器集群系统,主要被用来做负载均衡的工作。它是由章文嵩博士于98年在国防科技大学读博的时候创建的开源项目,是中国国内最早出现的开源软件项目之一。从Linux 2.4开始,LVS的代码已经进入了官方内核中,并得到了广泛的应用。
在实际应用场景下,LVS常常与Keepalived搭配工作,实现高可用、高性能、可伸缩、可管理的服务器集群。本文是Keepalived与VRRP协议的续篇,主要介绍LVS的核心概念及一般用法。
LVS主要由内核模块
、
- IPVS
与对应的管理程序
- KTCPVS
、
- ipvsadm
组成。
- tcpvsadm
(IP Virtual Server)负责IP负载均衡,即四层网络的交换。
- IPVS
(Kernel TCP Virtual Server)是基于内容的负载均衡,即七层网络的交换。
- KTCPVS
的工作原理为:当SYN报文到达时,它就选择后边的一台服务器,将报文转发过去,在此之后的所有包含相同IP和TCP报文头地址的数据包都会被转到之前选择的服务器上,这个网络级别的转发效率最高。
- IPVS
因为在TCP握手之前,
已经完成了转发的工作,所以它无法感知请求的内容。因此LVS又提供了
- IPVS
模块,它可以根据请求的内容来选择合适的服务器,主要应用在web服务器的高级负载均衡场景下,比如动态内容与静态内容分离,将相同内容分发到同一服务器以提高缓存命中率等。
- KTCPVS
、
- IPVS
都是跑在内核空间里的,节省了内核空间与用户空间之间的内存拷贝与上下文切换的损耗,所以它的性能一般要比其他负载均衡软件如HAProxy高。
- KTCPVS
在我手边的Linux发行版中,Debian(Linux jessie 3.16.0-4-amd64)与CentOS(3.10.0-693.el7.x86_64)的内核都有
模块,需要手动开启。ArchLinux(4.13.11-1-ARCH)的内核中没有该模块,需要自行编译安装,Linux当前最新的官方4.14内核中也能找到
- ip_vs
模块。
- ip_vs
不论是官方还是非官方,都很难找到关于
的资料,而且根据现有的资料推测,
- KTCPVS
可能并不稳定,也没有真实的应用案例,所以本文着重介绍
- KTCPVS
。
- IPVS
支持三种转发方式:
- IPVS
采用
技术时,由于请求和响应报文都必须经过调度器地址重写,因此它的伸缩能力有限,当服务器结点数目升到20时,调度器本身有可能成为系统的新瓶颈。但是可以与DNS负载均衡协同工作,进一步增加集群的规模。
- VS/NAT
而使用
与
- VS/TUN
时,调度器只处理请求报文,真实服务器的响应是直接返回给客户端的,因此可以极大的提高转发的性能,由于一般网络服务应答比请求报文大许多,使用
- VS/DR
与
- VS/TUN
时,最大吞吐量可以提高10倍,可以调度上百台服务器,本身不会成为系统的瓶颈。
- VS/DR
比
- VS/DR
的性能要稍好一些,它没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上,且服务器网络设备(或者设备别名)不作ARP响应。
- VS/TUN
支持十种负载均衡调度算法:
- IPVS
。
- (dest_ip* 2654435761UL) & HASH_TAB_MASK
LVS允许运行时动态的增减负载均衡池中的服务器及调整其权值,所以可以自行通过软件实现一些动态反馈负载均衡算法,如根据服务器网络流量、CPU、内存、磁盘IO等资源的使用情况综合调整权重(Redhat Piranha提供了类似功能)。现在很多应框架也提供了友好的监控接口,如Spring Boot Actuator,JMX等,让自行实现动态反馈负载均衡更加简单。从性能方面考虑,官方建议权值调整时间间隔应该在5到20秒之间。
需要记住每一个头地址对应的连接,其内部是使用一个哈希表来保存这个对应关系的,每一条记录需要128字节的存储空间,内存占用的计算公式为:
- IPVS
。只要带宽与CPU计算能力允许,假设每个连接时延1秒,1G内存可以支持8M的并发。
- 连接数 x 128 x (往返时延 + 连接空闲时间) [bytes]
在实际应用情境中,LVS常常与Keepalived搭配,做MySQL集群读写分离的负载均衡与故障时的主备切换,下边是一组常用的负载均衡软件对三台MySQL服务器做代理的对比评测:
图一:MySQL负载均衡TPS比较
图二:MySQL负载均衡平均TPS比较
可以看到,在评测中使用
模式的
- VS/DR
的性能与直接连接几乎没有差别,而其他的负载均衡软件都要慢40%左右。MySQL应用是典型的请求数据包小于应答数据包的情况,使用
- IPVS
可以极大的改善性能,另外
- VS/DR
运行在内核空间在性能上也更有优势。
- IPVS
是
- ipvsadm
的命令行管理工具,下边使用一个实验来演示
- IPVS
的基本用法,实验使用VirtualBox与Vagrant,实验脚本可以在https://github.com/sean-liang/labs/tree/master/lvs-dr-nginx下载。
- ipvsadm
在开始之前先介绍几个概念:
的IP地址
- DS
的IP地址
- RS
模式下,
- VS/DR
与
- DS
除了有自己的IP,同时还需要配置相同的
- RS
- VIP
下边是实验环境的拓扑结构:
图三:实验环境的拓扑结构图
实验环境中,因为客户端与
、
- DS
在同一个物理网网段中,所以会有ARP问题。因为
- RS
、
- DS
都有相同的
- RS
,当客户端需要访问
- VIP
地址时,
- VIP
有可能先于
- RS
对
- DS
解析进行抢答,这样客户端就会直接与
- ARP
交互,
- RS
就起不到负载均衡的作用了。所以要在
- DS
的相应网络接口上禁用ARP功能,详细配置方法见对应路径下的
- RS
文件。
- bootstrap.sh
下载测试环境后,首先在
、
- director
、
- realserver1
目录下分别运行
- realserver2
命令,启动服务器,当看到
- vagrant up
的终端下出现LVS集群状态时,再启动
- director
。
- client
在客户端运行命令
,每秒发送一次http请求,因为LVS配置的是轮叫调度算法,所以可以看到客户端交替输出
- watch -n 1 curl 192.168.33.50
与
- realserver1
的网页内容,此时在
- realserver2
的命令行下输入
- director
,可以看到下边的输出:
- sudo ipvsadm -l --stats
|
|
从输出可以看到,两个
的负载是平均分配的,而且OutPkts与OutBytes一列都是0,说明使用
- RS
模式做转发,只有进入的数据包,返回的数据包由
- VS/DR
直接发给客户端,并不经过
- RS
。
- DS
如果需要维护一个运行中的服务器,可以使用命令
将其权值设置为0,这样LVS就不会再向它转发请求,当维护结束后,将其权值还原即可。
- ipvsadm -e -t 192.168.33.50:80 -r 192.168.33.30 -w 0
可以使用命令
在运行时将一个
- ipvsadm -d -t 192.168.33.50:80 -r 192.168.33.30
从集群中删除,使用命令
- RS
可以将新机器加入集群。
- ipvsadm -a -t 192.168.33.50:80 -r 192.168.33.30
不论是将权值置0还是移出集群,LVS都会立即停止转发新请求到该
,但会等待现有的连接全部断开或者超时。
- RS
与
- ipvsadm-save
也比较常用,可以保存与恢复LVS的配置。
- ipvsadm-restore
另外,LVS还提供了主备
之间的状态同步功能,即将所有连接的状态同步到备份
- DS
上边,这样在故障切换的时候可以更加平顺。根据文档介绍,这个功能还在实验阶段,其实现是主
- DS
不停的广播连接状态给所有备份
- DS
,所以在负载大的情况下,会在一定程度上影响转发的性能。要使用该功能,可以在主
- DS
上运行
- DS
,在备份
- ipvsadm --start-daemon=master --mcast-interface=eth0
上运行
- DS
。
- ipvsadm --start-daemon=backup --mcast-interface=eth0
来源: https://liangshuang.name/2017/11/19/lvs/