Cluster 简介:
系统扩展的方式:
scale up: 向上扩展
scale out: 向外扩展

集群类型:
    LB:负载均衡集群,Load Balancing
    HA:高可用集群,High Availability
    HP:高性能集群,High Performancing

    Availability=90%,95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%

系统:
    可扩展性
    可用性
    容量
    性能

系统运维:可用 --> 标准化 --> 自动化

    www.top500.org

构建高可扩展性系统的重要原则:在系统内部尽量避免串行化和交互;

GSLB: Global Service Load Balancing
    SLB: Service Load Balancing

总结:
    分层
    分割
    分布式
        分布式应用
        分布式静态资源
        分布式数据和存储
        分布式计算

LB集群的实现:
    硬件:
        F5 BIG-IP
        Citrix NetScaler
        A10 A10
        Array
        Redware
    软件:
        lvs
        haproxy
        nginx
        ats (apache traffic server)
        perlbal

        基于工作的协议层次划分:
            传输层:
                lvs, haproxy(mode tcp)
            应用层:
                haproxy, nginx, ats, perlbal

lvs介绍:
lvs: Linux Virtual Server

    l4: 四层交换,四层路由;
        根据请求报文的目标IP和PORT将其转发至后端主机集群中的某一台主机(根据挑选算法);

        netfilter:
            PREROUTING --> INPUT 
            PREROUTING --> FORWARD --> POSTROUTING
            OUTPUT --> POSTROUTING

    lvs:
        ipvsadm/ipvs

        ipvsadm: 用户空间的命令行工具,用于管理集群服务;
        ipvs: 工作内核中netfilter INPUT钩子上;

        支持TCP, UDP, AH, EST, AH_EST, SCTP等诸多协议;

    lvs arch:
        调度器:director, dispatcher, balancer
        RS: Real Server

        Client IP: CIP
        Director Virutal IP: VIP
        Director IP: DIP
        Real Server IP: RIP

    lvs type: 
        lvs-nat
        lvs-dr(direct routing)
        lvs-tun(ip tunneling)
        lvs-fullnat

        lvs-nat: 
            多目标的DNAT(iptables);它通过修改请求报文的目标IP地址(同时可能会修改目标端口)至挑选出某RS的RIP地址实现转发;

            (1) RS应该和DIP应该使用私网地址,且RS的网关要指向DIP;
            (2) 请求和响应报文都要经由director转发;极高负载的场景中,director可能会成为系统瓶颈;
            (3) 支持端口映射;
            (4) RS可以使用任意OS;
            (5) RS的RIP和Director的DIP必须在同一IP网络;

        lvs-dr: direct routing
            它通过修改请求报文的目标MAC地址进行转发;
                Director: VIP, DIP
                RSs: RIP, VIP

            (1) 保证前端路由器将目标IP为VIP的请求报文发送给director; 
                解决方案:
                    静态绑定
                    arptables
                    修改RS主机内核的参数
            (2) RS的RIP可以使用私有地址;但也可以使用公网地址;
            (3) RS跟Director必须在同一物理网络中;
            (4) 请求报文经由Director调度,但响应报文一定不能经由Director;
            (5) 不支持端口映射;
            (6) RS可以大多数OS;
            (7) RS的网关不能指向DIP;
    lvs-type:
    lvs-nat: RIP与DIP必须在同一网段;
    lvs-dr:Director与RS必须在同一物理网络;
    lvs-tun:
        不修改请求报文的ip首部,而是通过在原有的ip首部(cip<-->vip)之外,再封装一个ip首部(dip<-->rip);

            (1) RIP, DIP, VIP全得是公网地址;
            (2) RS的网关的不能指向DIP;
            (3) 请求报文必须经由director调度,但响应报文必须不能经由director;
            (4) 不支持端口映射;
            (5) RS的OS必须支持隧道功能;

    lvs-fullnat:
        director通过同时修改请求报文的目标地址和源地址进行转发;

            (1) VIP是公网地址;RIP和DIP是私网地址,二者无须在同一网络中;
            (2) RS接收到的请求报文的源地址为DIP,因此要响应给DIP;
            (3) 请求报文和响应报文都必须经由Director; 
            (4) 支持端口映射机制;
            (5) RS可以使用任意OS;

http: stateless
    session保持:
        session绑定:
            source ip hash
            cookie 
        session集群:              
        session服务器:

LVS调度器:
lvs scheduler: #调度器
静态方法:仅根据算法本身进行调度; #起点公平
RR:round robin,轮调
WRR:weighted rr, 加权轮询
SH: source hash, 实现session保持的机制;将来自于同一个IP的请求始终调度至同一RS;
DH:destination hash, 将对同一个目标的请求始终发往同一个RS;
动态方法:根据算法及各RS的当前负载状态进行调度; #结果公平
Overhead=
LC:Least Connection #最小连接数
Overhead=Active256+Inactive
WLC: Weighted LC #加权最小连接数
Overhead=(Active
256+Inactive)/weight
SED: Shortest Expection Delay #最短期望延迟
Overhead=(Active+1)*256/weight
NQ:Never Queue #永不排队
SED算法的改进;
LBLC:Locality-Based LC,即为动态的DH算法;
正向代理情形下的cache server调度;
LBLCR:Locality-Based Least-Connection with Replication,带复制功能的LBLC算法;

