linux学习53-LVS

1. 集群概念(Cluster)

  • 系统扩展方式:

    1. Scale UP:向上扩展(硬件设备)
    2. Scale Out:向外扩展,增加设备,调度分配问题,采用Cluster

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

  • Linux Cluster(集群)类型:
    参考
    https://www.ibm.com/developerworks/cn/linux/cluster/lw-clustering.html
    https://www.top500.org
    在群集的这三种基本类型之间,经常会发生混合与交杂。于是,可以发现高可用性群集也可以在其节点之间均衡用户负载,同时仍试图维持高可用性程度。同样,可以从要编入应用程序的群集中找到一个并行群集,它可以在节点之间执行负载均衡。尽管集群系统本身独立于它在使用的软件或硬件,但要有效运行系统时,硬件连接将起关键作用

    1. LB:Load Balancing,负载均衡集群
      将用户的请求按照一定的比例均匀的发布到不同的服务器上,该系统使负载可以在计算机群集中尽可能平均地分摊处理
    2. HA:High Availiablity,高可用性集群
      解决SPOF(single Point Of failure),解决不了性能问题,其主要作用是使集群的整体服务尽可能可用,如果高可用性群集中的主节点发生了故障,那么这段时间内将由次节点代替它。次节点通常是主节点的镜像,所以当它代替主节点时,它可以完全接管其身份,并且因此使系统环境对于用户是一致的,重要参数如下
      1. MTBF:
        Mean Time Between Failure 平均无故障时间
      2. MTTR:
        Mean Time To Restoration( repair)平均恢复前时间,故障时间
      3. 高可用判断系数(以年为单位)
        A=MTBF/(MTBF+MTTR) (0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
    3. HPC:High-performance computing,高性能集群
      解决复杂的科学问题,内部由十至上万个独立处理器组成,通过高速链接来链接处理器,在公共消息传递层上进行通信以运行并行应用程序
  • LB Cluster的实现

    1. 硬件解决方案:实现调度功能,通常主备2台
      F5 Big-IP
      Citrix Netscaler
      A10 A10
    2. 软件解决方案
      1. lvs:Linux Virtual Server (官方宣传号称支持并发400万)
        内核级实现,不需要装服务器软件,性能强大,功能相对少
      2. nginx:做代理服务器
        支持七层调度,阿里七层SLB使用Tengine,比lvs性能差,但是功能丰富
      3. haproxy:
        支持七层调度,只做调度功能
      4. ats:apache traffic server,
        yahoo捐助
      5. perlbal:Perl 编写
      6. pound
    3. 集群调度中会话保持:负载均衡
      1. session sticky:同一用户调度固定服务器
        Source IP:LVS sh算法(对某一特定服务而言)
        Cookie
      2. session replication:每台服务器拥有全部session
        session multicast cluster
      3. session server:专门的session服务器
        Memcached,Redis
  • HA集群实现方案

    1. keepalived:vrrp协议
    2. ais:应用接口规范
    3. heartbeat
    4. cman+rgmanager(RHCS)
    5. coresync_pacemaker
  • Cluster基于工作的协议层次划分

    1. 四层调度传输层(通用):
      1. 描述
        传输层往下的,识别不了应用层协议(例如http协议),不能识别Cookie,可以识别出同一个ip地址发来的请求,服务器收到的原地址为客户端地址
      2. 支持的服务类型
        1. LVS
        2. nginx:stream
        3. haproxy:mode tcp
    2. 七层调度应用层(专用):针对特定协议,自定义的请求模型分类
      1. 描述
        服务器收到的请求报文原地址为代理服务器proxy的地址,因为在代理服务器上,会将客户端请求报文解封装,在重新封装为代理服务器的报头
      2. 服务
        1. nginx:可以当http和fastcgi的代理服务器,不能代理mysql
        2. haproxy:
        3. proxy server:可以,识别应用层协议,不叫调度器,而叫代理服务器
        4. http:nginx, httpd, haproxy(mode http), …
        5. fastcgi:nginx, httpd, …
        6. mysql:mysql-proxy, …

2. LVS介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一

  • 官方网站
    http://www.linuxvirtualserver.org/

  • lvs集群类型中的术语:

    1. VS:Virtual Server,Director Server(DS) ,Dispatcher(调度器),Load Balancer
      负载调度器,是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的
    2. RS:Real Server(lvs), upstream server(nginx),backend server(haproxy)
      是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等
    3. CIP:Client IP
      客户端ip地址
    4. VIP: Virtual serve IP
      调度服务器对外的IP地址
    5. DIP: Director IP VS
      调度服务器对于内网的IP地址
    6. RIP: Real server IP
      集群中提供服务的服务器IP地址
  • 工作原理
    VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS;如何调度到RS上由下面介绍的lvs工作模型(4种)决定;调度算法有10种

  • lvs数据调度
    lvs需要借助iptables/netfilter,通过修改内核参数,在INPUT链前增加一个LVS功能模块,转发数据包
    在这里插入图片描述

  • lvs集群的工作模型

    1. lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
    2. lvs-dr:直接路由,操纵封装新的MAC地址,LVS默认模式,应用最广
    3. lvs-tun:隧道,在原请求IP报文之外新加一个IP首部
    4. lvs-fullnat:修改请求报文的源和目标IP
  • lvs-nat模式

    1. IP包调度过程
      在这里插入图片描述
    2. lvs-nat转发方式
      lvs服务器与RS服务器之间使用交换机或路由器都可以,涉及到ip头的更改,需要启动ipforword转发,本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
      1. RIP和DIP应在同一个IP网络,且应使用私网地址(可以为公网,较浪费);RS的网关要指向DIP
      2. 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
      3. 支持端口映射,可修改请求报文的目标PORT
      4. VS必须是Linux系统,RS可以是任意OS系统
  • LVS-DR模式

    1. DR模式IP包调度过程
      在这里插入图片描述
    2. LVS-DR转发方式
      1. 通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;
      2. 源IP/PORT,以及目标IP/PORT均保持不变,传输层不动,不支持端口映射,不需要启用Ipforword转发
      3. 当请求到达服务器时,网络层不动,只修改数据链路层的mac地址
      4. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
    3. 避免vip冲突的方法
      1. 不回应广播
        arp_ignore=1,找到设定目录find /proc -name "*arp_ignore",修改lo和all目录下的项
        0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
        1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
      2. 启动时不发免费ARP
        arp_announce=2,找到设定目录find /proc -name "*arp_announce",修改lo和all目录下的项
        0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
        1:尽量避免将接口信息向非直接连接网络进行通告
        2:必须避免将接口信息向非本网络进行通告
      3. 将ip地址绑定为静态,指定mac地址
    4. 网络配置要求
      1. lvs服务器与RS服务器之间为交换机
      2. 确保前端路由器将目标IP为VIP的请求报文发往Director
        1. 在前端网关做静态绑定VIP和Director的MAC地址
        2. 在RS上使用arptables工具
          arptables -A IN -d $VIP -j DROP
          arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
      3. 在RS上修改内核参数以限制arp通告及应答级别(lo和all都要修改),保存配置需要修改配置文件/etc/sysctl.conf
        1. /proc/sys/net/ipv4/conf/all/arp_ignore
        2. /proc/sys/net/ipv4/conf/all/arp_announce
      4. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director
      5. RS和Director要在同一个物理网络
      6. Director和各RS都配置有VIP
      7. 不支持端口映射(端口不能修败)
      8. RS可使用大多数OS系统
  • lvs-tun模式

    1. TUN模式IP包调度过程
      在这里插入图片描述
    2. 转发方式
      不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
    3. DIP, VIP, RIP都应该是公网地址
    4. RS的网关一般不能指向DIP
    5. 请求报文要经由Director,但响应不经由Director
    6. 不支持端口映射
    7. RS的OS须支持隧道功能
  • lvs-fullnat模式(此类型kernel默认不支持)

    1. lvs-fullnat转发方式
      通过同时修改请求报文的源IP地址和目标IP地址进行转发
      CIP --> DIP
      VIP --> RIP
    2. 网络配置要求
      1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
      2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
      3. 请求和响应报文都经由Director
      4. 支持端口映射
  • LVS工作模式总结

    参数 VS/NAT VS/TUN VS/DR
    server any Tunneling Non-arp device
    server network private LAN/WAN LAN
    server number low(10~20) High(100) High(100)
    server gateway load balancer own router own router
    1. lvs-nat与lvs-fullnat:请求和响应报文都经由Director
      lvs-nat:RIP的网关要指向DIP
      lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
    2. lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
      lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
      lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
  • 调度算法(ipvs scheduler)
    根据其调度时是否考虑各RS当前的负载状态,分为静态和动态两大类

    1. 静态方法:仅根据算法本身进行调度,不考虑后端服务器的情况
      1. RR:roundrobin,轮询
      2. WRR:Weighted RR,加权轮询
      3. SH:Source Hashing,实现session sticky,源IP地址hash
        将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
      4. DH:Destination Hashing;目标地址哈希
        第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
        ipvs scheduler
    2. 动态方法:主要根据每RS当前的负载状态及调度算法进行调度(Overhead=value 较小的RS将被调度)
      1. LC:least connections 适用于长连接应用
        1. 算法:Overhead=activeconns*256+inactiveconns
        2. 参数说明
          activeconns:建立三次握手,并且有数据在传输
          inactiveconns:三次握手后,没有数据传输
      2. WLC:Weighted LC,默认调度方法
        算法:Overhead=(activeconns*256+inactiveconns)/weight
      3. SED:Shortest Expection Delay,初始连接高权重优先
        算法:Overhead=(activeconns+1)*256/weight
      4. NQ:Never Queue,第一轮均匀分配,后续SED
      5. LBLC:Locality-Based LC,动态的DH算法
        使用场景:根据负载状态实现正向代理
      6. LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

3 ipvsadm包构成

ipvsadm用于设置、维护和检查虚拟服务器,支持TCP和UDP协议

  • 支持三种工作模型
    NAT,tunneling,direct routing

  • 支持八种负载均衡算法
    round robin, weighted round robin, least-connection, weighted least-connection, locality-based least-connection, locality-based least-connection with replication, destination-hashing, and source-hashing

  • 程序安装

    1. 程序包:ipvsadm
    2. 包文件
      1. 服务文件
        /usr/lib/systemd/system/ipvsadm.service
      2. 主程序:
        /usr/sbin/ipvsadm
      3. 规则保存工具:
        /usr/sbin/ipvsadm-save
      4. 规则重载工具:
        /usr/sbin/ipvsadm-restore
      5. 配置文件:
        /etc/sysconfig/ipvsadm-config
  • 核心功能

    1. 集群服务管理:创建集群,涉及到vip及端口号和协议,调度算法
    2. 集群服务的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]
  • 管理集群服务:增、改、删

    1. 增、改:-A表示增加,-E表示修改
      ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
    2. 删除:-D表示删除
      ipvsadm -D -t|u|f service-address
    3. 参数说明
      1. service-address:vip服务的地址及端口号
      2. -t:TCP协议的端口,VIP:TCP_PORT
      3. -u:UDP协议的端口,VIP:UDP_PORT
      4. -f:firewall MARK,标记,一个数字
      5. [-s scheduler]:指定集群的调度算法,默认为wlc
      6. [-p [timeout]]:超时时长
  • 管理集群上的RS:增、改、删

    1. 增、改:-a表示增加,-e表示修改
      ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
    2. 删:-d表示删除
      ipvsadm -d -t|u|f service-address -r server-address
    3. 其他参数说明
      1. -r server-address[:port]:RS的ip地址,如省略port,不作端口映射
      2. server-address:vip的地址及端口
      3. lvs工作模型:
        1. -g:gateway, dr类型,默认
        2. -i:ipip, tun类型
        3. -m:masquerade, nat类型
      4. -w weight:权重
  • 其他ipvsadm命令

    1. 清空定义的所有内容
      ipvsadm -C
    2. 清空计数器
      ipvsadm -Z [-t|u|f service-address]
    3. 查看
      1. 命令格式
        ipvsadm -L|l [options]
      2. 选项
        --numeric, -n:以数字形式输出地址和端口号
        必须L在前,不然语法错误
        [root@hai7-2 ~]$ ipvsadm -Ln
        
        --exact:扩展信息,精确值
        --connection,-c:当前IPVS连接输出
        [root@hai7-2 ~]$ipvsadm -Lnc
        IPVS connection entries			
        pro     expire   state          source              virtual           destination
        |协议|连接过期时间|连接状态|        客户端地址      |     vip地址     |      响应的RS
        TCP     01:58  TIME_WAIT  172.20.124.254:41326 172.20.125.0:80    192.168.50.105:80
        
        –stats:统计信息
        [root@hai7-2 ~]$ipvsadm -Ln --stats
        Prot LocalAddress:Port          Conns   InPkts  OutPkts  InBytes OutBytes
        								|连接|  收到包  |  发送包 |收到大小|发送大小|								
        
        –rate :输出速率信息
        [root@hai7-2 ~]$ipvsadm -Ln --rate
        Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
        									|每秒连接数|收到报文|发出报文|收到字节|发出字节
        
    4. ipvs规则:/proc/net/ip_vs
      显示内如与ipvsadm -Ln相似,只是将ip地址以16进制显示
    5. ipvs连接:/proc/net/ip_vs_conn
  • 保存及重载规则

    1. 查看保存的规则(重启会失效),默认打印在屏幕上
      [root@hai7-2 ~]$ipvsadm-save -n
      
    2. 重定向至指定目录,可以自定义,推荐保存于/etc/sysconfig/ipvsadm中,与ipvsadm.service服务相同,可以自动加载
      查看ipvsadm.service服务设置
      [root@hai7-2 ~]$cat /usr/lib/systemd/system/ipvsadm.service
      ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
      ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
      
      保存策略
      ipvsadm-save > /PATH/TO/IPVSADM_FILE
      ipvsadm -S > /PATH/TO/IPVSADM_FILE
      [root@hai7-2 ~]$ipvsadm-save -n > /etc/sysconfig/ipvsadm
      
    3. 重载:
      ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
      ipvsadm -R < /PATH/FROM/IPVSADM_FILE
      systemctl restart ipvsadm.service

