LVS

1 集群的概念

  • Cluster的概念
- 当系统的性能实在是不够用,一般的系统的扩展方式
  Scale Up: 向上扩展,增强
  Scale Out: 向外扩展,增加设备,但是存在调度问题
Cluster: 集群,为解决某个特定的问题将多台计算机组合起来形成的单个系统
Linux Cluster类型:
  LB: Load Balancing, 负载均衡
  HA: High Availiablity,高可用,解决SPOF(Single Point Of Failuer)单点故障
  HPC: High-performance computing,高性能计算
分布式系统:
  分布式存储:云盘
  分布式计算: hadoop, Spark
  • Cluster 的分类
硬件: 
  F5 Big-IP
  Citrix Netscaler
  A10
软件:
  LVS: Linux Virtual Server
  nginx: 支持四层调度
  haproxy:支持四层调度
基于工作的协议层次划分:
  传输层(通用):DPORT
    lvs,nginx(stream),haproxy(mode tcp)
  应用层(专用):对特定的协议
    proxy server(代理服务器)
    http: nginx, httpd, haproxy(mode http)
    fastcgi: nginx, httpd
    mysql: mysql-proxy
  • 与Cluster相关的一些问题及解决
会话保持: 负载均衡
  1 session sticky: 同一个用户调度固定的服务器
    Source IP: LVS sh 算法(对特定的服务而言)
    Cookie
  2 session replication: 每一台拥有的全部的session
    session multicast cluster
  3 session server: 专门的session服务器
    Memcached, Redis
HA集群实现方案:
  keepalived:基于 vrrp(虚拟冗余路由协议)
  ais:application interface standard(应用接口规范)
    heartbeat, cman+rgmanager, corosync+pacemaker

2 LVS的介绍

  • LVS: Linux Virtual Server,负载调度器,集成内核(在netfileter的框架上),由章文嵩研发
lvs:基于四层调度,根据一定的算法将客户端的请求分发给后端的服务器
工作原理: VS根据请求的报文的目标IP和目标协议及端口将其调度转发到某RS,根据调度算法来挑选RS
iptables/netfilter:
  iptables:用户空间的管理工具
  netfileter: 内核空间的框架
  流入: PREROUTING --> INPUT
  流出: OUTPUT --> POSTROUTING
  转发: PREROUTING --> FORWARD --> POSTROUTING
查看内核是否支持ipvs
  grep -i -A 20 'ipvs' /boot/config-xxx
  • LVS的概念:
  • 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 server IP VS外网的IP
DIP: Direcor IP VS内网的IP
RIP: Real server IP 真是服务器的IP地址
访问流程: CIP <--> VIP==DIP <-->RIP
  • LVS 集群的类型:
lvs: ipvsadm/ipvs
  ipvsadm: 用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer
  ipvs: 工作于内核空间netfilter的INPUT钩子上的框架
    支持的协议: tcp udp ah_esp esp ah sctp
lvs集群的类型:
  lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
  lvs-dr: 操纵封装新的MAC地址
  lvs-tun: 在原请求IP报文之外新加一个IP首部
  lvs-fullnat: 修改请求报文的源和目标
  • lvs-nat
lvs-nat
多目标DNAT(iptables) 他通过修改报文的目标IP地址(同时可能会修改目标端口)至挑选出来某RS的RIP地址实现转发
    1 RS 应该使用私有网络地址,且RS的网关指向DIP(DIP和RIP之间可以使用路由器)
    2 请求和相应报文都要经由director转发,极高负载的场景中,director可能会成为系统瓶颈
    3 支持端口映射
    4 RS 可以使用任意操作系统
    5 RS的RIP和Director的DIP在同一IP网络,也可以不在同一个网段
LVS_第1张图片
  • lvs-dr
1 保证前端路由器将目标IP为VIP的请求报文发送给director
  解决方案
    静态绑定
    arptables  后台主机不能使windows
      arptables -A IN -d $VIP -j DROP
      arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
    修改RS主机内核参数
      arp_announce
      arp_ignore
2 RS的RIP可以使用私有地址,但是也可以使用公网地址
3 RS跟Director必须在同一物理网络中
4 请求报文经由Director 调度,但响应报文一定不能经由Director;
5 不支持端口映射
6 RS 可以是大多数操作系统
7 RS的网关不能指向DIP
LVS_第2张图片
  • 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_第3张图片
  • lvs-fullnat: 这种类型kernel不支持,所以也就不做介绍了
  • LVS工作模式的总结


    LVS_第4张图片
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat: DIP的网关指向DIP
lvs-fullnat: DIP和RIP未必在同一个网络,但要能够通信
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr: 通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun: 通过在原IP报文封装新的IP头,实现转发,支持远程通信
  • ipvs scheduler: lvs的调度算法
根据是否考虑各个RS的负载状态,可分为两种:动态算法和静态算法
静态算法:四种
  1 RR: roundrobin,轮训
  2 WRR: weight RR, 加权的轮训
  3 SH: source hashing,实现 session sticky,源地址hash,将来自统一个IP的地址的请求始终发送给第一次挑中的RS,从而实现会话绑定,粒度比较粗
  4 DH: destination hashing: 目标地址hash,将发往同一个目标地址的请求始终发至第一次挑中的RS,典型的场景是正向代理缓存场景中的负载均衡
