1. LVS

(LVS)linux virtual server

  • 调度性能极高
  • 对客户端请求进行调度
  • 没有web服务,并不提供对外服务
  • LVS调度器会有一个HA集群,防止调度器down导致崩溃

LVS介绍

  • LVS : 负载调度器、集成内核(发明人章文嵩阿里)

    • 官网: http://www.linuxvirtualserver.org/
    • 调度器

      • VS: Virtual Server ,负责调度
      • DS:Director Server
    • RS: Real Server ,负责真正提供服务

      • nginx:叫upstream server
      • haproxy:叫backend server
    • CIP:客户端IP
    • 调度器IP

      • VIP:VS外网的IP
      • DIP:VS内网的IP
    • RIP:提供服务的服务器IP
    • 访问流程: CIP<—> VIP == DIP <—>RIP
    • L4:四层路由器或交换机
  • 工作原理

    • VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS ,根据调度算法来挑选RS

39-LVS负载均衡 - 图1

LVS工作原理

  • Ivs: ipvsadm/ipvs

    • ipvsadm :用户空间的命令行工具,规则管理器、用于管理集群服务及RealServer
    • ipvs 策略:工作于内核空间netfilter的INPUT上的框架,因为LVS服务器不提供服务,只负责转发,不能让请求通过INPUT,所以会通过DNAT将VIP改成RIP
  • Lvs集群的工作模式

    • Ivs-nat :修改请求报文的目标IP,多目标IP的DNAT
    • Ivs-dr :操纵封装新的MAC地址
    • Ivs-tun :在原请求IP报文之外新加一个IP首部
    • Ivs-fullnat :修改请求报文的源和目标IP

LVS-NAT模式

  • DNAT(目标地址转换)

    • 源地址和端口不变,目标地址替换成要转发的那个服务器地址(RIP)
    • 互联网用户访问局域网(私网)
  • 本质是多目标IP的DNAT ,通过将请求报文中的目标地址和目标端口修改为某挑
    出的RS的RIP和PORT实现转发
  • lvs和rs直接可以加路由器(不建议)
  1. - RIPDIP应在同一个IP网络,且应使用私网地址;
  2. - RS的网关要指向DIP
  3. - 请求报文和响应报文都必须经由vs转发,vs易于成为系统瓶颈
  4. - 支持端口映射,可修改请求报文的目标PORT
  5. - VS必须是Linux系统,RS可以是任意OS系统

LVS-DR模式

  • LVS-DR : Direct Routing,直接路由;LVS默认模式,应用最广泛

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

  1. 1.请求报文必须经过LVS,响应报文不需要(LVS压力小很多)
  2. 2.RSRIP可以使用私网地址,也可以是公网地址; RIPDIP在同一IP网络;
  3. 3.RIP的网关不能指向DIP ,以确保响应报文不会经由Director
  4. 4.RSDirector要在同一个物理网络
  5. 5.请求报文要经由Director ,但响应报文不经由Director ,而由RS直接发往Client
  6. 6.不支持端口映射(端口不能修改),改的是MAC地址
  7. 7.RS可使用大多数OS系统
  • Director和各RS都配置有VIP;解决冲突方法:

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

      • 在前端网关做静态绑定VIP和Director的MAC地址(不常用)

      • 在RS上使用arptables工具(不常用)

        1. arptables -A IN -d $VIP j DROP
        2. arptables -A OUT -S $VIP j mangle --mangle-ip-s $RIP
  - 

在RS上修改内核参数以限制arp通告及应答级别

/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce

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须支持隧道功能

39-LVS负载均衡 - 图2

LVS-FULLNAT模式

  • Lvs- fullnat :通过同时修改请求报文的源IP地址和目标IP地址进行转发
  • lvs和rs直接可以加路由器

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

总结

LVS-NAT LVS-TUN LVS-DR
Server any Tunneling Non-arp device
server network private LAN/WAN LAN
server number low(10-20) 因为要原路返回,lvs压力比较大 high(100) high(100)
server gateway load banlancer / router own router own router
  • lvs-nat与Ivs- fullnat :请求和响应报文都经由Director

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

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

2. ipvs

运行在LVS下的提供负载均衡功能的一种技术

  • LVS的IP负载均衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,

  • 它的主要作用是:

    • 安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。
    • 访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
  • Ipvs具体实现是由ipvsadm这个程序来完成,因此判断一个系统是否具备ipvs功能,只需要察看ipvsadm 程序是否被安装。

  • 支持的协议: TCP,UDPI, AH ,ESP,AH_ ESP, SCTP

  • ipvs集群:

    • 管理集群服务
    • 管理RS

安装

yum install -y ipvsadm

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

