LVS 详解

LVS 详解

  • Linux Cluster 相关概念
    • 1、Linux Cluster 类型
    • 2、分布式系统及扩展方式
  • LB Cluster 相关概念
    • 1、LB Cluster 的实现方式
    • 2、LB Cluster 的划分(基于工作的协议层次)
  • LVS 介绍
    • 1、LVS 概念
    • 2、LVS 工作原理
      • 2.1 iptables/netfilter 简短回顾
      • 2.2 LVS 实现方式
    • 3、LVS 相关术语
    • 4、LVS 集群的类型
      • 4.1 lvs-nat
      • 4.2 lvs-dr
      • 4.3 lvs-tun
      • 4.4 lvs-fullnat
      • 4.5 LVS 场景总结
    • 5、ipvs scheduler
      • 5.1 静态方法
      • 5.2 动态算法
    • 6、负载均衡构建需要考虑的问题
      • 6.1 会话保持
      • 6.2 文件存储
    • 7、LVS 相关命令介绍
      • 7.1 命令部件介绍
      • 7.2 ipvsadm 程序介绍
      • 7.3 ipvsadm 命令核心功能
      • 7.4 ipvsadm 命令格式
      • 7.5 ipvsadm 管理集群服务
      • 7.6 ipvsadm 管理集群的RS
      • 7.7 ipvsadm 查看命令
      • 7.8 ipvsadm 其它命令
    • 8、补充
      • 8.1 考虑可靠性问题
      • 8.2 ldirectord 介绍
      • 8.3 共享存储

Linux Cluster 相关概念

Cluster:计算机集合,为解决某个特定问题组合起来形成的单个系统。

1、Linux Cluster 类型

LB:Load Balancing          # 负载均衡
HA:High Availiablity       # 高可用
	A=MTBF/(MTBF+MTTR)     # 计算公式  
HP:High Performance        # 高性能

2、分布式系统及扩展方式

  • 分布式系统包括:分布式存储和分布式计算
  • 系统扩展方式包括:向上扩展( Scale UP,比如:提升主机性能)和向外扩展(Scale Out,比如:Cluster )

LB Cluster 相关概念

1、LB Cluster 的实现方式

  • 硬件

    F5 Big-IP
    Citrix Netscaler
    A10
    
  • 软件

    lvs         # Linux Virtual Server
    nginx
    haproxy
    ats         # apache traffic server 
    perlbal
    pound
    

2、LB Cluster 的划分(基于工作的协议层次)

  • 传输层(通用):(DPORT)

    lvs
    nginx:(stream)
    haproxy:(mode tcp)
    
  • 应用层(专用):(自定义的请求模型分类)

    proxy server:
    	http:nginx(http), httpd, haproxy(mode http), ...
    	fastcgi:nginx, httpd, ...
    	mysql:ProxySQL,  ...
    	...
    

LVS 介绍

1、LVS 概念

LVS 是一个四层路由器或四层交换机(针对于OSI 7层模型),VS(Virtual Server)根据请求报文的目标IP和目标协议及端口将其调度转发至某RS(Real Server),根据调度算法来挑选RS。

2、LVS 工作原理

2.1 iptables/netfilter 简短回顾

iptables     # 用户空间的管理工具
netfilter    # 内核空间上的框架
				
三种数据流向:
	流入   # PREROUTING --> INPUT 
	流出   # OUTPUT --> POSTROUTING
	转发   # PREROUTING --> FORWARD --> POSTROUTING

nat table:				
	DNAT   # 目标地址转换---PREROUTING
	SNAT   # 源地址转换---POSTROUTING

2.2 LVS 实现方式

LVS 使用 ipvsadm/ipvs 来实现。

  • ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及相关的 RealServer
  • ipvs:工作于内核空间的netfilter的INPUT钩子之上的框架

LVS 详解_第1张图片
上图所示,ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。

3、LVS 相关术语

VS:Virtual Server, Director, Dispatcher, Balancer
RS:Real Server, upstream server, backend server
			
CIP:Client IP
VIP: Virtual server IP
RIP: Real server IP
DIP: Director IP
			
CIP <--> VIP == DIP <--> RIP 

4、LVS 集群的类型

lvs-nat      # 修改请求报文的目标IP;多目标IPDNAT
lvs-dr       # 操纵封装新的MAC地址
lvs-tun      # 在原请求IP报文之外新加一个IP首部
lvs-fullnat  # 修改请求报文的源和目标IP

4.1 lvs-nat

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

