LVS集群的介绍

 lvs工作在TCP/IP的第四层,可以实现根据用户请求的IP或端口的不同由Director_Server分发给不同的后端RS_Server;因为工作在第四层,所以最多只解析到4层协议,而对更高层的应用层是什么内容不做任何处理,所以相对于工作在第七层的Nginx/Haproxy其负载均衡效果更好;但也因为对高层协议不解析其支持的高级性能很少,如不能根据用户请求的Web资源(URL/URI)来做负载均衡

LVS有三种工作模式:

   (1)NAT 类似Iptables的DNAT

    特点集群的所有节点必须在同一个网段

    Rip一般为私有IP仅用于各节点通信

    报文的出入栈都要经过Director-Server,所以其压力很大。容易成为集群瓶颈

    支持端口映射.client请求80端口,可以转发到后端Rs的8080等端口

    RS上的RIP其网关为DIP

   (2)DR client请求Director的VIP后,报文经由Director转发到后端Server时,其源于目标地址不变,依然为CIP与VIP,而只改变报文的二层MAC地址为director指定分发的RS的MAC地址,报文返回时其源与目标地址为VIP,CIP

    特点

    集群的所有节点必须位于同一个物理网络中(因为Director要靠MAC地址将报文转发RS)最多只能隔个交换机

    RIP可以为公有地址

    只有报文的入栈才经过Director,而相对出栈报文,入栈报文要轻量级的多,所以Director压力相比NAT模式大大降低,所以DR模式支持的集群节点数量也比NAT要多得多

    RS的网关不是DIP,而是指向前段的路由器

    不支持端口映射(因为出栈不仅过Director) 

    (3)TUN 隧道

    其特点是报文入栈时源和目标地址分别为CIP,VIP,进过Director后会在加一个IP报头:源IP为     DIP,目标IP为选定的RS的RIP;报文到达RS 后会将新加的IP报头去掉,报文返回时源IP为VIP,     目标IP为CIP

    支持跨区域,如不同的节点甚至可以位于不同的城市 

    RIP必须为公有IP,因为要通过互联网传输报文

    Director之处理入栈报文

    不支持端口映射         

其中DR模式为最常用的一种,下面将进行DR模式的配置演示:


Director_Server: eth0 192.168.139.3  Dip

           eth0:1 192.168.139.6 Vip

Rs1_Server:    eth0 192.168.139.2  Rip1

           lo:0 192.168.139.6  Vip

Rs2_Server:    eth0 192.168.139.4  Rip2

           lo:0 192.168.139.6  Vip 


      配置好RS1和RS2上的VIP,因为报文返回时其源IP必须为VIP,所以每个节点都要有VIP地址

但RS上的VIP也仅仅用来作为响应报文的源IP。

      因为每个节点都有VIP,但进行ARP响应时必须只能有Director上的VIP响应(要是VIP所在网卡都响应ARP广播就乱了,因为每个节点都有VIP),所以RS上的VIP必须隐藏起来让其不进行ARP响应。为了让RS上的VIP隐藏起来,必须对RS进行如下设置

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

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

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

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

     linux有个特点,报文从哪个接口出去其报文的源IP就会改成这个接口上的IP,所以报文返回时如果经RIP所处网卡出去,会将响应报文的源IP改为RIP(因为client请求的是VIP),所一必须加一条路由信息:

     route add -host VIP dev lo:0 (让出栈报文进过VIP所处的接口返回,这样就可以将返回报文                          源IP改为VIP,与请求报文的目标IP一致)





(1)首先在RS1上配置

RS1#ifconfig eth0 192.168.139.2 netmask 255.25.255.0 up //设置RIP1

 

(2)#bash rs.sh start  //运行这个脚本配置VIP,及设置路由和参数



  脚本内容如下(可以设置VIP,停止VIP。及查看状态)


#!/bin/bash

#


VIP=192.168.139.6


STATUS() {

          if [ -e /var/lock/subsys/ipvs_lock ] ;then

             echo -e "\033[40;31m initial OK \033[0m "

          else

             echo -e "\033[40;31m initial not ok \033[0m "

          fi

         }

case $1 in

start)

        /sbin/ifconfig lo down

        /sbin/ifconfig lo up

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

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

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

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

       /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

       /sbin/route add -host $VIP dev lo:0

       /bin/touch /var/lock/subsys/ipvs_lock

       ;;


stop)

       /sbin/ifconfig lo:0 down

       /sbin/route del $VIP &> /dev/null

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

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

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

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

        /bin/rm -f /var/lock/subsys/ipvs_lock

        ;;

status)

      STATUS;;

*)

 echo "Usage: `basename $0` START|STOP" 

 exit 7

esac


(3)

[root@www sh]# ./rs.sh status //查看脚本是不是运行了

 initial OK  