动态算法:
  1 LC: least connections 适用于长连接使用 overhead=active*256+inactiveconns
  2 WLC: weight LC: 默认调度算法 overhead=(activeconns*256+inactiveconns)/weight
  3 SED: shortest Expection Delay: 初始连接权重优先 overhead=(activeconns+1)*256/weight
  4 NQ: nerver queue: 第一次均匀分配,后续SED
  5 LBLC: locality-based lc,动态的DH算法,场景:根据负载状态实现正向代理
  6 LBLCR: LBLC with Replication,带复制功能的LBLC,解决LBLC不均匀问题,从负载重的复制到负载轻的RS
  • ipvsadm
ipvsadm 用法同iptables
  管理集群服务 
    ipvsadm -A|E -t|u|f service-address [-s scheduler]  E 修改
    ipvsadm -D -t|u|f service-address
      service-address
        tcp: -t ip:port
        udp: -u ip:port
        fwm: -f mark    
      -s scheduler
  管理集群服务中的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
        ip:port
      lvs-type    要注意使用 什么模型
        -g gateway dr
        -i ipip tun
        -m masquerade,nat   
  清空和查看
    ipvsadm -C
    ipvsadm -L|l [options]
      -n numberic 基于数字格式显示地址和端口
      -c connetcion 显示ipvs连接
      --rate 速率
      --stats 统计数据
      --exact 精确值
  保存和重载
    ipvsadm -R
    ipvsadm -S [n]
  置零计数器
    ipvsadm -Z [-t|u|f service-address]

3 LVS的实现

  • lvs-nat


    LVS_第5张图片
1 布置此环境的时候,使用linux的主机进行实现
2 route的转发的功能需要实现,Director的核心转发就不需要打开
3 将RIP1和RIP2的网关指向DIP
4 然后在Director上写转发规则
5 在各RS布置上服务如,mysql或httpd的服务
6 在Director上写规则,使用的是mysql和http并且是使用的轮训的算法
  ipvsadm -A -t 192.168.8.3:80 -s rr
  ipvsadm -a -t 192.168.8.3:80 -r 172.18.23.71:80 -m -w 1
  ipvsadm -a -t 192.168.8.3:80 -r 172.18.23.72:80 -m -w 2
  ipvsadm -A -t 192.168.8.3:3306 -s rr 
  ipvsadm -a -t 192.168.8.3:3306 -r 172.18.23.71:3306 -m -w 1
  ipvsadm -a -t 192.168.8.3:3306 -r 172.18.23.72:3306 -m -w 2
  • lvs-dr
DIP和VIP是同网段的地址,如果用到生产环境,会需要很多的公网IP
LVS_第6张图片
1 布置此环境的时候,使用linux的主机进行实现
2 ,Director,route的转发的功能需要实现
3 将Director,RIP1和RIP2的网关指向router 2
4 在各个RS的服务器上修改内核参数
  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/lo/arp_ignore
  echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  ifconfig lo:0 172.18.23.100/32 broadcast 172.18.23.100 up
  route add -host 172.18.23.100 dev lo:0 
5 在Director上配置IP地址
  ifconfig ens33 172.18.23.100/32 broadcast 172.18.23.100 up
  route add -host 172.18.23.100 dev ens33
6 在Director上写ipvs规则
  ipvsadm -A -t 172.18.23.100:80 -s rr
  ipvsadm -a -t 172.18.23.100:80 -r 172.18.23.71:80 -g -w 1
  ipvsadm -a -t 172.18.23.100:80 -r 172.18.23.72:80 -g -w 2
  ipvsadm -A -t 172.18.23.100:3306 -s rr
  ipvsadm -a -t 172.18.23.100:3306 -r 172.18.23.71:80 -g -w 1
  ipvsadm -a -t 172.18.23.100:3306 -r 172.18.23.72:80 -g -w 2
DIP和VIP是同网段的地址,可以使用内网IP
LVS_第7张图片
1 布置此环境的时候,使用linux的主机进行实现
2 Director,router的转发的功能需要实现,并且router上还应当有192.168.80.0/24地址,否则可能会有问题
3 将Director,RIP1和RIP2的网关指向router 2
4 在各个RS的服务器上修改内核参数
  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/lo/arp_ignore
  echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  ifconfig lo:0 192.168.8.8/32 broadcast 192.168.8.8 up
  route add -host 192.168.8.8 dev lo:0 
5 在Director上配置IP地址
  ifconfig ens33 192.168.8.8/32 broadcast 192.168.8.8 up
  route add -host 192.168.8.8 dev ens33
6 这种方式,需要在前段路由器上添加一条路由规则,执行vip,通过route2 的网卡
7 在Director上写规则
  ipvsadm -A -t 192.168.8.8 -s rr
  ipvsadm -a -t 192.168.8.8:80 -r 172.18.23.71:80 -g -w 1
  ipvsadm -a -t 192.168.8.8:80 -r 172.18.23.72:80 -g -w 2
  ipvsadm -A -t 192.168.8.8:3306 -s rr
  ipvsadm -a -t 192.168.8.8:3306 -r 172.18.23.71:80 -g -w 1
  ipvsadm -a -t 192.168.8.8:3306 -r 172.18.23.72:80 -g -w 2

对于上面三种lvs的实现:可以使用FWM即:基于防火墙标记进行统一调度,请自行进行调节

iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 80 -j MARK 10
iptables -t mangle -A PREROUTING -d VIP -p tcp --dport 3306 -j MARK 10
ipvsadm -A -f 10 rr
ipvsadm -a -f 10 -r 172.18.23.71 -g
ipvsadm -a -f 10 -r 172.18.23.72 -g

你可能感兴趣的:(LVS)