LB Cluster:lvs

Linux Cluster:

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

  • Linux Cluster类型:

    • LB:Load Balancing,负载均衡;
    • HA:High Availiablity,高可用;
      A=MTBF/(MTBF+MTTR)
      (0,1):90%, 95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%
    • HP:High Performance,高性能;

    • 分布式系统:

      • 分布式存储
        分布式计算
  • 系统扩展方式:
    Scale UP:向上扩展
    Scale Out:向外扩展:Cluster

LB Cluster:

  • LB Cluster的实现:

    • 硬件:
      F5 Big-IP
      Citrix Netscaler
      A10 A10
    • 软件:
      lvs:Linux Virtual Server
      nginx
      haproxy
      ats:apache traffic server
      perlbal
      pound

    • 基于工作的协议层次划分:

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

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

        • http:nginx(http_upstream module), httpd, haproxy(mode http), …
          fastcgi:nginx, httpd, …
          mysql:ProxySQL, …
      • 站点指标

        • PV:Page View
          UV:Unique Vistor
          IP
    • 会话保持:

      1. session sticky会话绑定
        Source IP:sh,persistence
        Cookie
      2. session replication;
        session cluster:服务器之间采用的是组播方式同步,不适合于较大规模的场景
      3. session server此时,该位置处于单点
        memcached
        redis
  • lvs:Linux Virtual Server

    • VS: Virtual Server
      RS: Real Server

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

    • iptables/netfilter:

      • iptables:用户空间的管理工具;
      • netfilter:内核空间上的框架;

        • 流入:PREROUTING –> INPUT
        • 流出:OUTPUT –> POSTROUTING
        • 转发:PREROUTING –> FORWARD –> POSTROUTING
      • DNAT:目标地址转换; PREROUTING;

      • SNAT:源地址转换;POSTROUTING;
    • lvs: ipvsadm/ipvs

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

      • vs:Virtual Server, Director, Dispatcher, Balancer
      • rs:Real Server, upstream server, backend server
      • CIP:Client IP,
      • VIP: Virtual serve IP,
      • RIP: Real server IP,
      • DIP: Director IP
    • lvs集群的类型:
      lvs-nat:修改请求报文的目标IP;多目标IP的DNAT;
      lvs-dr:操纵封装新的MAC地址;
      lvs-tun:在原请求IP报文之外新加一个IP首部;
      lvs-fullnat:修改请求报文的源和目标IP;

      • lvs-nat:

        多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;
        
          (1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
          (2)请求报文和响应报文都必须经由Director转发;Director要打开核心转发功能;Director易于成为系统瓶颈;
          (3)支持端口映射,可修改请求报文的目标PORT;
          (4)vs必须是Linux系统,rs可以是任意系统;
      • lvs-dr:Direct Routing,直接路由;

        通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
        
          Director和各RS都得配置使用VIP;
        
          (1) 确保前端路由器将目标IP为VIP的请求报文发往Director:
              (a) 在前端网关做静态绑定;
              (b) 在RS上使用arptables;
              (c) 在RS上修改内核参数以限制arp通告及应答级别;
                  解决地址冲突的方式有三种:
                      (1) 在前端网关做静态绑定;
                      (2) 在各RS使用arptables;
                      (3) 在各RS修改内核参数,来限制arp响应和通告的级别;
                          限制响应级别:arp_ignore
                              0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
                              1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
                          限制通告级别:arp_announce
                              0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
                              1:尽量避免向非直接连接网络进行通告;
                              2:必须避免向非本网络通告;
        
                          此处解决冲突:arp_ignore为1、arp_announce为2
        
          (2) RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
          (3) RS跟Director要在同一个物理网络;
          (4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
          (5) 不支持端口映射;
      • 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-fullnat:

        通过同时修改请求报文的源IP地址和目标IP地址进行转发;
          CIP <--> DIP 
          VIP <--> RIP 
        
        (1) VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP;
        (2) RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但Director还要将其发往Client;
        (3) 请求和响应报文都经由Director;
        (4) 支持端口映射;
        
        注意:此类型内核内默认是不支持;
      • 总结:

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

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

          lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发;
          lvs-tun:通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信;
  • ipvs scheduler:
    根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种:

    • 静态方法:仅根据算法本身进行调度;

      RR:roundrobin,轮询;
      WRR:Weighted RR,加权轮询;
      SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定;
      DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡;
    • 动态方法:主要根据每RS当前的负载状态及调度算法进行调度;

      LC:least connections
        Overhead=activeconns*256+inactiveconns
      WLC:Weighted LC
        Overhead=(activeconns*256+inactiveconns)/weight
      SED:Shortest Expection Delay
        Overhead=(activeconns+1)*256/weight
      NQ:Never Queue
      
      LBLC:Locality-Based LC,动态的DH算法;
      LBLCR:LBLC with Replication,带复制功能的LBLC;
  • ipvsadm/ipvs:

    • 集群和集群之上的各RS是分开管理的;

      • 集群定义
      • RS定义
    • ipvs:

      • ~]# grep -i -C 10 “ipvs” /boot/config-VERSION-RELEASE.x86_64
        支持的协议:TCP, UDP, AH, ESP, AH_ESP, SCTP;

      • ipvs集群:
        集群服务
        服务上的RS

    • ipvsadm:

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

      • ipvsadm命令:

        • 核心功能:
          集群服务管理:增、删、改;
          集群服务的RS管理:增、删、改;
          查看:

          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 -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]

          • lvs类型:

            -g: gateway, dr类型
            -i: ipip, tun类型
            -m: masquerade, nat类型
          • -w weight:权重;
        • 清空定义的所有内容:ipvsadm -C

        • 查看:

          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
            --stats:output of statistics information
            --rate :output of rate information
        • 保存和重载:

          ipvsadm -S = ipvsadm-save
          ipvsadm -R = ipvsadm-restore
  • FWM:FireWall Mark

    • netfilter:

      • target: MARK, This target is used to set the Netfilter mark value associated with the packet.
        –set-mark value
    • 借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度;

    • 打标记方法(在Director主机):
      ~]# iptables -t mangle -A PREROUTING -d $vip -p $proto –dport $port -j MARK –set-mark NUMBER

    • 基于标记定义集群服务:
      ~]# ipvsadm -A -f NUMBER [options]

  • lvs persistence:持久连接

    • 脱离算法的持久连接,ipvs自己的持久连接模板
    • 持久连接模板:实现无论使用任何调度算法,在一段时间内(timeout指定的时间),能够实现将来自同一个地址的请求始终发往同一个RS;

    • ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

    • port Affinity:

      • 每端口持久:每个端口对应定义为一个集群服务,每集群服务单独调度;
      • 每防火墙标记持久:基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity;
      • 每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,必须定义为持久模式;
  • 保存及重载规则:

    • 保存:建议保存至/etc/sysconfig/ipvsadm

      ipvsadm-save > /PATH/TO/IPVSADM_FILE
      ipvsadm -S > /PATH/TO/IPVSADM_FILE
      systemctl stop ipvsadm.service
    • 重载:

      ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
      ipvsadm -R < /PATH/FROM/IPVSADM_FILE
      systemctl restart ipvsadm.service
  • 高可用问题

    • Director不可用,整个系统将不可用;SPoF

      • 解决方案:高可用
        keepalived
        heartbeat/corosync
    • 某RS不可用时,Director依然会调度请求至此RS;

      • 解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用;

        • keepalived(核心功能是对Director进行冗余的,还可以对后端主机的健康状态进行检测)
        • ldirectord(只对后端主机进行健康状态检测)
      • 检测方式:
        (a) 网络层检测;
        (b) 传输层检测,端口探测;ncat、nmap
        (c) 应用层检测,请求某关键资源;
    • 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"

