Linux系统之lvs集群

集群的基本思想

由于现代化业务上线的需求, 单服务器已经不能满足业务的需要, 业务服务器需要承载更的访问请求.或者单台服务器故障(SPOF,single point of failure)将导致所有服务不可用. 此情况下, 需要把各种相同的业务服务器连合起来为某个相同的业务提供服务.以达到高并发,快速响应的需求.集群技术和Linux操作系统实现了一个高性能和高可用的服务器, 具有很好的可伸缩性,很好的可靠性, 很好的可管理性.

集群的类型

LB: 负载均衡集群(Load Balancing)
  • 组成部分:
    • 后端的”真服务器(realserver)”
    • 调度器
    • 分发器
    • 负载均衡器
    • 上游服务器(Upstream server)
HA: 高可用集群(High avaliability)
  • 组成部分:

    • 活动服务器(active)
    • 备用服务器(passive)

      可用性(Availability)=平均无故障时间/平均无故障时间+平均修复时间
      可用性衡量术语: 99%, 99.9%, 99.99%, 99.999%
HP: 高性能计算集群(high performance)

将多个CPU通过总线连接起来,共同进行计算,以达到计算效率

DS: 分布式系统(distributed system)

分布式存储系统是最常见的, 例如hadoop

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

  • Session的保持, 如下应用场景

    • 缺点: 网络存储session的服务,将会有网络瓶颈, 或者session的存储档机
    • 缺点: 会话大的情况下, 服务器会大量的同步session,将浪费大量的资源,只适合会话比较小的规模
    • 缺点: 如果一直访问的real server档机, 将引起部分用户考多少正常访问
    • Session sticky:通过负载均衡器追踪用户的请求, 始终将同一IP的会话发送至相同的real server.
    • Session Cluster: 将session做成一个集群,进行多服务器同步session
    • 3 通过全局的负载调度器(GSLB), 将请求调度到两个不同的机房,机房之间进行session同步
    • Session server : 将存储session的时候,使用网络存储,多服务器调用
  • 文件存储 : 使用分布式存储系统

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

LB集群的实现方式划分

  • 硬件:
    • F5 : BIG-IP
    • Citrx : Netscaler
    • A10 : A10
    • Array
    • Redward
  • 软件
    • LVS(linux virtual server)
    • HAPorxy
    • Nginx
    • Ats(apache traffice server)
    • Perlbal

LB集群的协议层划分

  • 传输层:
    • LVS
    • HAPorxy(模拟传输层,Mode TCP)
  • 应用层
    • HAPorxy(Mode HTTP)
    • Nginx
    • ATS
    • Perlbal

HA集群的实现

  • 软件方式的实现方式
    • hearbeat
    • cman+rgmanager(红帽的实现方式,RHCS)
    • corosync + pacemaker
    • KeepAlived : 通过实现vrrp协议, 来实现地址漂移
    • AIS
缓存都是KV格式的数据,即key=value的格式, 其查找数据的时间是o(1),即查询时间是恒定的

业务系统构建思路

  • 分层
    • 接入层
    • 缓存层
    • 业务层
    • 数据层
  • 分布式
    • 应用
    • 数据
    • 存储
    • 计算

LVS简介

LVS是Linux Virtual Server和简称,也就是linux虚拟服务器,这是由章文嵩博士发起的一个开源项目, 它的官方网站是www.linuxvirtualserver.org,现在LVS已经是Linux内核标准的一部分,使用LVS可达到的技术目标是: 通过LVS的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集, 它具有良好的可靠尾,可拓展和可操作性. 从而以低廉的成本实现最优的性能. LVS从1998年开始,发展到现在已经是一个比较成熟的项目了.利用LVS技术可实现高性能, 高可压缩的网络服务. 例如WWW服务,FTP服务, MAIL服务等

LVS的工作原理

LVS工作在内核的INPUT链上,请求的数据报文首先到达PREROUTING链,再通过路由发现到达本机的IP地址,却送往INPUT链, 强行改变数据包的流程,送往POSTROUTING链,再送往内部服务器(转发到内部服务器类似于iptables的DNAT,但它不更改目标IP(也可以更改目标IP)).LVS工作在四层,根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(其是根据调度算法).支持TCP,UDP,SCTP,AH,ESP,AH_ESP等协议的众多服务

LVS的集群术语

  • VS : virtual server,称之为Director
  • RS : real server, 后端提供真正服务的服务器
  • CIP : 客户端IP
  • DIP : Director IP, LVS的后端IP
  • VIP : Director IP , LVS的前端IP
  • RIP : 后端真正提供服务的服务器IP

