LB-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/78556

(0)
上一篇 2017-06-25 23:42
下一篇 2017-06-25 23:44

相关推荐

  • 推荐-DNS BIND初探

    DNS BIND DNS BIND 正向解析 反向解析 从服务器 子域授权 转发 view DNS 什么是DNS? DNS是domain name system,域名系统的简写,负责实现域名与IP的转换。 DNS的功能是什么? DNS能够将IP地址与域名相互双向转换,能够实现域名访问。 DNS的历史:  1. 初期网络…

    2016-04-19
  • java基础篇—内存分析

    Java的并发采用的是共享内存模型(而非消息传递模型),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现 同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 1、多线程通信 1.1 内存模型 Java线程之间的通信由Java内存…

    Linux干货 2015-03-16
  • Linux系统上获取命令的帮助信息方法

    当我们在操作linux时忘记相关命令的用法时,可以使用man 命令或者命令 -h来查询该命令的用法; man文档共有9个章节 1:所有用户可以操作的指令或可执行文件 2:系统核心调用的函数与工具 3:子调用,常用的函数与函数库 4:设备,硬件文件说明,通常是/dev/的文件 5:文件格式,配置文件或者是某些档案的格式 6:游戏相关 7:杂项,例如linux文…

    Linux干货 2018-03-04
  • 详解 /etc/inittab 文件

    当内核初始化后,就会启动第一个进程 init,init进程会进行一系列的系统初始化工作,init是根据什么来进行初始化的? init 会读取/etc/inittab文件(针对CentOS 5 系列),执行里面的内容来进行初始化工作,这个文件是一定的格式。 获取inittab文件的帮助,输入 man inittab 命令 过滤掉空白行和以#号开始的行,内容如下…

    Linux干货 2015-03-10
  • grep&正则表达式

    grep&正则表达式 grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 语法 grep [选项]… PATTERN [FILE]… 选项 -a 不要忽略…

    Linux干货 2018-03-23
  • 数据结构应用详解-

    概述 最小生成树——无向连通图的所有生成树中有一棵边的权值总和最小的生成树 拓扑排序 ——由偏序定义得到拓扑有序的操作便是拓扑排序。建立模型是AOV网 关键路径——在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度,路径长度最长的路径叫做关键路径(Critical Path)。 最短路径——最短路径问题是…

    Linux干货 2015-04-07