~                                                                                                                         (4)                      

[root@www sh]# ifconfig  //查看RIP1与VIP的设置

eth0      Link encap:Ethernet  HWaddr 00:0C:29:1C:13:12  

          inet addr:192.168.139.2  Bcast:192.168.139.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe1c:1312/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:3700 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1752 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:393174 (383.9 KiB)  TX bytes:236163 (230.6 KiB)


lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:105215 errors:0 dropped:0 overruns:0 frame:0

          TX packets:105215 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:9448156 (9.0 MiB)  TX bytes:9448156 (9.0 MiB)


lo:0      Link encap:Local Loopback  

          inet addr:192.168.139.6  Mask:255.255.255.255

          UP LOOPBACK RUNNING  MTU:65536  Metric:1



(5)

[root@www sh]# vim /usr/local/apache24/htdocs/index.html //在Apache的主页面加入www.RS1.com

                                      

         

www.RS1.com

~                                                  

         如果Apache不是编译安装,而是通过#yum install httpd 

         则# vim /var/www/html/index/html                                         

         

www.RS1.com

                


(6)

[root@www sh]# apachectl  start //启动Apache


   yum或RPM包装的Apache用

   #service httpd start                                                        

(7)

[root@www sh]# netstat -tnlp //查看80端口是否打开

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1411/sshd           

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1490/master         

tcp        0      0 :::80                       :::*                        LISTEN      1794/httpd          

tcp        0      0 :::22                       :::*                        LISTEN      1411/sshd           

tcp        0      0 ::1:25                      :::*                        LISTEN      1490/master  

                                                            在RS2上进行同样操作但eth0的IP 为192.168.139.4                                                           

Director进行配置


#ifconfig eth0 192.168.139.2 netmask 255.25.255.0 up //设置DIP


[root@www sh]# vim lvs.sh //配置脚本,可以启动,关闭并且查看Ipvsadm及设置VIP 


#!/bin/bash

#


VIP=192.168.139.6

RIP1=192.168.139.2

RIP2=192.168.139.4


STATUS() {

         if [ -e /var/lock/subsys/ipvsadm.lock ];then

             echo "ipvs is running..."

            /sbin/ipvsadm -L -n --stats

          else

             echo "ipvs is stop..."

         fi

         }


case $1 in

start)

   /sbin/ifconfig eth0:1 $VIP  netmask 255.255.255.0 up

   /sbin/route add -host $VIP dev eth0:1

    echo 1  > /proc/sys/net/ipv4/ip_forward #打开路由转发功能,让Director可以向后端RS转                                #发请求报文

   /sbin/iptables -F                 #清空iptables规则,iptables不能与lvs一起使用

   /sbin/iptables -Z

   /sbin/ipvsdam -C                 #清空之前的ipvsadm规则

   /sbin/ipvsadm -A -t $VIP:80 -s wlc

   /sbin/ipvsadm -a -t $VIP:80  -r $RIP1 -m -w 1

   /sbin/ipvsadm -a -t $VIP:80  -r $RIP2 -m -w 2

   /bin/touch /var/lock/subsys/ipvsadm.lock;;

stop)

   /sbin/ipvsadm -C

   /sbin/ifconfig eth0:1 down

   echo  0 > /proc/sys/net/ipv4/ip_forward

   /bin/rm -f /var/lock/subsys/ipvsadm.lock

   ;;

status)

STATUS;;

*)

  echo "Usage: `basement $0` start|stop|status "

                                                          [root@www sh]# ./lvs.sh start    //启动脚本                                    

[root@www sh]# ./lvs.sh status   //启动完成查看

ipvs is running...

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

  -> RemoteAddress:Port

TCP  192.168.139.6:80                    3        6        0      312        0

  -> 192.168.139.2:80                    1        2        0      104        0

  -> 192.168.139.4:80                    2        4        0      208         0




[root@www sh]# ifconfig  //启动DR集群后的IP配置

eth0      Link encap:Ethernet  HWaddr 00:0C:29:6F:EB:02  

          inet addr:192.168.139.3  Bcast:192.168.139.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe6f:eb02/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:14654 errors:0 dropped:0 overruns:0 frame:0

          TX packets:9495 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:2335616 (2.2 MiB)  TX bytes:1422724 (1.3 MiB)


eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:6F:EB:02  

          inet addr:192.168.139.6  Bcast:192.168.139.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1


lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:121 errors:0 dropped:0 overruns:0 frame:0

          TX packets:121 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:12859 (12.5 KiB)  TX bytes:12859 (12.5 KiB)

 浏览器测试


 linux集群之DR模型的配置_第1张图片                                           

  Ctrl+F5强制刷新~                                                                                                               linux集群之DR模型的配置_第2张图片                                                                                                                                                              

~