LVS的类型

  • Lvs-nat
  • Lvs-dr(director routing)
  • Lvs-tun(ip tunneling)
  • Lvs-fullnat(同时改变请求报文的源IP地址和目标IP地址)
注意:前三种为标准类型,fullnat为后来添加的类型,内核默认可能不支持,需要重新编译内核
lvs-nat(MASQUERADE)

可以理解为多目标DNAT(iptables),可修改IP和端口,通过将请求报文的目标地址和目标端口修改为挑选的某RS的RIP和端口实现

  • 特性:

    • RIP和DIP使用私网地址, 各RS的网关应该指向DIP
    • 请求和响应报文都经由Director转发(在极高负载的场景中, Director可能会成为系统瓶颈)
    • 支持端口映射
    • VS必须为Linux,RS可以是任意的OS,只要能提供相同的服务即可.
    • RS的RIP与Director的DIP必须在同一网络,并且要做为RS的网关
  • 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址

  • 缺点: 扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

    lvs-dr(GATAWAY)

    Director将接收到的请求报文源IP和目标IP都不做修改,而是将源MAC设定自己的MAC,目标MAC设定目标RS的MAC,而通过交换机发送给RS server,当RS server拆解后发现源目标IP不是自己,此时要在RS上配置VIP,即RS服务器有RIP和VIP,此时有如下难道:

  • 地址冲突

    • RS有VIP将会与VIP冲突
  • 广播回应

    • 当有VIP的广播请求时,RS将会把系统上所有的IP进行广播
  • 特性:

    • 静态绑定:在前端路由器上把IP和director的MAC进行绑定.
    • 禁止RS响应VIP的ARP请求
    • 缺点: 不能做director的高可用,前端路由器可能由ISP提供
    • arptables : 定义一个ARP的访问控制
    • 修改各RS的内核参数,并把VIP配置在特定的接口上实现,并禁止其响应发送ARP广播(通常将VIP配置在lo的子接口上)
    • 确保前端路由器将目标IP为VIP的请求报文,一定会转发给Director,解决方案如下:
    • RS的RIP可以使用私有地址,也可以使用公网地址
    • RS跟Director必须在同一物理网络中
    • 请求报文必须由director调度,但响应报文必须不能经由director
    • 不支持端口映射
    • 各RS可以使用大多数OS
  • 优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。

  • 缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
lvs-tun(IPIP)

Director收到报文后,原IP和目标IP不动, 再封装一个源IP和目标IP,源IP为DIP,目标IP为RIP,确保每个RIP要有一个VIP,RS主机接收到报文后,回应时源IP为VIP,目标IP为CIP

  • 特性:

    • RIP,DIP,VIP全是公网地址,DIP可以为私网地址
    • RS的网关不能也不可能指向DIP
    • 请求报文经由Director调度,但响应报文直接发送给CIP
    • 不支持端口映射
    • RS的OS必须支持IP隧道功能
  • 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

  • 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。封装两个IP报文首部会有问题: MTU大小为1500的大小,而再加一个IP报文首部会超出MTU的大小,导致路由器拒收(因为传输之前已经被切片传输的大小为1500字节)

lvs-fullnat

Director收到报文后, 将源IP(CIP)修改为(DIP),目标地址(VIP)修改为(RIP),转发给RIP, 当RS主机收到报文后,回应时,源IP为RIP,目标IP为VIP.Director收到报文后,将源IP修改为自己(VIP), 目标IP修改为CIP

  • 特性:
    • VIP是公网地址, RIP和DIP是私网地址,且可以不在同一IP网络中,但需要通过路由互相通信
    • RS收到的请求报文的源IP为DIP,因此其响应报文将发送给DIP
    • 请求报文和响应报文都必须由Director调度
    • 支持端口映射机制
    • RS可以使用任意OS
lvs计算活动连接和非活动连接的方式:
  • nat fullnat模型: 请求和回应的报文都会经过directory, 因此director可以准确的判断出活动的连接和非活动的连接
  • dr tun模型: 请求只经过director,响应不经由director,但在tcp断开的时候, fin报文和最后一次的ack都会被director收到, 由此报文判断连接是否活动或断开

LVS的调度方法

