一、LVS DR模式搭建

准备工作

三台机器:

分发器,dir:192.168.52.100

rs1:192.168.52.101  (网关改回来,之前nat模式改成100)

rs2: 192.168.52.102  (网关改回来,之前nat模式改成100)

vip:192.168.52.200   (这个虚拟ip需要绑定在每台机器上)


分发器dir上:

[root@congji ~]# iptables -F

[root@congji ~]# vim /usr/local/sbin/lvs.dr.sh 

#! /bin/bash

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

ipv=/usr/sbin/ipvsadm

vip=192.168.52.200

rs1=192.168.52.101

rs2=192.168.52.102

#注意这里的网卡名字

ifdown ens33

ifup ens33

ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip dev ens33:2

$ipv -C

$ipv -A -t $vip:80 -s wrr

$ipv -a -t $vip:80 -r $rs1:80 -g -w 1

$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

[root@congji ~]# sh /usr/local/sbin/lvs.dr.sh 

成功断开设备 'ens33'。

成功激活的连接(D-Bus 激活路径:/org/freedesktop/NetworkManager/ActiveConnection/1)


rs1:192.168.52.101和rs2:192.168.52.102都执行以下脚本

[root@zhuji ~]# vim /usr/local/sbin/lvs_rs.sh

#/bin/bash

vip=192.168.52.200

#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端

ifdown lo

ifup lo

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端

#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

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

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

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

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

[root@zhuji ~]# sh /usr/local/sbin/lvs_rs.sh 


测试:DR模式是没有办法用浏览器显著的看出结果,也不能用rs1,rs2访问,因为vip绑定在lo上,他们会默认访问自己,最好的办法就是从新开启一个虚拟机,ip设置在同一网段,用curl查看。


二、DR模式只用一个IP实现

201006241277382974737.jpg

在前面加一个路由器,原理就是让 路由器把所有的80端口请求都分给VIP,分发器再分给每个web服务器,而web服务器处理完请求后跟客户连接就不走分发器了,直接通过路由器去外网了,这样就实现了只用一个公网IP也能用DR模式

先从内网找了三台服务器分别是:

192.168.1.166 web1

192.168.1.167 web2

192.168.1.160 分发器

192.168.1.169 VIP

192.168.1.1   路由器内网ip(网关) 路由器是随便找的一台tplink adal路由器,凑合着测试用的

211.83.113.119 路由器的WAN口IP (随便蒙的,重复莫怪)


先安装ipvsadm 直接yum install ipvsadm就行了,不多说

分发器上的设置

global_defs {

   notification_email {

        ufo@xman.com

   }


notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server smtp.qq.com

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}


vrrp_sync_group VG1 {

        group{

        VI_1

                }

                    }

