LVS

本文最后更新于:2023年12月5日 晚上

集群和分布式

集群(cluster):为了解决某个特定问题将多台服务器组合起来形成的单个系统

cluster 分为三种类型:负载均衡(LB)、高可用(HA)、高性能(HPC,例如天河一号)

集群和分布式:

集群是一个业务系统部署在多台服务器上,分布式是拆分业务系统,然后分别部署在不同服务器

分布式是指通过网络连接的多个组件,通过交换信息协作而形成的系统。而集群,是指同一种组件的多个实例,形成的逻辑上的整体

cluster 负载均衡 LB

按实现方式:

  • 硬件:F5,非常昂贵,一个 F5 就 18W,配置一套主从高可用就是 36W
  • 软件:LVS、Nginx、haproxy

基于工作的协议层划分:

  • 传输层:LVS、Nginx、haproxy
  • 应用层:针对特定协议,常称为 proxy server
    • http:nginx、httpd、haproxy…
    • fastcgi:nginx、httpd…
    • mysql:mysql-proxy、mycat…

cluster 高可用集群 HA

keepalived

LVS 简介

Linux Virtual Server,官网: http://www.linuxvirtualserver.org/

四层负载均衡,转发效率极高,具有处理百万计并发连接请求的能力。

阿里的四层 SLB ( Server Load Balance )是基于 LVS + keepalived 实现

LVS = IPVS(内核空间) + ipvsadm(用户空间)

  • IPVS:集成在内核,工作在 netfilter 框架上,具体来讲就是工作在 INPUT 链上,将发往 INPUT 的流量进行 “处理”
  • ipvsadm:管理 ipvs 规则的用户空间软件

负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性

  1. 应用于高访问量的业务
  2. 扩展应用程序:随时添加和移除 ECS 实例来扩展应用系统的服务能力
  3. 消除单点故障
  4. 同城容灾 (多可用区容灾)
  5. 跨地域容灾

LVS 集群

LVS 集群体系架构图

术语

  • CIP:Client IP
  • VS:Virtual Server;Director Server(DS)、Dispatcher(调度器)、Load Balancer
  • RS:Real Server;upstream server(nginx)、backend server(haproxy)
  • DIP:Director IP,VS 内网 IP
  • VIP:Virtual server IP,VS 和 RS 的外网 IP
  • RIP:Real server IP,RS 的 IP

访问流程:CIP <–> VIP==DIP <–> RIP

IPVS 工作模式

  • nat:修改请求报文的目标 IP
  • fullnat:修改请求报文的源和目标 IP,默认不支持
  • dr:操纵封装新的 mac 地址
  • tun:在原请求 IP 报文之外新加一个 IP 首部

nat

本质是多目标 IP 的 DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的 RS 的 RIP 和 PORT 实现转发

缺点:请求报文和响应报文都必须经由 VS 转发,VS 容易成为系统瓶颈

fullnat

lvs-nat 模式下,DIP 和 RIP 应该在同一个 IP 网段,RS 的网关要指向 DIP

而 lvs-fullnat 模式下,DIP 和 RIP 通常不在一个网段,只要能通信就行,当然 RS 的网关也不指向 DIP

注意:此类型 kernel 默认不支持

dr (重点)

Direct Routing 直接路由,LVS 默认模式,应用也最广泛,重点掌握。

通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 的 MAC,目标 MAC 是一个挑选出的 RS 的 RIP 的 MAC 地址;源 IP/PORT 以及目标 IP/PORT 均保持不变

lvs-dr 模式的特点:

  • Director 和各 RS 都配置同一个公网 IP(VIP),通常配置在 lo 上

  • RS 和 Director 要在同一个物理网络(同一个机房)

  • 请求报文要经由 Director,但响应报文不经由 Director,而由 RS 直接发往 Client

  • 所以为了保证目标为 VIP 的请求发往 VS 而不是 RS,需要在 RS 上修改 arp_ignore 和 rp_announce 参数,从而隐藏 RS

  • RIP 和 DIP 在同一 IP 网段,RS 网关不能指向 DIP(避免响应报文经过 VS)

  • 不支持端口映射

  • 无需开启 ip_forward

tun

一般来说,TUN 模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在 Cache 服务器本地命中的情况下,Cache 服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。