注意事项:

  1. RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP
  2. 请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈
  3. 支持端口映射,可修改请求报文的目标PORT
  4. vs必须是Linux系统,rs可以是任意系统

LVS 详解_第2张图片

4.2 lvs-dr

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

注意事项:

  1. Director和各RS都得配置使用VIP

  2. 确保前端路由器将目标IP为VIP的请求报文发往Director:

    (a) 在前端网关做静态绑定;
    (b)RS上使用arptables;
    (c)RS上修改内核参数以限制arp通告及应答级别	
    		arp_announce
    		arp_ignore
    
  3. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director

  4. RS跟Director要在同一个物理网络

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

  6. 不支持端口映射

LVS 详解_第3张图片

针对此类型的一些问题和解决方法:

  1. Director和各RS都得配置使用VIP,如何保证ARP请求报文和响应都只有Director的MAC地址能够响应?(解决办法:修改Liunx内核中关于ARP的内核参数:arp_announce/arp_ignore)
  2. 由于RS只有一个网络接口,而Linux内核默认情况下包封装时是从哪个网口出去那个网口就是源地址,如何确保RS转发出来的报文源IP是VIP,而不是RIP?(解决办法:在数据报封装后指定路由经lo别名上的接口发送出去然后再通过物理网卡转发出去)
  3. Director和各RS都得配置使用VIP,如何避免个主机的IP广播,造成无法通信?(解决办法:在RS上进行配置时,设定VIP的广播地址为它自己即可)

4.3 lvs-tun

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)。

注意事项:

  1. DIP, VIP, RIP都应该是公网地址
  2. RS的网关不能,也不可能指向DIP
  3. 请求报文要经由Director,但响应不能经由Director
  4. 不支持端口映射
  5. RS的OS得支持隧道功能

LVS 详解_第4张图片
此场景优缺点:

  • 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
  • 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。封装两个IP报文首部会有问题: MTU大小为1500的大小,而再加一个IP报文首部会超出MTU的大小,导致路由器拒收(因为传输之前已经被切片传输的大小为1500字节)。

4.4 lvs-fullnat

通过同时修改请求报文的源IP地址和目标IP地址进行转发。

注意事项:

  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
  2. RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client
  3. 请求和响应报文都经由Director
  4. 支持端口映射
  5. 此类型默认不支持(需要编译内核进行支持)

4.5 LVS 场景总结

  • lvs-nat, lvs-fullnat:请求和响应报文都经由Director

     lvs-nat      # RIP的网关要指向DIP
     lvs-fullnat  # RIPDIP未必在同一IP网络,但要能通信
    
  • lvs-dr, lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client

     lvs-dr       # 通过封装新的MAC首部实现,通过MAC网络转发
     lvs-tun      # 通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信
    

5、ipvs scheduler

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

5.1 静态方法

静态方法:仅根据算法本身进行调度。根据算法本身进行调度,不考虑后端服务器的运行状态,负载的效果有限。

  • RR:round robin,轮询(缺点: 性能好的服务器比较空闲,而性能差的服务器会很繁忙)
  • WRR:Weighted RR,加权轮询(缺点: 有的情况下,当性能好的服务器分配了更多的长连接,而性能差的分配的大多数都是短连接,此时会造成性能好的服务器处理列多的连接,压力比较大,而性能差的服务器,还处于空间状态,造成假负载)
  • SH:Source Hashing,源地址哈希,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定(在Director服务器上维护一个hash表,其是KV格式,键就是源IP地址,值就是RS的地址,每次都会查找hash表,如果能查询到前一次的连接记录,就直接发送到RS服务器,如果没有,就使用算法进行调度,缺点:随着时间推移,旧的IP地址会很多,这样会让固定的RS服务器压力大)
  • DH:Destination Hashing,目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡(缺点: 如果另一个客户端也请求同一个目标地址, 它也会将这个请求使用同一个网关进行发送, 如果对同一目标地址请求比较大, 这样会造成同一网关的负载压力,会损坏负载的效果。)

5.2 动态算法

