Cluster

系统扩展的方式:

       Scale up:向上扩展;

       Scale out:向外扩展

集群类型:

       LB:负载均衡集群,Load Balancing

       HA:高可用集群,High Availability

       HP:高性能集群,High Performancing

系统:

       可扩展性

       可用性

       容量

       性能

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

       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(1)

       章文嵩:正明;

       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 Virtual 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网络;

      Linux自学笔记——linux cluster 之lvs_第1张图片

Note:客户端主机地址为cip,调度器Director主机有两块网卡,一块地址为vip,一块为dip,两台RS 的主机地址分为为RIP1,RIP2;

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

    Linux自学笔记——linux cluster 之lvs_第2张图片

两个内核参数

      限制响应级别:arp_ignore;

             0:默认值,表示可使用本地任意接口上配置的任意地址响应;

             1:仅在请求的目标ip配置在本地主机的接收到请求报文接口上时,才给予回应;

      限制通告级别:arp_announce;

             0:默认值,把本机上所有的接口的所有信息向每个接口上的网络进行通告;

             1:尽量避免向非直接连接网络进行通告;

             2:必须避免向非本地直接连接网络进行通告;

     

总结:

  lvs-nat:请求和响应报文都经由director,且RIP和DIP必须在同一网络;

  lvs-dr:仅请求报文经由director,响应报文是由RS直接响应给client,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 scheduler

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

         RR:round robin,论调

         WRR:weighted rr,带权重的轮调;

         SH:source hash,实现session保持的机制;将来自于同一个ip的请求始终调度至同一RS;

         DH:destination hash,将对同一个目标的请求始终发往同一个RS;

  动态方法:根据算法及各RS的当前负载状态进行调度;

                Overhead=

         LC:Least Connection

                Overhead=Active*256+Inactive

         WLC:Weighted  LC

                Overhead=(Active*256+Inactive)/weight

         SED:Shortest  Expection  Delay

                Overhead=(Active+1)*256/weight

         NQ:Never Queue

                SED算法的改进;

         LBLC:Loality-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;

tcp ,udp

2)      一个cluster service上至少应该一个real server;

定义时:指明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

                                   fwn: -f  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

                                   ip[:port]

                            lvs-type

                                   -g:gateway,dr

                                   -i:ipip,tun

                                   -m:masquerade,nat

              清空和查看:

                     Ipvsadm   -C

                     Ipvsadm  -L|l  [options]

                            -n:numeric,基于数字格式显示地址和端口;

                            -c:connection,显示ipvs连接;

                            --states:统计数据;

                            --rate:速率;

                            --exact:精确值;

              保存和重载:

                     Ipvsadm –R

                     Ipvsadm  -S [-n]

              置零计数器:

                     Ipvsadm  -Z [-t|u|f  service-address]

 

lvs-nat演示:

实验环境:

       Linux自学笔记——linux cluster 之lvs_第3张图片

       三台虚拟主机,一台作Director,另外两台作RS,在这里,Director的两块网卡,vip是nat模式,dip是自定义vmnet2模式,两台RS的网卡也是vmnet2模式;两台RS的网关都指向dip;

1.      打开Director的核心转发功能;

    image.png

2.      设置Director的ip地址;

    Linux自学笔记——linux cluster 之lvs_第4张图片

3.      两台RS主机的ip地址配置

        1)      RS1主机的配置:

            Linux自学笔记——linux cluster 之lvs_第5张图片

            Note:这里在配置IP地址时在配置文件中直接指明了网关;如果没有指明用route命令添加路由;

            Linux自学笔记——linux cluster 之lvs_第6张图片

        2)      RS2主机的ip配置;

            Linux自学笔记——linux cluster 之lvs_第7张图片

4.      提供测试页面,并开启web服务;

        1)      RS1测试页面及服务开启;

          Linux自学笔记——linux cluster 之lvs_第8张图片  

        2)      RS2测试页面及服务开启;

         Linux自学笔记——linux cluster 之lvs_第9张图片

5.      在Director上添加规则;

   Linux自学笔记——linux cluster 之lvs_第10张图片 

6.      访问测试;

    Linux自学笔记——linux cluster 之lvs_第11张图片

由上可知,此次试验确实达到了负载均衡集群的目的。同时我们也可以在添加规则时,还另外的调度算法再进行测试,这里就不演示了。

 

Lvs-dr演示:

