集群类型:

          LB:负载均衡

                  组件:负载均衡器、调试器、分发器

          HA:高可用

                   活动服务器、备用服务器

          HP:高性能

          DS:分布式

                  分布式存储、分布式计算


  主要写LB类型,lvs集群:

          lvs集群类型:

               lvs-nat

               lvs-dr

               lvs-tun 

               lvs-fullnat     


    lvs-nat  :多目标的DNAT,将请求报文中的目标IP和目标PORT修改为某一RS的IP和PORT实现转发。

      特点:

           1、请求报文和响应报文都是由Director转发,较高负载下,Director易于成为系统性能瓶颈。

           2、lvs主机必须是Linux,RS可以是任意OS  

           3、RIP和DIP必须在同一IP网络,且应该使用私有地址;RS的网关要指向DIP(保证响应报文必                  须经由VS)

            4、支持端口映射

    lvs-dr:通过为请求报文的重新封闭一个MAC首部进行转发,源MAC是DIP所在接口的MAC,目标MAC是挑选出某RS的RIP所在接口的MAC地址;IP首部不会发生变化;之后由RS直接响应客户端,不经由Director,是通过修改RS的内核参数,使每个RS都有Director的地址,但多个RS之间又不会互相冲突。

         特点:

              1、请求报文必须由Directory调度,但响应报文必须不能经由Director

              2、RS可以使用大多的OS

              3、RS的RIP可以使用私有地址,也可以使用公网地址;

              4、不支持端口映射


     lvs-tun:tunnel隧道模型

     修改请求报文的源IP和目标IP,将请求报文的原IP和目标IP上再次封装一个Directory自己的原IP和目标IP,基于此种机制进行转发;

                 特点: 

                        1、RIP,DIP,VIP全得是公网地址;

2、RS网关不能指向也可能指向DIP;

3、请求报文经由Director转发,但响应报文将直接发往CIP;

4、不支持端口映射;

5、RS的OS必须支持隧道功能;


        lvs-fullnat:

              通过同时修改请求报文的源IP地址(CIP-->DIP)和目标IP地址(VIP-->RIP)进行转发;

(1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一网络中,但需要经由路由器互通;

(2)RS收到的请求报文源IP为DIP,因此响应报文将直接响应给DIP;

(3)请求和响应报文都经由Director;

(4)支持端口映射;


           lvs会话保存方法:  

         session sticky 地址绑定,原地址哈希(会影响负载均衡效果)

              session cluster 会话集群,负载到任何一个节点,会话都存在

             session server 找一台服务器专用保持会话



           lvs调度方法:

                有两种模式:基于是否考虑后端主机的当前负载

                    静态方法:

                             rr, wrr, sh, dh (仅根据算法本身进行调度);

                    动态方法:

                          lc, wlc, sed, nq, lblc, lblcr   根据算法及各RS当前的负载状态进行调度) 


       静态方法:

              RR:Round Robin:轮询/轮调/轮叫;

                      WRR:Weighted RR:加权轮询;(根据各个rs的情况,公平分配)

                      SH:Source Hashing:源地址哈希;(将来自同一IP地址的请求始终发往同一rs),很粗糙,削弱了负载均衡

                      DH:Destination Hashing:目标地址哈希;(客户端上次所请求的地址是由哪台服务器所代理,服务器会有缓存,下次来直接就分配给上一次代理的服务器)

       动态方法:

                      负载值Overhead=

                      LC: least connections,最少连接;

                                  Overhead=Active*256+Inactive活动链接数x256+非活动连接数

                      WLC: Weighted LC, 加权最少连接;

                                  Overhead=(Active*256+Inactive)/weight活动链接数x256+非活动连接数÷权重 

                       SED:Shortest Expections Delay最短期望延迟

                                  Overhead=(Active+1)*256/weight活动链接数+1x256÷权重

                       NQ:Never Queue永不排队,先按权重大小,之后再用sed算法

                       LBLC:Locality-Based LC

                                动态的DH算法;

                       LBLCR:LBLC with Replication

                           带复制功能的LBLC;