动态方法:主要根据每RS当前的负载状态及调度算法进行调度。根据算法及各RS的当前的负载状态进行评估,如果负载较小的会负载下一个请求,其根据overhead值来分配请求。

  • LC : least connection(最少连接),如果RS的连接数都一样,会进行轮循,overhead值小的将会接收下一次请求

    overhead计算公式: active(活动连接数)*256+inactive(非活动连接数)
    缺点: 不能根据服务器的性能进行分发请求
    
  • WLC : weighted LC ,overhead小的将接收下一次请求

    overhead计算公式: active*256+inactive/weight
    缺点: 当两台活动连接都为0,将进行轮循,如果正好轮循到了权重小的响应,这样是不理想的
    	SED算法就是解决这个问题的
    
  • SED : shortest expction delay, 最短期望延迟,是WLC算法的改进

    overhead计算公式:(active+1)*256/weight
    缺点: 如果权重差别很大的情况下, 权重小的就空闲了
    
  • NQ : Nerver Queue(它是SED算法的改进,当用户请求进来的时候, 服务器事先根据用户的请求,依照权重大小依次分配,随后再根据SED算法分配)

  • LBLC : Locality-based LC(它是一个动态的DH算法,客户端请求一个目标地址时,当没有目标地址的连接记录,将挑选一个负载小的网关发送, 其也是正向代理时使用的算法)

  • LBLCR : LBLCR with replication, 带复制的LBLC(当有一个目标地址被一个缓存服务器大量缓存, 而用户又大师的请求此目标地址,此时另一台缓存服务器就过于空闲,此时LBLCR算法就会通过将压力大的缓存服务器内容复制一份到空闲的缓存服务器)

6、负载均衡构建需要考虑的问题

6.1 会话保持

在Web服务通信中,HTTP本身是无状态协议,不能标识用户来源,此时出现了一个问题,当用户在一个网站浏览了A网页并跳转到B网页,此时服务器就认为B网页是一个新的用户请求,你之前的登陆的信息就都丢失了。在LVS中,持久连接是为了用来保证当来自同一个用户的请求时能够定位到同一台服务器。

  • Session sticky:通过负载均衡器追踪用户的请求, 始终将同一IP的会话发送至相同的real server(缺点: 如果一直访问的real server宕机, 将引起部分用户无法正常访问)
  • Session Cluster: 将session做成一个集群,进行多服务器同步session(缺点: 会话大的情况下, 服务器会大量的同步session,将浪费大量的资源,只适合会话比较小的规模)
  • Session server : 将存储session的时候,使用网络存储,多服务器调用(缺点: 网络存储session的服务,将会有网络瓶颈, 或者session的存储宕机)

6.2 文件存储

  • 共享存储

    NAS    # network attached storage(文件级别存储服务器)
    SAN    # Storage Area Network(块级别存储)
    DS     # Distributed Storage(分布式文件级别存储)
    
  • 数据同步

    Rsync
    

7、LVS 相关命令介绍

7.1 命令部件介绍

LVS分为两个部件:ipvs 和 ipvsadm。

  • ipvs:工作于内核空间,工作在netfilter INPUT钩子之上的程序代码,其集群功能依赖于Ipvsadm工具定义规则, 一个ipvs主机至少应该有一个RS,其也可以同时定义多个cluster service
  • ipvsadm:工作于用户空间,用户空间的命令行工具, 用于管理集群服务,及集群服务上的RS等,其实是一个CLI工具

集群和集群之上的各RS是分开管理的;集群定义RS定义使用不同的命令。

如何确认 Linux 内核是否支持 IPVS?

可通过查看内核的配置文件来进行查看:
~]# grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64

支持的协议:TCPUDPAHESPAH_ESP,  SCTP

7.2 ipvsadm 程序介绍

程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config			

7.3 ipvsadm 命令核心功能

命令核心功能:

  • 集群服务管理:增、删、改
  • 集群服务的RS管理:增、删、改
  • 查看:进行集群服务和集群服务RS的查看

7.4 ipvsadm 命令格式

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]

7.5 ipvsadm 管理集群服务

增、改:
	ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
						
删:
	ipvsadm -D -t|u|f service-address
						
service-address:
	-t|u|f:
	-t: TCP协议的端口,VIP:TCP_PORT
	-u: UDP协议的端口,VIP:UDP_PORT
	-f: firewall MARK,是一个数字;
							
[-s scheduler]:
	指定集群的调度算法,默认为wlc
-p : 
	持久连接模式

7.6 ipvsadm 管理集群的RS

增、改:
	ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
				
删:
	ipvsadm -d -t|u|f service-address -r server-address
						
server-address:
	rip[:port]
						
选项:
	lvs类型:
		-g: gateway, dr类型
		-i: ipip, tun类型
		-m: masquerade, nat类型
							
	-w weight:权重

7.7 ipvsadm 查看命令

# ipvsadm -L|l [options]
	--numeric, -n     # numeric output of addresses and ports,数字格式显示地址和端口
	--exact           # expand numbers (display exact values),精确值
	--connection,-c   # output of current IPVS connections,显示ipvs的连接
	--stats           # output of statistics information,统计数据
	--rate            # output of rate information,速率