ipvs的集群服务:
    tcp, udp, ah, esp, ah_esp, sctp

    (1) 一个ipvs主机可以同时定义多个cluster service;  #cluster service 集群服务
        tcp, udp
    (2) 一个cluster service上至少应该一个real server; #real server  后端主机

        定义时:指明lvs-type, 以及lvs scheduler;  #lvs-type 集群类型 ; lvs scheduler集群调度算法

ipvsadm的用法:
    管理集群服务
        ipvsadm -A|E -t|u|f service-address [-s scheduler]  #增加命令
        ipvsadm -D -t|u|f service-address        #删除命令

        service-address:
            tcp: -t ip:port
            udp: -u ip:port
            fwm: -f mark       #防火墙标记

        -s scheculer:  #指定调度器
            默认为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: 
            ip[:port]

        lvs-type:
            -g: gateway, dr
            -i: ipip, tun
            -m: masquerade, nat

    清空和查看:
        ipvsadm -C   #清空命令
        ipvsadm -L|l [options]     #查询命令
            -n: numeric,基于数字格式显示地址和端口;
            -c: connection,显示ipvs连接;
            --stats:统计数据
            --rate: 速率
            --exact: 精确值        

    保存和重载:
        ipvsadm -R    #重载
        ipvsadm -S [-n]  #保存

    置零计数器:
        ipvsadm -Z [-t|u|f service-address]     

DR模型实践:
lvs-dr:
两个内核参数:
arp_ignore #是否响应对方
参数:0-8
0、只要我收到请求,我有我就响应
1、请求报文从哪个接口进,就从哪个接口出。

        arp_announce   #是否向对方通告
            参数有0、1、2
            0、通告所有网络
            1、尽量不要将我的网段通告给其他网段。
            2、只能用最佳网络地址向网络通告

    director:
        ~]# ifconfig eno16777736:0 172.16.100.10/32 broadcast 172.16.100.10 up
        ~]# route add -host 172.16.100.10 dev eno16777736:0

    RS:

        ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
        ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 
        ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
        ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 

        ~]# ifconfig lo:0 172.16.100.10/32 broadcast 172.16.100.10 up
        ~]# route add -host 172.16.100.10 dev lo:0

FWM定义集群:
netfilter:
PREROUTING --> INPUT
PREROUTING --> FORWARD --> POSTROUTING
OUTPUT --> POSTROUTING

ipvs: INPUT

FWM:
    PREROUTING:
        -j MARK --set-mark 10 

    ipvs:
        -A -f 10

通过FWM定义集群的方式:
    (1) 在director上netfilter的mangle表的PREROUTING定义用于“打标”的规则
        ~]# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dports $port -j MARK --set-mark #
            $vip: VIP地址
            $protocol:协议
            $port: 协议端口
    (2) 基于FWM定义集群服务:
        ~]# ipvsadm -A -f # -s scheduler
        ~]#

    功用:将共享一组RS的集群服务统一进行定义;

会话保持,持久连接
session保持:
session绑定
session复制
session服务器

    session绑定:lvs sh算法
        对某一特定服务;

lvs persistence:lvs的持久连接  #在执行参数时,加入-p选项即可进行持久连接设置,该设置默认是300s
    ipvsadm -A -t 192.168.0.10:0 -s rr -p 
    ipvsadm -a -t 192.168.0.10:0 -r 172.168.100.21 -g 
    ipvsadm -a -t 192.168.0.10:0 -r 172.168.100.22 -g 

    功能:无论ipvs使用何种调度方法,其都能实现将来自于同一个Client的请求始终定向至第一次调度时挑选出的RS;

        持久连接模板:独立于算法 
            sourceip rs timer

    对多个共享同一组RS的服务器,需要统一进行绑定?

    持久连接的实现方式:
        每端口持久:PPC,单服务持久调度
        每FWM持久:PFWMC,单FWM持久调度
            PORT AFFINITY
        每客户端持久:PCC,单客户端持久调度
            director会将用户的任何请求都识别为集群服务,并向RS进行调度
                TCP:1-65535
                UDP: 1-65535

HA:
SPOF: Single Point of Failure

    director: 高可用集群;
    realserver: 让director对其做健康状态检测,并且根据检测的结果自动完成添加或移除等管理功能;

        1、基于协议层次检查
            ip: icmp
            传输层:检测端口的开放状态
            应用层:请求获取关键性的资源

        2、检查频度   #取决用户层面或者业务架构层次

        3、状态判断
            下线:ok --> failure --> failure --> failure
            上线:failure --> ok --> ok

        4、back server, sorry server