ipvsadm:用户空间的集群服务管理工具;

wKiom1dT2iHg3N_9AABBmD-UxB4171.png

# ipvsadm -Ln 查看规则

Prot:哪个协议

LocalAddress:Port  : vip的地址

Scheduler : 调度方法

Flags :标志位

RemoteAddress:Port   :rs的地址

Forward: 转发方法

weight:权重

ActiveConn:活动联连接数

InActConn:非活动连接数

#ipvsadm -Ln --rate  查看速率

 CPS :每秒钟的连接数

 InPPS  :每秒的入站报文

 OutPPS:每秒的出报文

 InBPS:每秒的入站字节

 OutBPS:每秒的出站字节

# ipvsadm -Ln --stats  统计数据

 Conns :总的连接数

 InPkts:入站报文书数

 OutPkts :出站的报文数

 InBytes:入站的字节数

 OutBytes:出站的字节数


管理集群服务:增、改,删,查

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

-A:增

-E:修改

-t:tcp 

-u:udp

-f:firewall mark防火墙标标记

service-address:

-t, tcp, vip:port 

-u, udp, vip:port

-f, fwm, mark标记

-s scheduler:调度方法,默认为wlc;


           e.g. 添加一个集群

    # ipvsadm -A -t 192.168.19.129:80 -s rr

                     # ipvsadm -Ln

           e.g. 将算法改为wrr

                     # ipvsadm -E -t 192.168.19.129:80 -s wrr 

        

         ipvsadm -D -t|u|f service-address(指明哪个协议哪个地址)

-D:删除


管理集群上的RS:

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-a:增

-e:改

-r server-address

RS的地址;

rip[:port](有些类型不支持端口映射,此处端口可以省略)

集群类型:

        -g, gateway, dr类型,默认

-i, ipip, tun类型 

-m, masquerade, nat类型

        -w weight---权重(有的算法不支持权重)


          e.g.添加一个RS

                 # ipvsadm -a -t 192.168.19.129:80 -r 192.168.19.128 -m -w 1

          e.g.将 w改为3(注意地址不能改,只能删)

                 # ipvsadm -e -t 192.168.19.129:80 -r 192.168.19.128 -m -w 3

 

e.g.  以上两步骤图示:

 wKiom1dT3Xzxpt9UAAAye8yEYSY004.png


查看:

ipvsadm -L|l [options]

-n, --numeric:数字格式显示IP和PORT;

--exact:精确值;不做单位换算

-c, --connection:显示IPVS连接;

--stats:统计数据;

--rate:速率;

清空规则:

-C:

保存和重载:

ipvsadm -S > /PATH/TO/SOME_RULE_FILE

重载:

ipvsadm -R <  /PATH/TO/SOME_RULE_FILE

清空计数器:

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



e.g.   保存刚才的规则

            # ipvsadm -S > /tmp/ipvsadm-config.v1

         需要用时只需重载即可

            # ipvsadm -R < /tmp/ipvsadm-config.v1


要想开机自启:(CentOS 7)

  ipvsadm -S > /etc/sysconfig/ipvsadm 


lvs-nat:

设计要点:

(1) DIP与RIP要在同一IP网络,RIP的网关要指向DIP;

(2) 支持端口映射;

(3) 是否用到共享存储取决业务需求;


Lvs(DR)+keepalived(双主):


版本:

keeplived :1.2.21

ipvsadm :1.26


准备4台服务器:

Directo 1:

 DIP   192.168.1.55

 主VIP 192.168.1.15 

 备VIP 192.168.1.16


Directo 2:

 DIP   192.168.1.56

 主VIP 192.168.1.16 

 备VIP 192.168.1.15


 RS1

 eth0 192.168.1.57

 VIP 192.168.1.15 

 VIP 192.168.1.16 


 RS2

 eth0 192.168.1.58

 VIP 192.168.1.15 

 VIP 192.168.1.16


1、确保 iptables  selinux 不会成为阻碍

2、确保两台lvs同步时间