原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/78442

(0)
ss
上一篇 2017-06-23
下一篇 2017-06-24

相关推荐

  • 负载均衡LVS原理及其应用

    一、LB常用解决方案     1. 硬件负载均衡解决方案:          F5公司: BIG-IP         Citrix公司: …

    Linux干货 2015-12-28
  • 计算机扫盲闲谈

    什么是计算机?计算机是干什么的?什么又是操作系统?来上车,坐好了,听老司机给你娓娓道来。(大神勿喷)

    2018-03-26
  • find和grep命令练习

                                    find和grep命令练习 1、显示当前系统上root,fedora,或user1用户的默认shell; ~]# cat /etc/pa…

    Linux干货 2016-10-23
  • psql: undefined symbol: PQconnectdbParams 已解决

    操作PostgreSQL的过程中,在执行psql的时候,遇到了如下错误:  /path/to/postgresql/bin/psql: symbol lookup error: /usr/pgsql-9.2/bin/psql: undefined symbol: PQconnectdbParams 整理后发现是,PostgreSQL的动态链接库没有…

    Linux干货 2015-03-08
  • 第五周

    1、简述rpm与yum命令的常见选项,并举例
    2、自建yum仓库,分别为网络源和本地源
    3、简述at和crontab命令,制定 每周三凌晨三、五点10分执行某个脚本,输出当前时间,时间格式为 2017-12-28 10:00:00
    4、简述sed常用操作命令,并举例

    Linux干货 2017-12-30