实验环境:

       Linux自学笔记——linux cluster 之lvs_第12张图片

       准备三台虚拟主机,一台作Director,另外两台作RS,在Director上配置两个ip地址,DIP配置在ens33网卡上,vip配置在ens33 的别名上ens33:0,另外RS也同样配置两个地址,RIP配置在网卡eth0上,vip配置在lo的别名上lo:0;

       同时各RS要修改内核参数,来限制arp响应和通告的级别;

1.      配置Director的物理网卡DIP和物理网卡别名VIP;

    Linux自学笔记——linux cluster 之lvs_第13张图片

2.      写一个脚本自动配置RS;

        1)      编辑执行RS1脚本;

            Linux自学笔记——linux cluster 之lvs_第14张图片

            执行脚本后,查看配置:

         Linux自学笔记——linux cluster 之lvs_第15张图片  

        2)      编辑执行RS2的脚本;

          Linux自学笔记——linux cluster 之lvs_第16张图片

        执行脚本后查看配置:

          Linux自学笔记——linux cluster 之lvs_第17张图片  

3.      使用ipvsadm定义集群规则;

    Linux自学笔记——linux cluster 之lvs_第18张图片

4.      开启RS1和RS2的web服务;

5.      客户端测试;

    Linux自学笔记——linux cluster 之lvs_第19张图片   

此次用的是带权重的rr算法。所以调用两次RS2,再调用一次RS1,实现了集群。

 

lvs(2)

FWM:FireWall  Mark

功用:借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将共享一组RS的集群服务统一进行定义;

通过FWN定义集群的方式:

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

Ipvsadm  -a  -f #  -r  RS  …

 

演示:

1.      前两个步骤与上面的演示一样;

2.      定义iptables规则;

    Linux自学笔记——linux cluster 之lvs_第20张图片

3.      定义集群规则;

   Linux自学笔记——linux cluster 之lvs_第21张图片 

4.      开启RS1和RS2的web服务;

5.      测试

        1)      Web服务测试;

        Linux自学笔记——linux cluster 之lvs_第22张图片

        2)      ssh服务测试;

        Linux自学笔记——linux cluster 之lvs_第23张图片

由上可以看出,web服务和ssh服务都实现乐集群负载均衡;

 

lvs persistence:lvs的持久连接

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

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

                     Sourceip  rs  timer

       持久连接的实现方式:

              每端口持久:PPC,单服务器持久调度

              每FWM持久:PFWMC,单FWM持久调度

                     PORT  AFFINITY

              每客户端持久:PCC,单客户端持久调度

                     Director会将用户的任何请求都识别为集群服务,并向RS进行调度;

                            TCP:1-65535

                            UDP:1-65535

演示:lvs的持久连接;

1.      以上的测试是在做持久连接之前的测试,下面我们将在做持久连接之后,对比测试结果,前两个步骤跟上面的一样;

2.      定义集群规则;

   Linux自学笔记——linux cluster 之lvs_第24张图片 

3.      测试;

定义持久连接之前;

    Linux自学笔记——linux cluster 之lvs_第25张图片

定义持久连接之后;

    Linux自学笔记——linux cluster 之lvs_第26张图片

    Note:以上是每端口持久,至于每FWM持久定义则先使用iptbales定义标记,在定义标记持久;每客户端持久,则在定义调度器时,把ip:port,port写成0,意义为所有端口;

 

HA

       SPOF:Single  Point  of  Failure

       director:在节点级别进行冗余:HA集群解决方案:keepalived

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

1.      基于协议层检查

Ip:icmp

传输层:检测端口的开放状态

应用层:请求获取关键性资源;

2.      检查频度

3.      状态判断

下线:ok --> failure --> failure -->failure

上线:failure --> ok --> ok

4.      back server,sorry server

示例脚本:

      Linux自学笔记——linux cluster 之lvs_第27张图片

DR类型director示例:

      Linux自学笔记——linux cluster 之lvs_第28张图片

DR类型RS示例:

      Linux自学笔记——linux cluster 之lvs_第29张图片

 

实践任务:

1)      建立一个至少由两个RS组成的负载均衡集群:rs用于提供apache+php,mysql由单独的服务器实现;

2)      部署安装discuz_x3.1:分别基于rr/lc/sh算法调度,查看两台rs是否都接收到了请求;

部署环境说明:架设页面访问路径为/www/app/discuz,则需要将discuz_3.1部署于/www/app目录中,而后将/www/app/discuz创建为符号链接,链接至带版本号的目录上;多台RS路径均采用此方式;

3)      基于灰度的方式进行应用程序升级;

4)      尝试着写脚本自动进行灰度发步;

 

待续。