静态方法(公根据算法本身进行调度,不考虑后端服务器的运行状态,负载的效果有限)
  • rr: round robin, 轮调,轮询,轮叫机制
    • 缺点: 性能好的服务器比较空闲,而性能差的服务器会很繁忙
  • wrr : weighted rr, 加权轮询,权重大的负载多
    • 缺点: 有的情况下,当性能好的服务器分配了更多的长连接,而性能差的分配的大多数都是短连接,此时会造成性能好的服务器处理列多的连接,压力比较大,而性能差的服务器,还处于空间状态,造成假负载
  • sh : source ip hash, 源地址哈希,能始终将同一个IP引导到同一台RS服务器.(在Director服务器上维护一个hash表,其是KV格式,键就是源IP地址,值就是RS的地址,每次都会查找hash表,如果能查询到前一次的连接记录,就直接发送到RS服务器,如果没有,就使用算法进行调度)
    • 缺点:随着时间推移,旧的IP地址会很多,这样会让固定的RS服务器压力大
  • dh : Destination ip hash, 目标地址哈希(用于内部负载,正向代理 ),客户端的请求,只要是同一个目标地址, 将始终通过同一个网关进行发送.

    • 缺点: 如果另一个客户端也请求同一个目标地址, 它也会将这个请求使用同一个网关进行发送, 如果对同一目标地址请求比较大, 这样会造成同一网关的负载压力,会损坏负载的效果.

      正向代理: 本地客户端访问互联网时,使用本地的缓存服务器访问网站 ,这样DH算法可以提高缓存服务器的命中率
      正向web代理: 负载均衡内网用户互联网的请求.
        client --> director --> web cache server
动态方法(根据算法及各RS的当前的负载状态进行评估,如果负载较小的会负载下一个请求,其根据overhead值来分配请求)
  • LC : least connection(最少连接),如果RS的连接数都一样,会进行轮循,overhead值小的将会接收下一次请求

    • overhead计算公式:`active(活动连接数)*256+inactive(非活动连接数)

      RS1 : 10,100
      RS2 : 20,10
        RS1将会挑选出来接收下一个请求
    • 缺点: 不能根据服务器的性能进行分发请求

  • WLC : weighted LC ,overhead小的将接收下一次请求

    • overhead计算公式: `active*256+inactive/weight

      RS1 : 10,100,1
      RS2 : 20,10,3
        RS2将会挑出来接收下一个请求
    • 缺点: 当两台活动连接都为0,将进行轮循,如果正好轮循到了权重小的响应,这样是不理想的,SED算法就是解决这个问题的

  • SED : shortest expction delay, 最短期望延迟,是WLC算法的改进

    • overhead计算公式:(active+1)*256/weight

      RS1 : 0,1
      RS2 : 0,3
        RS2将会接收下一次请求
    • 缺点: 如果权重差别很大的情况下, 权重小的就空闲了

  • NQ : Nerver Queue
    它是SED算法的改进,当用户请求进来的时候, 服务器事先根据用户的请求,依照权重大小依次分配,随后再根据SED算法分配

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

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

ipvsadm/ipvs

ipvsadm

工作于用户空间,用户空间的命令行工具, 用于管理集群服务,及集群服务上的RS等,其是一个CLI工具

ipvs

工作于内核空间,工作在netfilter INPUT勾子之上的程序代码,其集群功能依赖于Ipvsadm工具定义规则, 一个ipvs主机至少应该有一个RS,其也可以同时定义多个cluster service

ipvsadm工具的安装

  • yum install ipvsadm (base源)

确认内核是否支持ipvs功能

root@Centos7 ~]# grep -i -C 2  "ip_\?vs" /boot/config-3.10.0-229.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
--
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12

#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

#
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8

#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m

#

ipvsadm命令的使用

管理集群服务:
  • ipvsadm -A | E -t |u |f service-address [-s scheduler] [-p timeout]
  • ipvsadm -D | -t | u | f service-address
    • -A : 添加
    • -E : 修改
    • -D : 删除
    • -t : tcp, vip:port
    • -u : udp, vip:port
    • -f : 防火墙标记,MARK
    • -s : 调度算法,默认为WLC
    • -p : 持久连接模式
管理集群服务上的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
    • -a : 添加一个RS主机
    • -e : 修改一个RS主机
    • -d : 删除一个RS主机
    • -g : LVS的GATAWAY模式
    • -m : masqueread, LVS的nat模式
    • -i : IPIP,LVS的tunel模式
    • -w : weight
查看
  • ipvsadm -L | l [options]
    • -n : numberic ,数字格式显示地址和端口
    • -c : connection,显示ipvs的连接
    • --stas : 统计数据
    • --rate : 速率
    • --exact : 精确值
清空规则
  • ipvsadmin -C
保存和重载
  • ipvsadm -S /path/to/file
  • ipvsadm -S > /path/to/file
重载
  • ipvsadm -R < /path/from/some_rule_file
  • ipvsadm-restore < /path/from/some_rule_file
计数器清零
  • ipvsadm -Z [-t | u | f  server-address]