# ipvsadm -ln -c      # 连接追踪结果,能够显示哪些主机进行访问
[root@Neo_Tang ~]# ipvsadm -ln -c
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:15  TIME_WAIT   192.168.1.10:57778 192.168.1.11:80    192.168.10.13:80
TCP 00:21  TIME_WAIT   192.168.1.9:33258  192.168.1.11:80    192.168.10.12:80
TCP 00:21  TIME_WAIT   192.168.1.9:33256  192.168.1.11:80    192.168.10.12:80
TCP 00:15  TIME_WAIT   192.168.1.10:57774 192.168.1.11:80    192.168.10.13:80
TCP 00:21  TIME_WAIT   192.168.1.9:33262  192.168.1.11:80    192.168.10.12:80
TCP 00:21  TIME_WAIT   192.168.1.9:33254  192.168.1.11:80    192.168.10.12:80
TCP 00:15  TIME_WAIT   192.168.1.10:57776 192.168.1.11:80    192.168.10.13:80
TCP 00:15  TIME_WAIT   192.168.1.10:57770 192.168.1.11:80    192.168.10.13:80
TCP 00:21  TIME_WAIT   192.168.1.9:33260  192.168.1.11:80    192.168.10.12:80
TCP 00:15  TIME_WAIT   192.168.1.10:57772 192.168.1.11:80    192.168.10.13:80

7.8 ipvsadm 其它命令

ipvsadm -S = ipvsadm-save
ipvsadm -R = ipvsadm-restore 

清除规则:
	# ipvsadmin -C

保存:
	# ipvsadm -S = ipvsadm-save
	# ipvsadm -R = ipvsadm-restore 
	# ipvsadm-save > /PATH/TO/IPVSADM_FILE
	# ipvsadm -S > /PATH/TO/IPVSADM_FILE
	# systemctl stop ipvsadm.service 

重载:
	# ipvsadm -R = ipvsadm-restore
	# ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
	# ipvsadm -R < /PATH/FROM/IPVSADM_FILE
	# systemctl restart ipvsadm.service 

计数器清零:
	# ipvsadm -Z [-t | u | f  server-address]

查看命令帮助:
# ipvsadm -h         # 命令帮助
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -r server-address [options]
  ipvsadm -d -t|u|f service-address -r server-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h

其它命令示例:

一般可以保存至 /etc/sysconfig/ipvsadm 中
# ipvsadm -S -n > /etc/sysconfig/ipvsadm      # 进行规则保存,使用 -n 不进行反解,速度更快

删除规则后,可以进行重载
# ipvsadm -C
# ipvsadm -ln
# ipvsadm -R < /etc/sysconfig/ipvsadm


第二种重载规则的方法:
# ipvsadm -C
# ipvsadm -ln
# systemctl start ipvsadm.service    # 启动程序时,会去 /etc/sysconfig/ipvsadm 中进行规则重载


第二种保存规则的方法:
# rm -rf /etc/sysconfig/ipvsadm
# systemctl stop ipvsadm.service     # 停止程序时,会自动进行保存
# cat /etc/sysconfig/ipvsadm

8、补充

8.1 考虑可靠性问题

(1) Director不可用,整个系统将不可用;SPoF
	解决方案:高可用 
		keepalived 
		heartbeat/corosync
(2)RS不可用时,Director依然会调度请求至此RS
	解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用
		keepalived
		heartbeat/corosync, ldirectord
	
检测方式:
	(a) 网络层检测
	(b) 传输层检测,端口探测
	(c) 应用层检测,请求某关键资源

8.2 ldirectord 介绍

Daemon to monitor remote services and control Linux Virtual Server. ldirectord is a daemon to monitor and administer real servers in a cluster of load balanced virtual servers. ldirectord typically is started from heartbeat but can also be run from the command line.

  • 配置示例

    checktimeout=3
    checkinterval=1
    fallback=127.0.0.1:80
    autoreload=yes
    logfile="/var/log/ldirectord.log"
    quiescent=no
    virtual=5
    	real=172.16.0.7:80 gate 2
    	real=172.16.0.8:80 gate 1
    	fallback=127.0.0.1:80 gate
    	service=http
    	scheduler=wrr
    	checktype=negotiate
    	checkport=80
    	request="index.html"
    	receive="CentOS"	
    

8.3 共享存储

NAS:Network Attached Storage
	nfs/cifs
	文件系统接口
	
SAN:Storage Area Network
	“块”接口

你可能感兴趣的:(Linux学习笔记)