文章目录
LVS 基础
一、lvs 基础
1. lvs的概念
作用
Linux Virtual Server,负载调度器,内核集成的功能,主要是为了解决高并发和负载均衡的问题,工作在4层,通常做为用户访问的入口处(防火墙的后面),阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现
访问流程:
CIP <–> VIP == DIP <–> RIP
与lvs 相关的名词:
-
VS:Virtual Server,Director Server(DS)
-
Dispatcher(调度器),Load Balancer
-
RS:Real Server(lvs), upstream server(nginx)
-
backend server(haproxy)
-
CIP:Client IP
-
VIP: Virtual serve IP VS外网的IP
-
DIP: Director IP VS内网的IP
-
RIP: Real server IP
2. lvs 的原理
正常的数据包流向如蓝色,3种,而lvs 作为 4层均衡的服务器,并没有直接响应客户请求的能力,而是把来自用户的请求转发到后端服务器上,所以这个数据包进入到内核空间后,不会流向到用户空间中去,而是lvs 对这个数据包修改后再发出去
3. lvs 集群类型
-
lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
缺点是请求报文和响应报文都经过vs ,vs的压力太大 ,而且存在单点失败问题
-
lvs-dr:操纵封装新的MAC地址
只有响应报文经过vs , 响应报文由rs 发出。但是vs 与rs 之间不能跨路由
-
lvs-tun:在原请求IP报文之外新加一个IP首部
可以解决跨路由问题,但是不常用
-
lvs-fullnat:修改请求报文的源和目标IP
几乎不用,没有特别的优点
所有的模型都不能解决lvs 天生缺陷,无法解决对后端服务器rs检查
4. lvs 的集群相关工具
-
ipvsadm:用户空间的命令行工具,规则管理器用于管理集群服务及RealServer
==注意:==lvs 的规则是存于内核中,ipvsadm 只是管理工具,无论是否安装,都不影响规则的作用
root@z2:~# apt install ipvsadm
-
ipvs:工作于内核空间netfilter的INPUT钩子上的框架
查看linux 内核对lvs 的支持
root@z1:~# grep -i -A 10 "ipvs" /boot/config-4.15.0-54-generic
5. lvs的调度算法
-
静态算法
- RR:roundrobin,轮询
- WRR:Weighted RR,加权轮询
- SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
-
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
-
LC:least connections
适用于长连接应用 Overhead=activeconns * 256+inactiveconns (谁的小,挑谁) 最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。此算法忽略了服务器的性能问题,有的服务器性能好,有的服务器性能差,通过加权重来区分性能,所以有了下面算法wlc
-
WLC:Weighted LC
默认调度方法 Overhead=(activeconns*256+inactiveconns)/weight (谁的小,挑谁) 用它是因为LC的算法无法考虑服务器的新旧性能 -
SED:Shortest Expection Delay
初始连接高权重优先 Overhead=(activeconns+1)*256/weight 不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是当负载初始为空时,权重比较大的服务器会很忙,所有的请求都会往权重大的上面发,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。
-
NQ:Never Queue
第一轮均匀分配,后续SED -
LBLC:Locality-Based LC
动态的DH算法,使用场景:根据负载状态实现正向代理 基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,因为Cache集群中客户请求报文的目标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。
-
LBLCR:LBLC with Replication
带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
-
二、ipvsadm 常见用法
安装
root@z2:~# apt install ipvsadm
生成的文件
root@z2:~# ll /sbin/ipvsadm
-rwxr-xr-x 1 root root 68912 May 24 2019 /sbin/ipvsadm*
root@z2:~# ll /sbin/ipvsadm*
-rwxr-xr-x 1 root root 68912 May 24 2019 /sbin/ipvsadm*
-rwxr-xr-x 1 root root 573 Feb 9 2015 /sbin/ipvsadm-restore*
-rwxr-xr-x 1 root root 744 Feb 9 2015 /sbin/ipvsadm-save*
主程序:/sbin/ipvsadm
规则保存工具:/sbin/ipvsadm-save
规则重载工具:/sbin/ipvsadm-restore
配置文件:/etc/ipvsadm.rules
ipvsadm命令
核心功能:
集群服务管理:增、删、改
集群服务的RS管理:增、删、改 、查看
Command
-
ipvsadm -A|E virtual-service [-s scheduler] [-p [timeout]] [-M netmask] [–pe persistence_engine] [-b sched-flags]
添加新监听的一条vs服务地址。注意一台服务器上可以添加多条 -
ipvsadm -D virtual-service
删除一条vs服务记录
-
ipvsadm -C
清除vs内核表中的所有记录。
-
ipvsadm -R
恢复虚拟服务器规则
-
ipvsadm -S [-n]
保存虚拟服务器规则,输出为-R 选项可读的格式
-
ipvsadm -a|e virtual-service -r server-address [options]
为监听的vs添加真实的后端服务器地址
-
ipvsadm -d virtual-service -r server-address
为监听的vs删除后端服务器地址
-
ipvsadm -L|l [virtual-service] [options]
显示所有的 vs列表
-
ipvsadm -Z [virtual-service]
#虚拟服务表计数器清零(清空当前的连接数量等)
-
ipvsadm --set tcp tcpfin udp
#设置连接超时值
-
ipvsadm --start-daemon state [–mcast-interface interface] [–syncid sid]
启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
-
ipvsadm --stop-daemon state
停止同步守护进程
options
-t --tcp-service service-address #说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address #说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark #说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler #使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p --persistent [timeout] #持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask #子网掩码
-r --real-server server-address #真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip #指定LVS 的工作模式为隧道模式
-m --masquerading #指定LVS 的工作模式为NAT 模式
-w --weight weight #真实服务器的权值
--mcast-interface interface #指定组播的同步接口
-c --connection #显示LVS 目前的连接 如:ipvsadm -L -c
--timeout #显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon #显示同步守护进程状态
--stats #显示统计信息
--rate #显示速率信息
--sort #对虚拟服务器和真实服务器排序输出
--numeric -n #输出IP 地址和端口的数字形式
ipvs 输出项的解释
1. ipvsadm -Ln
root@director:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 wrr
-> 192.168.1.104:80 Route 1 0 5
-> 192.168.1.105:80 Route 1 0 6
- Forward 转发方式,当前是路由转发
- Weight 权重
- ActiveConn 当前活跃的连接数
- InActConn 当前不活跃的连接数
2. ipvsadm -Ln --stats
root@director:~# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.0.0.100:80 27 171 0 11140 0
-> 192.168.1.104:80 13 80 0 5272 0
-> 192.168.1.105:80 14 91 0 5868 0
–stats选项是统计自该条转发规则生效以来的
- Conns (connections scheduled) 已经转发过的连接数
- InPkts (incoming packets) 入包个数
- OutPkts (outgoing packets) 出包个数
- InBytes (incoming bytes) 入流量(字节)
- OutBytes (outgoing bytes) 出流量(字节)
3. ipvsadm -Ln --rate
root@director:~# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 10.0.0.100:80 1 4 0 251 0
-> 192.168.1.104:80 0 2 0 109 0
-> 192.168.1.105:80 0 2 0 142 0
–rate选项是显示速率信息
- CPS (current connection rate) 每秒连接数
- InPPS (current in packet rate) 每秒的入包个数
- OutPPS (current out packet rate) 每秒的出包个数
- InBPS (current in byte rate) 每秒入流量(字节)
- OutBPS (current out byte rate) 每秒入流量(字节)
虽然你感觉会使用ipvsam 命令了 ,但是生产过程中很少直接使用ipvsadm 直接管理机器,而是通过keepalive 实现
三、规则的保纯
ipvsadm-save 默认把规则打印到屏幕上
root@z2:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.20.1.102:80 rr
-> 192.168.1.103:8080 Masq 1 0 3
-> 192.168.1.104:8080 Masq 1 0 13
root@z2:~# ipvsadm-save
-A -t 10.20.1.102:http -s rr
-a -t 10.20.1.102:http -r 192.168.1.103:http-alt -m -w 1
-a -t 10.20.1.102:http -r 192.168.1.104:http-alt -m -w 1
可以使用ipvsadm-save 重定向到一个文件中,然后使用ipvsadm-restore 恢复
root@z2:~# ipvsadm -C
root@z2:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
root@z2:~# ipvsadm-restore < /data/ipvs.log
root@z2:~# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.20.1.102:80 rr
-> 192.168.1.103:8080 Masq 1 0 0
-> 192.168.1.104:8080 Masq 1 0 0