一、LVS集群介绍
LVS(linux virtual server)即linux虚拟服务器,由章文嵩博士主导开发的开源负载均衡项目,从2.6内核开始已经被集成到linux内核模块中了,该项目在linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台web服务器,如果后端的所有web服务器存储的内容时相同的,那么用户不管访问哪台真实的web服务器得到的内容也都是相同的,所以整个集群对于用户而言是透明的。最后根据工作模式不同,真实服务器会选择不同的方式将用户需要的数据发送给终端用户。
1.1、LVS的四种模式
- NAT模式
- 客户端请求和响应都经过负载均衡器,通过地址转换实现负载均衡。
- DR直连路由
- 客户端请求直接路由到后端服务器,响应也直接返回客户端,负载均衡器仅负责转发请求。
- TUN隧道模式
- 客户端请求通过隧道传输到后端服务器,响应直接返回客户端,减轻负载均衡器压力。
- FULLNAT完全NAT模式(基于NAT实现,LVS 本身不支持,需要额外对内核打补丁后才能使用。)
- 通过双重地址转换实现负载均衡,客户端和后端服务器双向请求都经过负载均衡器。
- 提供了跨网段负载均衡功能。
1.2、LVS负载均衡调度算法
分发算法介绍 分发算法其实就是分发器如何将用户请求分发给数据服务器,让数据服务器来处理。比如:
幼儿园里老师分苹果
- 老师就是分发器:他来决定给小朋友们如何发苹果
- 苹果就是用户请求
- 小朋友就是数据服务器,负责来处理苹果
根据前面的介绍,我们了解了LVS的四种模式,但是不管使用哪种模式,调度器进行调度的策略与算法都是LVS的核心技术,LVS在内核中主要实现了八种调度算法
轮询-rr
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
加权轮询-wrr
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
最小连接-lc
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
加权最小连接-wlc
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
基于局部的最小连接-lblc
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。
带复制的基于局部性最少链接-lblcr
带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
目标地址散列-dh
目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
源地址散列-sh
源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
一般情况 rr wrr lc wlc适用于静态网站,lblc sh dh适用于动态网站
1.3、常用缩写解释
名称 | 含义 |
---|---|
LB(Load Balancer) | 负载均衡 |
HA(High Available) | 高可用 |
Cluster | 集群 |
DS(Director Server) | 前端负载均衡节点服务器 |
RS(Real SERVER) | 后端真实服务器 |
CIP(Client IP) | 客户端IP地址 |
VIP(Virtual IP) | 负载均衡对外提供访问的IP地址,一般负载均衡IP都会通过Viirtual IP实现高可用 |
RIP(RealServer IP) | 负载均衡后端的真实服务器IP地址 |
DIP(Director IP) | 主要用于和内部主机通讯的 IP 地址 |
二、集群部署工具-ipvsadm介绍
LVS已经集成在linux内核模块中,但整个LVS环境又分为内核层与用户层,内核层负责核心算法的实现,用户层需要安装ipvsadm工作,通过命令将管理员需要的工作模式与实现算法传递给内核来实现。
# yum install ipvsadm -y
# 或者
# apt install ipvsadm -y
# 查看是否在内核中
lsmod |grep ip_vs
# 如果不在使用modprobe添加
modprobe ip_vs
# 如果编译lvs,需要使用内核,先查看内核版本
uname -r
3.10.0-1160.114.2.el7.x86_64
yum install kernel-devel -y
# 链接内核
ln -s /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64 /usr/src/linux
ls -l /usr/src/
总用量 0
drwxr-xr-x. 2 root root 6 4月 11 2018 debug
drwxr-xr-x. 5 root root 113 4月 2 08:16 kernels
lrwxrwxrwx 1 root root 45 4月 4 18:12 linux -> /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64
安装完成之后会生成一个同名的命令工具,我们需要使用该命令来配置LVS和算法
用法
ipvsadm 选项 服务器地址 -s 算法
ipvsadm 选项 服务器地址 -r 真是服务器地址 [工作模式] [权重]
选项
-A 添加一个虚拟服务器
-E 编辑一个虚拟服务器
-D 删除一个虚拟服务器
-C 清空虚拟服务器列表
-R 从标准输入中还原虚拟服务器规则
-S 将虚拟服务器规则保存至标准输出
-a 添加一个真实服务器
-e 编辑一个真实服务器
-d 删除一个真实服务器
-l/L 查看分发列表
-t 使用tcp协议
-u 使用udp协议
-s 指定算法
-r 设置真实服务器的IP地址和端口信息
-g DR模式
-i tun模式
-m nat模式
-w 设置真实服务器的权重
-c 查看连接状态,需要配合L使用
-n 以数字形式输出
# 比如,添加一个虚拟服务器,算法为rr,所有使用tcp协议访问192.168.1.100:80的请求,最终都被NAT模式转发给了192.168.2.210和2.220的80端口
[root@zuolaoshi ~]# ipvsadm -A -t 192.168.1.100:80 -s rr
[root@zuolaoshi ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.210:80 -m
[root@zuolaoshi ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.2.220:80 -m
# 查看规则
[root@zuolaoshi ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.2.210:http Masq 1 0 0
-> 192.168.2.220:http Masq 1 0 0
[root@zuolaoshi ~]# 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.2.210:80 Masq 1 0 0
-> 192.168.2.220:80 Masq 1 0 0
# 查看调度状态
[root@zuolaoshi ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:20 TIME_WAIT 192.168.1.100:36916 192.168.1.100:80 192.168.2.220:80
TCP 01:09 TIME_WAIT 192.168.1.100:36922 192.168.1.100:80 192.168.2.210:80
TCP 00:20 TIME_WAIT 192.168.1.100:36918 192.168.1.100:80 192.168.2.210:80
TCP 00:25 TIME_WAIT 192.168.1.100:36920 192.168.1.100:80 192.168.2.220:80
TCP 01:40 TIME_WAIT 192.168.1.100:36924 192.168.1.100:80 192.168.2.220:80
TCP 14:57 ESTABLISHED 192.168.1.100:36926 192.168.1.100:80 192.168.2.210:80
# 删除真实服务器
[root@zuolaoshi ~]# ipvsadm -d -t 192.168.1.100:80 -r 192.168.2.220
[root@zuolaoshi ~]# 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.2.210:80 Masq 1 0 2
备份规则
[root@zuolaoshi ~]# ipvsadm -S > /tmp/ipvs.bak
清空规则
[root@zuolaoshi ~]# ipvsadm -C
还原规则
[root@zuolaoshi ~]# ipvsadm -R < /tmp/ipvs.bak
修改算法
[root@zuolaoshi ~]# ipvsadm -E -t 192.168.1.100:80 -s wrr