scheduler(调度算法)

  • ipvs scheduler :调度时是否考虑各RS当前的负载状态

    • 两种:静态方法和动态方法
  • 静态方法:仅根据算法本身进行调度

    • RR : round robin ,轮询
    • WRR : Weighted RR ,加权轮询
    • SH : (Source Hashing) 实现session sticky (会话粘性)。源IP地址hash运算得出摘要;将来自于同一个IP地址的请求始终发往第一次挑中的RS ,从而实现会话绑定。
    • DH : (Destination Hashing );目标地址哈希,将发往同一个目标地址的请求
      始终转发至第一次挑中的RS ,典型使用场景是正向代理缓存场景中的负载均衡,
      如:宽带运营商
  • 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead =value
    较小的RS将被调度

    • LC : (least connections)最少连接;适用于长连接应用;连接数最少就调度
      公式:Overhead= activeconns256+ inactiveconns(活动连接数256+非活动连接数)
    • WLC : (Weighted LC) ,默认调度方法;带权重的最少连接
      公式:Overhead =(activeconns 256+ inactiveconns)/weight(活动连接数256+非活动连接数)/ 权重
    • SED : Shortest Expection Delay(最短期望延迟),初始连接高权重优先
      Overhead=(activeconns+ 1)* 256/weight
    • NQ : Never Queue ,第一轮均匀分配,后续SED
    • LBLC : Locality-Based LC ,动态的DH算法,使用场景:根据负载状态实现
      正向代理,动态调度
    • LBLCR : LBLC with Replication ,带复制功能的LBLC ,解决LBLC负载不均衡
      问题,从负载重的复制到负载轻的RS

ipvsadm命令

  • 核心功能:

    • 集群服务管理:增、删、改
    • 集群服务的RS管理:增、删、改
    • 查看
  • IPVS规则:/proc/net/ip_vs

  • ipvs连接:/proc/net/ip_vs_conn

  • 管理集群服务主要操作及命令:增、删、改

#增、改(针对VIP):
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
  • 管理集群上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] 如省略port ,不作端口映射
#选项:
Ivs类型:
    -g: gateway, dr类型,默认
    -i: ipip, tun类型
    -m: masquerade, nat类型
-w weight :权重
#清空定义的所有内容: 
ipvsadm -C

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

#查看: 
ipvsadm | [options]
    --numeric, -n :以数字形式输出地址和端口号
    --exact :扩展信息,精确值
    --connection,-C :当前IPVS连接输出
    --stats :统计信息
    --rate :输出速率信息

保存及重载规则

  • 保存

    • 建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save -n > /PATH/TO/IPVSADM_ FILE
ipvsadm -Sn > /PATH/TO/IPVSADM_ _FILE
systemctl stop ipvsadm.service
  • 重载
ipvsadm-restore -n  < /PATH/FROM/IPVSADM_ _FILE
ipvsadm -Rn < /PATH/FROM/IPVSADM_ FILE
systemctl restart ipvsadm.service

3. LVS-nat实战

配置lvs-nat模型实现管理web服务器

  • 网络拓扑
  1. 选中一台做LVS服务器,并且配置两块网卡

记得编辑虚拟网络编辑器!!!!

  • 桥接模式下的网络设置必须跟物理机相同且IP地址要跟物理机的在同一网段
##DIP网卡为ens33,相关配置
DIP地址:192.168.244.128
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="276a0e65-4af7-4be9-92bb-2ecb0300299c"
DEVICE="ens33"
ONBOOT="yes"


#VIP网卡为ens37,相关配置
VIP地址:10.138.171.40

#添加网卡后查看信息
[root@lvs ~]# nmcli connection show
NAME   UUID                                  TYPE      DEVICE 
ens33  276a0e65-4af7-4be9-92bb-2ecb0300299c  ethernet  ens33  
有线连接1  44fbba3f-d64a-3cec-8c10-4418d0568e5e  ethernet  ens37 

#修改名字为ens37
[root@lvs ~]# nmcli connection modify 有线连接\ 1 con-name ens37

#修改网络设置
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
HWADDR=00:0C:29:C7:F2:9D
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
UUID=44fbba3f-d64a-3cec-8c10-4418d0568e5e
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
IPADDR=10.138.171.40
NETMASK=255.252.0.0
GATEWAY=10.139.255.254

#关闭防火墙和selinux
[root@lvs ~]# setenforce 0
[root@lvs ~]# vim /etc/selinux/config 
[root@lvs ~]# systemctl stop firewalld
[root@lvs ~]# yum install -y ipvsadm
  1. 配置两台RS