LAN 环境一般多采用 DR 模式,WAN 环境虽然可以用 TUN 模式,但是一般在 WAN 环境下,请求转发更多的被 haproxy、nginx、DNS 等实现。因此,TUN 模式实际应用的很少,跨机房的应用一般专线光纤连接或 DNS 调度

总结和比较

NAT TUN DR
Real Server any Tunneling Non-arp device
Real server network private LAN/WAN LAN
Real server number low (10~20) High (100) High (100)
Real server gateway load balancer own router own router
优点 端口转换 WAN 性能最好
缺点 性能瓶颈 支持隧道 不支持跨网段

IPVS 负载均衡调度算法

根据其调度时是否考虑各 RS 当前的负载状态,分为两种:静态方法和动态方法

静态算法

仅根据算法本身进行调度

静态算法 说明
RR roundrobin 轮询,常用
WRR weighted rr 加权轮询,常用
SH 源 IP hash,将来自于同一个 IP 地址的请求始终发往第一次挑中的 RS,从而实现会话绑定
DH 目标 IP hash,第一次轮询调度至 RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的 RS,典型使用场景是正向代理缓存场景中的负载均衡,如:web 缓存

动态算法

主要根据每 RS 当前的负载状态及调度算法进行调度 Overhead=value,较小的 RS 将被调度

动态算法 说明
LC least connections 适用于长连接应用
WLC Weighted LC 默认调度方法,较常用
SED Shortest Expection Delay 初始连接高权重优先,只检查活动连接,而不考虑非活动连接
NQ Never Queue 第一轮均匀分配,后续 SED
LBLC Locality-Based LC,动态的 DH 算法,使用场景:根据负载状态实现正向代理,实现 Web Cache 等
LBLCR LBLC with Replication 带复制功能的 LBLC,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的 RS,实现 Web Cache 等
FO 内核 4.15 之后新增
OVF 内核 4.15 之后新增

ipvsadm

ipvsadm 的核心功能:管理集群服务 和 集群服务的 RS

[root@c71 ~]$yum -y install ipvsadm
[root@c71 ~]$rpm -ql ipvsadm
/etc/sysconfig/ipvsadm-config     # 配置文件
/usr/lib/systemd/system/ipvsadm.service   #
/usr/sbin/ipvsadm        # 主程序
/usr/sbin/ipvsadm-restore      # 规则重载工具
/usr/sbin/ipvsadm-save       # 规则保存工具
...

管理集群服务

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

-A  # add
-E  # edit

service-address  # vip:port 如:10.0.0.100:80
    -t  # tcp协议
    -u  # udp协议
    -f  # firewall mark,标记,一个数字

-s  # 指定集群的调度算法,默认为wlc

# 范例
ipvsadm -A -t 10.0.0.100:80 -s wrr
ipvsadm -D -t|u|f service-address  # 删除
ipvsadm –C        # 清空定义的所有内容
ipvsadm –R        # 重载,相当于ipvsadm-restore
ipvsadm -S [-n]      # 保存,相当于ipvsadm-save

管理集群上的 RS

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-a  # add
-e  # edit
-r  # rip[:port] 如省略port,不作端口映射
    -g  # gateway,dr类型,默认
    -i  # ipip,tun类型
    -m  # masquerade,nat类型
-w  # 权重

# 范例
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.8:8080 -m -w 3
ipvsadm -d -t|u|f service-address -r server-address  # 删除
ipvsadm -Z [-t|u|f service-address]      # 清空计数器
ipvsadm -L|l [options] # 查看

options:
-n:   以数字形式输出地址和端口号
--exact: 扩展信息,精确值
-c:   当前IPVS连接输出
--stats: 统计信息
--rate:  输出速率信息

ipvs 规则

/proc/net/ip_vs

ipvs 连接

/proc/net/ip_vs_conn

保存规则

ipvs 调度规则建议保存至 /etc/sysconfig/ipvsadm.rules

ipvsadm-save > /etc/sysconfig/ipvsadm.rules
ipvsadm -S > /etc/sysconfig/ipvsadm.rules # ipvsadm -S 和 ipvsadm-save等价
systemctl stop ipvsadm.service   # 会自动保存规则至/etc/sysconfig/ipvsadm.rules

重载

ipvsadm-restore < /etc/sysconfig/ipvsadm.rules
systemctl start ipvsadm.service   # #会自动加载/etc/sysconfig/ipvsadm.rules中规则

防火墙标记

FWM:FireWall Mark

借助防火墙标记来分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度

实现方法:

# 1. 在VS主机打标记
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,... -j MARK --set-mark NUMBER

# 2. 在VS主机基于标记定义集群服务
ipvsadm -A -f NUMBER [options]

范例:

[root@c71 ~]$iptables -t mangle -A PREROUTING -d 172.16.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
[root@c71 ~]$ipvsadm -C
[root@c71 ~]$ipvsadm -A -f 10 -s rr
[root@c71 ~]$ipvsadm -a -f 10 -r 10.0.0.72 -g
[root@c71 ~]$ipvsadm -a -f 10 -r 10.0.0.73 -g
[root@c71 ~]$ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  10 rr
  -> 10.0.0.72:0                  Route   1      0          0
  -> 10.0.0.73:0                  Route   1      0          0
[root@c71 ~]$cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM  0000000A rr
  -> 0A000049:0000      Route   1      0          0
  -> 0A000048:0000      Route   1      0          0

持久标记

session 绑定:对共享同一组 RS 的多个集群服务,需要统一进行绑定,IPVS 调度算法无法实现

持久连接模板:无论使用任何调度算法,在一段时间内(默认 360s),能够实现将来自同一地址的请求始终发往同一个 RS

实现方法:ipvsadm 指定 -p 选项即可

ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout] [-M netmask] [--pe persistence_engine] [-b sched-flags]

# 范例:
ipvsadm -A|E -f 10 -p
ipvsadm -A|E -f 10 -p 3600

LVS 实战案例

重点掌握 LVS-DR 模式即可,其他模式如果用到再复习

LVS-DR 模式单网段案例

DR 模式中各主机上均需配置 VIP,解决地址冲突的方式有三种,最常用的是修改 RS 的内核参数:

  • arp_ignore:用于处理接收到的 arp 请求,

    • 设置为 1:请求的目的 IP 地址为接收网卡上的 IP,才响应。

      举例来讲:服务器上配置两个网卡 A 和 B,A 接收到 arp 请求,只要请求的目的 IP 不是 A 的 IP 就不响应。

  • arp_announce:用于处理发送的 arp 请求

    • 设置为 2:请求的源 IP 为发送网卡的 IP

环境:五台主机

一台客户机:eht0:仅主机 192.168.10.6/24 GW:192.168.10.200

一台路由器:
eht0:NAT 10.0.0.200/24
eht1:仅主机 192.168.10.200/24
启用ip_forward

# dr模式下,vs只负责转发请求,不往外网发送请求,所以网关可以随便设置一个ip,但是不能不配置,因为如果不配置,vs会认为自己和外网没有通信的可能,就不会转发请求了
一台VS:eht0:NAT 10.0.0.8/24 GW:10.0.0.200  lo:10.0.0.100/32

两台RS:
RS1:eth0:NAT 10.0.0.7/24 GW:10.0.0.200  lo:10.0.0.100/32
RS2:eth0:NAT 10.0.0.17/24 GW:10.0.0.200  lo:10.0.0.100/32
  • RS 要可以出网,所以配置了网关

  • VIP 是 10.0.0.100,给 VS 和 RS 的 lo 网卡都配置上

# 客户机配置过程略。。。
# 路由器配置过程略。。。
# RS配置:将arp_ignore设置为1、arp_announce设置为2;lo的ip配置为VIP
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip a add 10.0.0.100/32 dev lo label lo:1
# VS配置:lo的ip配置为VIP,配置ipvs规则
ipvsadm -A -t 10.0.0.100:80 -s rr
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7:80 -g
ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17:80 -g

# 测试访问:客户机多次执行 curl 10.0.0.100

LVS-DR 模式多网段案例

前面的单网段案例中,lo 和 eth0 在同一个网段,如果把 lo 和 eth0 的 ip 设置在不同的网段就是多网段,这种情况是物理上单网段,逻辑上多网段

实现过程略。。。

LVS 高可用实现

DS 不可用时

  • keepalived
  • heartbeat/corosync

RS 不可用时

某 RS 不可用时,Director 依然会调度请求至此 RS

解决方案: 由 Director 对各 RS 健康状态进行检查,失败时禁用,成功时启用

常用解决方案:

  • keepalived
  • heartbeat/corosync
  • ldirectord

检测方式:

  • 网络层检测:icmp
  • 传输层检测:端口探测
  • 应用层检测:请求某关键资源

ldirectord


LVS
http://blog.lujinkai.cn/运维/LVS/LVS/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议