4. 搭建负载均衡集群

  • 负载均衡集群设计时要注意的问题
    1. 是否需要会话保持
    2. 是否需要共享存储
      共享存储:NAS, SAN, DS(分布式存储)
      数据同步:
    3. 搭建https时,RS都要提供同一个私钥和同一个证书

4.1 搭建net模型

  • 设计要点

    1. RIP与DIP在同一IP网络, RIP的网关要指向DIP
    2. 支持端口映射
    3. Director要打开核心转发功能
  • 拓扑图
    在这里插入图片描述

  • 主机准备

    1. 客户机
      172.20.124.254
    2. LVS服务器
      双网卡,外网ens33:172.20.125.0/16,内网ens37:192.168.47.129/24
    3. 路由器
      可以直接使用交换机,这里只是说明可以使用路由器连接两个网段
    4. RS服务器:
      RS1:192.168.50.104/24
      RS2:192.168.50.105/24
  • 路由器设置

    1. 当做路由器的主机,需要开启ipforword功能
      [root@hai7-2 ~]$vim /etc/sysctl.conf
      net.ipv4.ip_forward = 1
      [root@hai7-2 ~]$sysctl -p
      
    2. 路由器需要知道报文回去的路径,所以需要添加172.20网段的路由,网关指向lvs服务器的192.168.47.129
      [root@hai7-2 ~]$ip route add 172.20.0.0/16 via 192.168.47.129
      
  • 配置lvs

    1. lvs服务器需要访问RS服务器网段,需要加访问路由,也需要开启ipforword功能,因为是内核功能,所以在lvs服务器看不到监听的80端口
      [root@hai7-2 ~]$route add -net 192.168.50.0/24 gw 192.168.47.128
      
    2. 安装包ipvsadm
      [root@hai7-2 ~]$yum install ipvsadm -y
      
    3. 增加集群服务器策略
      [root@hai7-2 ~]$ipvsadm -A -t 172.20.125.0:80  -s rr
      
    4. 添加RS服务器策略
      [root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:80  -r 192.168.50.104  -m
      [root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:80  -r 192.168.50.105  -m 
      
    5. 查看添加后的策略
      [root@hai7-2 ~]$ipvsadm -Ln
      IP Virtual Server version 1.2.1 (size=4096)
      Prot LocalAddress:Port Scheduler Flags
        -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
      TCP  172.20.125.0:80 rr
        -> 192.168.50.104:80            Masq    1      0          1         
        -> 192.168.50.105:80            Masq    1      0          0 
      
  • 客户端测试
    使用客户机测试,采用的轮询策略,RS1和RS2轮流出现

    [root@hai7-1 ~]$curl 172.20.125.0
    RS1 Server
    [root@hai7-1 ~]$curl 172.20.125.0
    RS2 Server
    
  • 如果RS服务器使用非常规端口8080,如何修改策略

    1. 修改RS2的httpd服务端口为8080
      [root@hai7-2 ~]$vim /etc/httpd/conf/httpd.conf
      Listen 8080
      
    2. 修改集群服务器策略
      [root@hai7-2 ~]$ipvsadm -e -t 172.20.125.0:80 -r 192.168.50.105:8080 -m
      
  • lvs的缺点
    停掉其中一个RS服务器,会造成,部分访问失败,因为没有设置健康性检测,这是lvs服务器的弊端

    1. '停掉RS2服务器'
    [root@hai7-2 ~]$systemctl stop httpd
    2. '在客户机测试,轮询算法,调度到RS2时会报错'
    [root@hai7-1 ~]$curl 172.20.125.0
    curl: (7) Failed connect to 172.20.125.0:80; Connection refused  <==访问失败
    [root@hai7-1 ~]$curl 172.20.125.0
    RS1 Server      <==访问成功
    
  • 为RS服务器加权重,定义调度额度

    1. 修改lvs服务器算法,不能为轮询,不然看不出效果
      [root@hai7-2 ~]$ipvsadm -E -t 172.20.125.0:80 -s wrr
      
    2. 定义RS服务器的权重-w选项,默认为1
      [root@hai7-2 ~]$ipvsadm -e -t 172.20.125.0:80 -r 192.168.50.105:8080 -m -w 3
      
    3. 调整后策略效果,Weight显示为3,使用客户机测试,RS2服务器承担3份访问量
      [root@hai7-2 ~]$ipvsadm -Ln
      TCP  172.20.125.0:80 wrr
        -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
        -> 1192.168.50.105:8080          Masq    3      0          0  
      
  • 搭建httpds集群服务

    1. 实验环境,使用自签名证书,在RS服务器上添加mod_ssl,使用其自生成的证书,重启httpd服务
      [root@hai7-2 ~]$yum install -y mod_ssl
      
    2. 在lvs服务器上添加https集群规则,映射端口为443
      [root@hai7-2 ~]$ipvsadm -A -t 172.20.125.0:443 -s rr
      
    3. 在lvs服务器上添加RS服务器规则
      [root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:443 -r 192.168.50.104 -m
      [root@hai7-2 ~]$ipvsadm -a -t 172.20.125.0:443 -r 192.168.50.105 -m
      
    4. 在客户端测试,忽略证书验证
      [root@hai7-1 ~]$curl -k https://172.20.125.0
      RS2 Serve
      

4.2 搭建dr模型

  • 设计要点
    1. RS服务器上需要绑定vip,需要解决地址冲突问题
    2. Director服务器虽然不参与响应,但不能没有网关
    3. 客户端需要有指向vip的路由
  • 拓扑图
    在这里插入图片描述
  • 主机准备
    1. 客户机
      172.20.124.254/16,需要添加找到VIP地址的路由
    2. 外网路由器
      A口:172.20.125.180/16与客户机同网段
      B口:192.168.50.106/24与内网同网段,还需要连接Director Server外网的网段地址增加一个10.0.0.51/8(Director Server的VIP地址对子网掩码没有要求,只要可以接收路由器的广播就可以)
    3. LVS服务器
      192.168.50.102/24,将VIP(外网地址)绑定在回环网卡l0上,将192.168.50.102/24的网关指向路由器(本质来说网关可以任意指定,lvs不参与通信,只是不加网关系统默认没有路,停止通信)
    4. RS服务器
      RS1:192.168.50.104/24,将VIP(外网地址)绑定在回环网卡l0上
      RS2:192.168.50.105/24,将VIP(外网地址)绑定在回环网卡l0上
  • 客户端,添加VIP地址路由
    [root@hai7-1 ~]$route add -net 10.0.0.0/8 gw 172.20.125.180
    
  • 修改RS服务器相关设置
    1. 修改内容如脚本所示
      [root@hai7-2 ~]$cat lvs_dr_rs.sh 
      #!/bin/bash
      #Author:wangxiaochun
      #Date:2017-08-13
      vip=10.0.0.100           <==设置变量vip地址
      mask='255.255.255.255'     <==设置变量vip子网掩码,vip作用是接收数据报文,只要有出去的路由就可以,子网掩码没要求
      dev=lo:1
      rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null        <==检测httpd服务是否安装,
      service httpd start &> /dev/null && echo "The httpd Server is Ready!"      <==启动httpd
      echo "<h1>`hostname`</h1>" > /var/www/html/index.html          <==设置web页面
      
      case $1 in    <==$1表示命令后跟的第一个参数
      start)
          echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore        <==修改为忽略arp相应
          echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
          echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce      <==修改为不使用免费arp
          echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
          ifconfig $dev $vip netmask $mask #broadcast $vip up
          #route add -host $vip dev $dev
          echo "The RS Server is Ready!"
          ;;
      stop)
          ifconfig $dev down          <==停止服务时,还原arp设置
          echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore    
          echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
          echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
          echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
          echo "The RS Server is Canceled!"
          ;;
      	*) 
          echo "Usage: $(basename $0) start|stop"
          exit 1
          ;;
      esac
      
    2. 在两台RS服务器上分别执行以上脚本
      [root@hai7-2 ~]$bash lvs_dr_rs.sh start
      
    3. 将RS服务器网关指向路由器临近接口,不经过LVS服务器,直接回应给用户
      [root@hai7-2 ~]$route -n
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      0.0.0.0         192.168.50.106  0.0.0.0         UG    100    0        0 ens37
      
  • 配置lvs服务器
    1. 配置内容,如脚本所示
      #!/bin/bash
      #Author:wangxiaochun
      #Date:2017-08-13
      vip='10.0.0.100'      <==vip地址
      iface='lo:1'      <==绑定的回环网卡
      mask='255.255.255.255'
      port='80'      <==端口为80
      rs1='192.168.50.104'      <==设置增加集群RS服务器策略
      rs2='192.168.50.105'
      scheduler='wrr'         <==设置集群规则-s选项
      type='-g'      <==设置lvs工作模型
      rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null        <==确认ipvsadm安装
      
      case $1 in
      start)
          ifconfig $iface $vip netmask $mask #broadcast $vip up         <==绑定vip地址到回环网卡
          iptables -F         <==清空iptables规则
      
          ipvsadm -A -t ${vip}:${port} -s $scheduler           <==添加lvs集群规则
          ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1       <==添加集群RS服务器规则
          ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
          echo "The VS Server is Ready!"
          ;;
      stop)
          ipvsadm -C               <==停止集群时清空规则
          ifconfig $iface down
          echo "The VS Server is Canceled!"
          ;;
      *)
          echo "Usage: $(basename $0) start|stop"
          exit 1
          ;;
      esac
      