3、在Directo 1、Directo 2,都按装上ipvsadm、keepalived。

4、在RS1、RS2,都安装上http服务。


安装keepalived:


# cd /app/soft

# su - CACC

$ mkdir /app/keepalived

$ wget http://www.keepalived.org/software/keepalived-1.2.21.tar.gz

$ tar -xf keepalived-1.2.21.tar.gz

$ cd  keepalived-1.2.21

$ ./configure --prefix=/app/keepalived

$ make && make install

$ vim /app/keepalived/etc/keepalived/keepalived.conf

  vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

authentication {

        auth_type PASS

        auth_pass HNx6k728

    }

    virtual_ipaddress {

        192.168.1.15

    }

}

vrrp_instance VI_2 {

    state BACKUP

    interface eth0

    virtual_router_id 511

    priority 98

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass HNx6k728

    }

    virtual_ipaddress {

     192.168.1.16

    }

}


virtual_server 192.168.1.15 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    protocol TCP


    real_server 192.168.1.57 80{

        weight 1

        HTTP_GET {

            }

            url {

              path /

            }

            connect_timeout 3

            nb_get_retry 3

delay_before_retry 3

        }

    }

real_server 192.168.1.58 80 {

        weight 1

        HTTP_GET {

            }

            url {

              path /

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}


virtual_server 192.168.1.16 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    protocol TCP

    real_server 192.168.1.57 80 {

        weight 1

        HTTP_GET {

            url {

              path /


            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

real_server 192.168.1.58 80 {

        weight 1

        HTTP_GET {

            url {

              path /

                }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}


# scp /etc/keeplived/keepalived.conf root@192.168.1.56:/etc/keepalived/keepalived.conf


另一个lvs:             

 keepalived.conf只需修改以下即可

 vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 98


 vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 511

    priority 100


ipvsadm 安装:


检查是否安装依赖包:

rpm -ql Kernel-devel

rpm -ql gcc

rpm -ql openssl

rpm -ql openssl-devel

rpm -ql popt 

rpm -ql popt-deve

rpm -ql libnl

rpm -ql libnl-devel

rpm -ql popt-static

# cd /app/soft

# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

建立编译安装需要的软连接:

# ln -s /usr/src/kernels/2.6.32-642.4.2.el6.x86_64/ /usr/src/linux

# make && make install

验证:

# ipvsadm


另一台ipvsadm同样操作;


关闭RS1、RS2 arp响应:

 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce


 配置RS1与RS2的VIP(分别在RS1、RS2执行)

 ifconfig lo:0 192.168.1.15 netmask 255.255.255.255 broadcast 192.168.1.15

 ifconfig lo:00 192.168.1.16 netmask 255.255.255.255 broadcast 192.168.1.16

 

 为RS1、RS2添加路由(分别在RS1、RS2执行)

  route add -host 192.168.1.15 dev lo:0

  route add -host 192.168.1.16 dev lo:00

Directo 1:

$ /app/keepalived/sbin/keepalived

# service network restart

查看规则:

# ipvsadm 

   IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.1.15:80 rr

  -> 192.168.1.57:80              Route   1      0          0         

  -> 192.168.1.58:80              Route   1      0          0         

TCP  192.168.1.16:80 rr

  -> 192.168.1.57:80              Route   1      0          0         

  -> 192.168.1.58:80              Route   1      0          0       

Directo 2:

$ /app/keepalived/sbin/keepalived

# service network restart

查看规则:

# ipvsadm 

   IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.1.15:80 rr

  -> 192.168.1.57:80              Route   1      0          0         

  -> 192.168.1.58:80              Route   1      0          0         

TCP  192.168.1.16:80 rr

  -> 192.168.1.57:80              Route   1      0          0         

  -> 192.168.1.58:80              Route   1      0          0       


在RS1与RS2上安装http服务并启动。


测试:

curl 192.168.1.15

curl 192.168.1.16

停掉LVS2的keepalived服务,查看LVS1的ip及测试是否正常

ip addr show eth0