lvs-nat的构建

  • 注意事项

    • IPVS的VIP要实现高可用,它是有可能需要流动到其他的director服务器上, 一般将这种流动的IP地址配置为别名接口上
    • 不能在Ipvs的director上启用iptables
  • 配置拓扑图



  • 配置步骤

1 配置192.168.12.21的网关为192.168.12.1
2 配置192.168.12.22的网关为192.168.12.1
3 配置172.16.100.67地址在网卡的别名上
4 配置两台RS server的httpd服务,并启动之
5 在VS服务器中,完成如下配置
ipvsadm -A -t 172.16.100.67:80 -s wrr
ipvsadm -a -t 172.16.100.67:80 -r 192.168.12.21 -w 1 -m
ipvsadm -a -t 172.16.100.67:80 -r 192.168.12.22 -w 3 -m

6 使用客户端连接ipvs地址的80端口
7 正常情况下,22的主机响应3次,21的主机响应一次

lvs-dr的构建

  • 注意事项

    • IPVS的VIP要实现高可用,它是有可能需要流动到其他的director服务器上, 一般将这种流动的IP地址配置为别名接口上
    • 不能在Ipvs的director上启用iptables
  • 配置拓扑图



  • 配置步骤

director:
    ifconfig INTERFACE_Alias $VIP netmask 255.255.255.255 broadcast $VIP up
    ipvsadm -A -t 172.16.100.9:80 -s rr
    ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.68 -g
    ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.69 -g

realserver
    内核参数修改:
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/INTERFACE/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/INTERFACE/arp_announce
    route add -host $VIP dev lo:0

说明:
    arp_announce:(通告)
        0 : 把本地的任意接口地址都向网络通告
        1 : 尽量避免向本地接口的网络通知非此网络的IP地址
        2 : 必须要使用网络中的地址去响应
    arp_ignore(响应)
        0 : 本地所有接口地址都会响应
        1 : 只对从本地接口进来,而此接口也正好是这个网络的地址

    Linux默认从那个接口出去, 响应的源IP就为这个接口的地址,使用route add -host $VIP dev lo:0 就是为了改变报文的源IP地址
    linux默认的arp通告,会把本地主机的所有IP地址,都通告一次

通过防火墙标记实现LVS的集群

命令:
  • ipvsadm -A|E -t| u | f server-address [-s scheduler]
基于firewall定义集群服务的步骤
  • 1 打标
    • iptables -t mangle -A PREROUTING -d $VIP -p $protocol --dport #  -j MARK --set-mark 3
  • 2 定义集群服务
    • ipvsadm -A -f # [-s scheduler]
      配置示例
iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK --set-mark 3
ipvsadm -A -f 3 -s rr
ipvsadm -a -f 3 -r 172.16.100.68 -g
ipvsadm -a -f 3 -r 172.16.100.69 -g

lvs presistence(持久连接)

无论lvs使用何种scheduler,其都能实现在指定时间范围内(360秒)将来自同一个IP地址的请求发往同一个RS,其是通过内部的hash表,实现方式与算法无关,是通过lvs连接模板实现,其与调度方法无关,如果在指定的时间范围内还是未断开连接请求,连接超时时间自动增加2分钟

持久连接的记录模板: /proc/net/ip_vs_conn

  • 每端口的持久(PPC):单个服务的持久
    • 配置示例:

      ipvsadm -A -t 172.16.100.9:80 -s rr -p
      ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.68 -g
      ipvsadm -a -t 172.16.100.9:80 -r 172.16.100.67 -g 
      
      ipvsadm -A -t 172.16.100.9:23 -s rr -p
      ipvsadm -a -t 172.16.100.9:23 -r 172.16.100.68 -g
      ipvsadm -a -t 172.16.100.9:23 -r 172.16.100.69 -g
      
        无论使用的什么调度方法,同一个请求将都会发往同一个RS
  • 每客户端持久(PCC)
    • 配置示例:

      ipvsadm -A -t 172.16.100.9:0 -s rr -p
      ipvsadm -a -t 172.16.100.9:0 -r 172.16.100.68 -g
      ipvsadm -a -t 172.16.100.9:0 -r 172.16.100.69 -g
        定义tcp或udp协议的0号端口为集群服务端口
  • 每防火墙标记持久(PFWNC)
    • 配置示例:

      iptables -t mangle -A PREROUTING -d 172.16.100.9 -p tcp --dport 80 -j MARK --set-mark 99
      iptables -t mangle -A PREROUTING  -d 172.16.100.9 -p tcp --dport 443 -j MARK --set-mark 99
      ipvsadm -A -f 99 -s rr -p
      ipvsadm -a -f 99 -r 172.16.100.68 -g
      ipvsadm -a -f 99 -r 172.16.100.6