5. FWM(FireWall Mark)

借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度

  • 实现方法:
    1. 在Director主机打标记,作用在mangle表PREROUTING链
      1. 格式
        iptables -t mangle -A PREROUTING -d $vip -p $proto –m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER
      2. 参数说明
        MARK target :可用于给特定的报文打标记
        –set-mark value:value 可为0xffff格式,表示十六进制数字
    2. 在Director主机基于标记定义集群服务:
      ipvsadm -A -f NUMBER [options]
  • 示例
    1. 将http和https使用同一个集群服务进行调度, -d表示vip地址
      [root@hai7-2 ~]$iptables -t mangle -A PREROUTING -d 10.0.0.100/32 -p tcp  -m multiport --dports 80,443 -j MARK --set-mark 10
      
    2. 查看贴的标签,查看iptables规则,表为mangle
      [root@hai7-2 ~]$iptables -t mangle -nvL
      Chain PREROUTING (policy ACCEPT 41 packets, 3253 bytes)
       pkts bytes target     prot opt in     out     source               destination         
          0     0 MARK       tcp  --  *      *       0.0.0.0/0            10.0.0.100           multiport dports 80,443 MARK set 0xa(16进制的10)
      
    3. 定义ipvs规则,各服务器网络设置按dr模型搭建,-f指定标签即可,不需要写vip地址
      [root@hai7-2 ~]$ipvsadm -A -f 10 -s rr 
      [root@hai7-2 ~]$ipvsadm -a -f 10 -r 192.168.50.104 -g
      [root@hai7-2 ~]$ipvsadm -a -f 10 -r 192.168.50.105 -g
      
    4. 生成的规则
      [root@hai7-2 ~]$ipvsadm -Ln
      FWM  10 rr
        -> 192.168.50.104:0             Route   1      0          0         
        -> 192.168.50.105:0             Route   1      0          0 
      
    5. 测试,http和https可以轮流被访问
      [root@hai7-1 ~]$while true;do curl -k https://10.0.0.100;curl http://10.0.0.100;sleep 0.5; done
      