vrrp_instance VI_1 {

        state MASTER

        interface eth0

        virtual_router_id 51

        priority 100

        advert_int 1


        authentication {

        auth_type PASS

        auth_pass 33210

                        }


        virtual_ipaddress {

        192.168.1.169

                          }


        virtual_server 192.168.1.169 80 {

        delay_loop 6

        lb_algo rr

        lb_kind DR

        protocol TCP


                real_server 192.168.1.166 80 {

                weight 1

                inhibit_on_failure

                TCP_CHECK {

                connect_timeout 5

                nb_get_retry 3

                delay_before_retry 3

                connect_port 80

                          }

                                              }

                real_server 192.168.1.167 80 {

                weight 1

                inhibit_on_failure

                TCP_CHECK {

                connect_timeout 5

                nb_get_retry 3

                delay_before_retry 3

                connect_port 80

                          }

                                              }

配置文件写完了,然后就是

mkdir /etc/keepalived  #系统默认会到这里去找配置文件

cp /usr/local/keepalive/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/keepalive/etc/rc.d/init.d/keepalived /etc/init.d/

cp /usr/local/keepalive/etc/sysconfig/keepalived /etc/sysconfig/

cp /usr/local/keepalive/sbin/keepalived /bin/ #将可执行程序放入sbin 或者 bin目录里


vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

保存退出 后执行sysctl -p

route add defaule gw 192.168.1.1 把路由内网地址添加为默认网关

web服务器设置

两台web服务器也要修改 /etc/sysctl.conf 修改内容如下

vim /etc/sysctl.conf

# LVS

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

sysctl -p

之后还要增加vip

ifconfig lo:1 192.168.1.169 netmask 255.255.255.255 别忘了加到rc.local里面

route add defaule gw 192.168.1.1 把路由内网地址添加为默认网关


路由器设置

路由器的设置没什么好说的,除了上网设置以外还要做一个端口映射,就是把80端口映射到 vip上也就是192.168.1.169


现在启动keepalived吧

/etc/init.d/keepalived start

开始的时候比较慢,大概1分钟后系统日志里面出现下面这条记录就OK了

avahi-daemon[3012]: Registering new address record for 192.168.1.169 on eth0


我们访问一下 http://211.83.113.119

我把我们的应用程序放到了上面跑了一下,呵呵测试成功

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.1.169:80 rr

  -> 192.168.1.166:80             Route   1      5          6         

  -> 192.168.1.167:80             Route   1      3          9


   后来遇到了一个问题,由于这套应用处在一个大网站的后台,所以大部分的请求都来自同一个IP地址,而有一部分程序需要给每个连接做session粘滞,

这样我就不能用lvs 的-p参数来设置ip粘滞时间,如果用lvs的粘滞时间的话大部分的请求都将分给同一台web服务器(注意:这里是session粘滞而不是IP粘滞),

lvs可做不到这点,怎么办呢?

在cu论坛上询问后得知有很多朋友做过类似的项目,他们的解决办法是 将session共享,共享到什么地方就有很多选择了

我们是把所有web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内

增加一条语句就可以了,不过前提你需要装好memcache模块

[Session]

; Handler used to store/retrieve data.

session.save_handler = memcache

session.save_path = "tcp://192.168.1.161:11213"




三、keepalived + LVS DR

1.完整架构需要两台分发器(角色为dir),两台dir上要安装keepalived软件,目的是实现高可用,但keepalived本身也有负载均衡的功能,所以当一台分发器宕机后,不会影响工作,本次实验装一台Keeplived

2.keepalived内置了ipvsadm的功能,所以不需要暗转ipvsadm包,也不用编写和执行dir上的脚本,但是两台rs上的脚本还是要编写和执行的。

3.keepalived有一个较好的功能,如果后台一台rs宕机,便不会再把请求发送过去。

4.在进行实验之前,需要执行2条命令,把之前ipvsadm规则清空掉,重新加载网卡,把之前设置的vip清空掉。

[root@congji ~]# ipvsadm -C

[root@congji ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@congji ~]# systemctl restart network


配置:

编写dir上keepalived的配置文件如下:

vrrp_instance VI_1 {

    #备用服务器上为 BACKUP

    state MASTER

    #绑定vip的网卡为ens33,你的网卡可能不一样

    interface ens33

    virtual_router_id 51

    #备用服务器上为90

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass aminglinux

    }

   #设置vip

    virtual_ipaddress {

        192.168.52.200

    }

}

virtual_server 192.168.52.200 80 {

    #(每隔10秒查询realserver状态)

    delay_loop 10

    #(lvs 算法)

    lb_algo rr

    #(DR模式)

    lb_kind DR

    #(同一IP的连接60秒内被分配到同一台realserver)

    persistence_timeout 60

    #(用TCP协议检查realserver状态)

 protocol TCP

    real_server 192.168.52.101 80 {

        #(权重)

        weight 100

        TCP_CHECK {

        #(10秒无响应超时)

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 192.168.52.102 80 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

     }

}


配置两台rs的配置文件如下:

rs1:192.168.52.101和rs2:192.168.52.102都执行以下脚本

[root@zhuji ~]# vim /usr/local/sbin/lvs_rs.sh

#/bin/bash

vip=192.168.52.200

#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端

ifdown lo

ifup lo

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端

#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

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

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

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

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

[root@zhuji ~]# sh /usr/local/sbin/lvs_rs.sh 


测试:在dir上启动keepalived,查看Ipvsadm的规则。和LVS DR模式一样,需要配置一台同网段的虚拟机测试,浏览器看不出结果。

[root@congji ~]# systemctl start keepalived

[root@congji ~]# ipvsadm -ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.52.200:80 rr persistent 60

  -> 192.168.52.101:80            Route   100    0          0         

  -> 192.168.52.102:80            Route   100    0          0