#RS1
1.先下载httpd服务
[root@RS1 ~]# yum install -y httpd
[root@RS1 ~]# systemctl start httpd
[root@RS1 ~]# systemctl enabled  httpd
[root@RS1 ~]# echo RS1 > /var/www/html/index.html

2.网络配置,设置网关
[root@r1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=066d8f30-5f27-40b7-909b-3b2e040cf992  
DEVICE=ens33
ONBOOT=yes  
IPADDR=192.168.244.139
NETMASK=255.255.255.0
GATEWAY=192.168.244.128

[root@RS1 ~]# systemctl restart network
#RS2
1.先下载httpd服务
[root@RS2 ~]# yum install -y httpd
[root@RS2 ~]# systemctl start httpd
[root@RS2 ~]# systemctl enabled  httpd
[root@RS2 ~]# echo RS2 > /var/www/html/index.html

2.网络配置,设置网关
[root@r2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="276a0e65-4af7-4be9-92bb-2ecb0300299c"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.244.135
NETMASK=255.255.255.0
GATEWAY=192.168.244.128

[root@RS2 ~]# systemctl restart network
  1. LVS相关命令
#lvs添加路由转发
[root@lvs ~]# echo 1 >> /proc/sys/net/ipv4/ip_forward

#管理lvs以及管理RS
[root@lvs ~]# ipvsadm -A -t 10.138.171.40:80 -s rr
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.139:80 -m
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.135:80 -m
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.138.171.40:80 rr
  -> 192.168.244.135:80           Masq    1      0          0         
  -> 192.168.244.139:80           Masq    1      0          0
  1. 测试
#算法是RR
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
  • 修改策略为WRR
#调整策略是WRR,先全部删除再添加
[root@lvs ~]# ipvsadm -A -t 10.138.171.40:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.135:80 -m -w 1
[root@lvs ~]# ipvsadm -a -t 10.138.171.40:80 -r 192.168.244.139:80 -m -w 2
[root@lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.138.171.40:80 wrr
  -> 192.168.244.135:80           Masq    1      0          0         
  -> 192.168.244.139:80           Masq    2      0          0       

[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS1
[root@lvs ~]# curl 10.138.171.40
RS2
[root@lvs ~]# curl 10.138.171.40
RS1

4. LVS-DR实战

  • DR模型中各主机上均需要配置VIP (在lo环回接口配置),解决地址冲突的方式有三种:

    • 在前端网关做静态绑定
    • 在各RS使用arptables
    • 在各RS修改内核参数,来限制arp响应和通告的级别
  • 限制响应级别: arp_ ignore

    • 0 :默认值,表示可使用本地任意接口上配置的任意地址进行响应
    • 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口.上时,才给予响应
  • 限制通告级别: arp_ _announce

    • 0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
    • 1 :尽量避免将接口信息向非直接连接网络进行通告
    • 2 :必须避免将接口信息向非本网络进行通告

5. 集群(cluster)

  • cluster

    • 集群,为解决某个特定问题将多台计算机组合起来形成的单个系统,提供单一功能
  • linux 集群类型

    • LB : (Load Balancing )负载均衡,将访问请求根据一定的算法,均匀地分散在不同的服务器上,提升性能。
    • HA : (High Availiablity)高可用,例如MHA(主服务器宕机后,会有从服务器升级为主服务器); SPOF ( single Point Of failure )

      • MTBF:Mean Time Between Failure 平均无故障时间
      • MTTR:Mean Time To Restoration ( repair )平均恢复前时间
      • (高可用性指标)A=MTBF/ ( MTBF+MTTR) (0,1) : 99%, 99.5%,99.9%, 99.99%, 9999%
    • HPC : (High-performance computing) 高性能。www.top500.org

集群分类

负载均衡集群实现

  • 硬件(成本高)
  • F5、A10
  • 软件

    • LVS:支持四层调度
    • nginx:支持七层调度
    • haproxy:支持七层调度
    • ats:apache traffic server
  • 基于工作协议
  • 传输层(通用):目的端口号

    • LVS
    • nginx:stream
    • haproxy
  • 应用层(专用):针对特定协议,自定义的请求模型分类

    • proxy server:

      • http:nginx,httpd,haproxy
      • mysql:mysql-proxy

保持会话

  • 会话保持:负载均衡

    • session sticky:同一用户调度固定服务器;缺点是消耗资源过高

      • source IP:LVS sh算法
      • cookie
    • session replication :每台服务器拥有全部session

      • session multicast cluster
    • session server :专门门的session服务器
  • Memcached、Redis

分布式系统

  • 分布式存储:云盘;把数据分散在不同服务器上

  • 分布式计算: hadoop , Spark,云计算;把复杂的任务分成许多小任务给许多服务器计算