6 持久连接

  1. session 绑定
    对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现
  2. 持久连接( lvs persistence )模板
    实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS
    1. 语法格式
      ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
    2. 选项
      在生成lvs规则时加-p选项
  3. 持久连接实现方式
    1. 每端口持久(PPC)
      每个端口定义为一个集群服务,每集群服务单独调度
    2. 每防火墙标记持久(PFWMC)
      基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity
    3. 每客户端持久(PCC)
      基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式

7 LVS高可用性

  • lvs需要2个问题
    1. Director不可用,整个系统将不可用;
      解决方案:高可用集群(keepalived heartbeat/corosync)
    2. 某RS不可用时,Director依然会调度请求至此RS
      脚本解决方案:
      1. 执行任务计划,每多久执行一次查询命令,没有应答则删除对应RS服务
        [root@hai7-1 ~]$curl http://192.168.50.104 &> /dev/null ||ipvsadm -d -f 10 -r 192.168.50.104
        
      2. 专业的监控工具ldirectord,由Director对各RS健康状态进行检查,失败时禁用,成功时启用
  • 专业监控ldirectord
    监控和控制LVS守护进程,可管理LVS规则
    1. 检测方式
      1. 网络层检测,icmp
      2. 传输层检测,端口探测
      3. 应用层检测,请求某关键资源
    2. 下载地址
      http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/
    3. 包名
      ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
    4. 包文件说明
      1. 主配置文件,ldirectord.cf 默认没有,需要负责模板配置文件
        /etc/ha.d/ldirectord.cf
      2. 配置文件模版
        /usr/share/doc/ldirectord-3.9.6/ldirectord.cf
      3. 服务程序
        /usr/lib/systemd/system/ldirectord.service
      4. 主程序
        /usr/sbin/ldirectord
      5. 日志文件
        /var/log/ldirectord.log
    5. 使用说明
      1. 安装
        [root@hai7-2 ~]$yum install ldirectord-3.9.6-0rc1.1.1.x86_64.rpm 
        
      2. Ldirectord配置文件示例
        1.'拷贝模板文件到主配置目录下'
        [root@hai7-2 ~]$cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
        2. '编辑配置文件'
        [root@hai7-2 ~]$vim /etc/ha.d/ldirectord.cf
        checktimeout=3      <==检查时间超时时长,RS服务器响应时间,超过即删除
        checkinterval=1     <==检测间隔
        autoreload=yes 		<==自动加载,第一次修改需要重启服务器,以后修改会自动加载
        logfile=“/var/log/ldirectord.log“    <==日志文件
        quiescent=no        <==down时yes权重为0,no为删除
        virtual=5    	    <==指定集群服务器的地址(如virtual=10.0.0.100:80),如果未数字表示防火墙标签
        		real=172.16.0.7:80 gate 2       <==DR服务器地址,gate表示DR模型,2表示权重
        		real=172.16.0.8:80 gate 1 
        		fallback=127.0.0.1:80 gate      <==sorry server
        		service=http        			<==集群服务
        		scheduler=wrr    				<==算法名称
        		protocol=tcp        			<==如果使用的是防火墙标签,此项不可使用,因为标签中已经定义,会冲突
        checktype=negotiate       			    <==检测类型,协商
        checkport=80      						<==检测端口
        request="index.html"      				<==检测时访问的页面
        receive=“Test Ldirectord"      			<==指定访问页面返回结果,认定为健康,抓取关键字
        
      3. sorry server设置
        当后端服务器全部宕机时,由lvs服务器充当sorry server,在lvs服务器上安装httpd服务,编辑页面文件,启动服务,当后端服务器宕机时,ldirectord会自动调度
        [root@hai7-2 ~]$echo Sorry > /var/www/html/index.html
        

猜你喜欢

转载自blog.csdn.net/free050463/article/details/83903807