主服务器ip

从服务器ip

RS1服务器ip

RS2服务器ip

Client ip

Vip:虚拟ip

200.200.200.30

200.200.200.40

200.200.200.10

200.200.200.20

200.200.200.111

200.200.200.100

网络接口

网络接口

网络接口

网络接口

网络接口

模式

eth1

eth1

eth1

eth1

eth1

DR:直接路由

LVS_M:    eth1:200.200.200.30

LVS_S:     eth1:200.200.200.40

RS1 :      eth1:200.200.200.10

RS2:       eth1:200.200.200. 20

VIP:       200.200.200.100

Client:     200.200.200.111

 

LVS模式:DR

,在DR模式下lvs服务器和真实服务器的网段必须在同一网段下。

 

LVS_MASTER 配置:

 

Lvs的配置

[root@lvs_master ipvsadm-1.24]# yum -y install openssl-devel 

                                                                       #下载所需要支持的文件

[root@lvs_master ~]# ln -sv /usr/src/kernels/2.6.18-164.el5-x86_64/ /usr/src/linux/

                                                                        #是内核支持

[root@lvs_master src]# tar zvxf ipvsadm-1.24.tar.gz

                                                                       #解压ipvsadm(ipvsadm是lvs的核心文件)

[root@lvs_master src]# cd ipvsadm-1.24

[root@lvs_master ipvsadm-1.24]# make;make install 

 

 Keepalive的安装                                             

[root@lvs_master src]# tar zvxf keepalived-1.1.17.tar.gz

                                                                     #解压keepalived文件(这里用keepalive软件来实现lvs的高可用ha,当然也可以使用其它软件来实现同样的功能比如heartbeat)

[root@lvs_master src]# cd keepalived-1.1.17

[root@lvs_master keepalived-1.1.17]# ./configure

                                                                    #配置文件

[root@lvs_master src]# cd keepalived-1.1.17

[root@lvs_master keepalived-1.1.17]# make;make install

                                                                    #编译安装

 

Keepalived的配置

 

[root@lvs_master /]# cp /usr/local/etc/rc.d/init.d/keepalived   /etc/rc.d/init.d/

root@lvs_master /]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

[root@lvs_master /]# cp /usr/local/sbin/keepalived /usr/sbin/

                                                                #上面这3步骤的主要目的是复制cp的配件文件到系统相关的目录以使其相关联。

[root@lvs_master /]# mkdir /etc/keepalived/

                                                               #为keepalived创建单独的配置目录

[root@lvs_master /]# vi /etc/keepalived/keepalived.conf

                                                                #keepalived.conf文件默认是不存在的需要我们手工建立.

 

! Configuration File for keepalived

 

global_defs {

    notification_email {

                                                              #定义keepalived监控联系人或者管理人邮件,这里我们一般不需要配置,因为keepalived的监控和lvs的监控往往通过第三方软件来实现监控,比如nagios,zabbix等软件。

    }

}

vrrp_instance VI_1 {

state MASTER       

                                                           #备份服务器改为BACKUP,注意这里的名字是固定的不可随便更改,主的也是必须是MASTER

    interface eth1

    virtual_router_id 1

priority 100         

                                                          #备份服务器改为90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1234

    }

    virtual_ipaddress {

        200.200.200.100                     #vip地址,虚拟ip地址。

    }

}

 

virtual_server 200.200.200.100 80 {   # 虚拟服务器ip

    delay_loop 6

    lb_algo wrr                                      #定义lvs的算法。

    lb_kind DR                                     #定义lvs的算法这里为DR直接路由模式,必须大写。

    protocol TCP

 

    real_server 200.200.200.20 80 {      #定义真实服务器的ip和提供服务器的端口号

        weight 1

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 200.200.200.10 80 {

weight 1

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

}

[root@lvs_master /]# chkconfig -level 23445 keepalived on

[root@lvs_master /]# service keepalived start

Starting keepalived:                                       [ OK ] 

 

从服务器除了:

state MASTER                                                #从服务器改为BACKUP

 priority 100                                                     #从服务器改为90以外其他的步骤和主服务器一样。RS1和RS1的配置只需写个脚本(脚本一模一样)就可以了:

[root@client1 /]# more lvsdr

#!/bin/bash

SNS_VIP=200.200.200.100

/etc/rc.d/init.d/functions

case "$1" in

start)

 

/sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP

#/sbin/route add -host $SNS_VIP dev lo:0

 

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

#sysctl -p > /dev/null 2>&1

echo "RealSever Start OK"

;;

 

stop)

/sbin/ifconfig lo:0 down

/sbin/route del $SNS_VIP >/dev/null 2>&1

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

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

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

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

echo "RealSever Stopped"

;;

*)

echo        "Usage: $0{start|stop}"

exit 1

esac

exit

 

     为了方便脚本的启动(以命令server lvsdr start的方式)我们建议把脚本cp到/etc/init.d目录下

[root@RS1 /]# cp lvsdr /etc/init.d/

[root@RS1 /]# service lvsdr start (启动lvsdr脚本)

RealSever Start OK

 

     这时候我们通过ip a 命令就可以看到VIP:200.200.200。100被绑定到lo网卡上了。

[root@RS1/]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet 200.200.200.100/32 brd 200.200.200.100 scope global lo:0

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:cb:1a:5a brd ff:ff:ff:ff:ff:ff

    inet 192.168.5.92/24 brd 192.168.5.255 scope global eth0

    inet6 fe80::20c:29ff:fecb:1a5a/64 scope link

       valid_lft forever preferred_lft forever

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:cb:1a:64 brd ff:ff:ff:ff:ff:ff

    inet 200.200.200.10/24 brd 200.200.200.255 scope global eth1

    inet6 fe80::20c:29ff:fecb:1a64/64 scope link

       valid_lft forever preferred_lft forever

4: sit0: <NOARP> mtu 1480 qdisc noop

    link/sit 0.0.0.0 brd 0.0.0.0

[root@RS1 /]#

 

 

         RS2和RS1的配置方式脚本名称相同,我们可以把RS1的脚本直接copy到RS2上面,这里我不再具体讲述。

 

         回到LVS_M服务器上我们再重新启动keepalived服务然后通过ip a命令会看到如下所示

[root@lvs_master /]# service keepalived start

Starting keepalived:

[root@lvs_master /]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:f7:e3:a4 brd ff:ff:ff:ff:ff:ff

    inet 192.168.5.123/24 brd 192.168.5.255 scope global eth0

    inet6 fe80::20c:29ff:fef7:e3a4/64 scope link

       valid_lft forever preferred_lft forever

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:f7:e3:ae brd ff:ff:ff:ff:ff:ff

    inet 200.200.200.30/24 brd 200.200.200.255 scope global eth1

    inet 200.200.200.100/32 scope global eth1

    inet6 fe80::20c:29ff:fef7:e3ae/64 scope link

       valid_lft forever preferred_lft forever

4: sit0: <NOARP> mtu 1480 qdisc noop

    link/sit 0.0.0.0 brd 0.0.0.0v    

            其中红色部分所示就是我们绑定的虚拟ip vip:200.200.200.100了。从服务器LVS_S通过相同方法也会得到同样的结果。这个结果说明我们的操作问题通过client可以进行测试了。为了方便测试我们在RS1 和RS2上安装apache服务器,并且在RS1 和RS2上弄起不同的主页方便测试,我这里的测试主页内容RS1就是rs1了,RS2就是rs2了。

 

[root@RS2 /]# yum -y instal httpd

[root@RS2 /]# echo "rs2" > /var/www/html/index.html

[root@RS2 /]# service httpd start

 

测试:

 

测试之前我们在master输入命令ipvsadm

root@lvs_master /]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP 200.200.200.100:http wrr

 -> 200.200.200.10:http          Route   1      0          0        

 -> 200.200.200.20:http          Route   1      0          0 

 

然后我们通过client访问200.200.200.100这个地址

 

        如果看到上图所示,然后再刷新的时刻看到如下所示

 

         这时候说明我们的lvs功能已经成功了。多刷新几次。然后在master上输入ipvsadm命令

 

        通过结果我们能看到。当我们访问100的时候,其中有10次被定向到 了200.200.200.10这关ip上,有11次被定向到了200.200.200.20的服务器上。这就说明lvs已经起到了负载的作用了。下面我们关闭master的keepalived服务。

[root@lvs_master /]# service keepalived stop

Stopping keepalived:                                       [ OK ]

          然后我们通过client端继续访问100这个虚拟ip我们会发现网页已经访问正常,这里不再做测试。说明keepalived的ha作用也启动了。到目前位置我们已经到底了我们所要的lvs负载加keepalived高可用的目的了。

 

会话保持方面的测试:

 

         lvs自带支持保持会话的功能通过修改相关配置文件来实现,其实很简单。只需在lb kind DR下知道保持会话时间就可以了。

 

virtual_server 200.200.200.100 80 {             # 虚拟服务器ip

    delay_loop 6

    lb_algo wrr                                               #定义lvs的算法。

lb_kind DR        

                                                                    #定义lvs的算法这里为DR直接路由模式,必须大写。

 

persistence_timeout 60

protocol TCP

 

相关测试

       为了更加直观的测试我们在真实服务器RS1安装论坛,真实服务器RS2上安装

                然后我们通过client访问虚拟ip 200.200.200.100 .当我们访问vip的时候,可能出现上面2个论坛中的任意一个,比如DISCUZ,我们在上面注册个帐号,并且发个帖子这时候我们会发现进行这样的操作是没有任何问题的,而不像我们想象的那样这个时候可能会出现转移到phpwind的现象。这就说明会话保持的作用已经启动起来了。会话保持的时间的配置文件设置相关,比如这里我们设置的时间为60s。

 

关于lvs算法的相关研究及测试

 

最小连接算法的测试:

          为了测试最小连接我们把其中一台真实服务器的httpd给关掉。然后在cient通过ab压力测试负载。通过结果我们可以看出。RS1的请求数为200.用于RS2的服务器httpd服务已经被我们关闭了所以这里不显示。

         下面我们打开RS2服务器的httpd服务。然后通过client进行ab压力测试。

我们在ipvs服务器上运行ipvsadm命令我们会发现,第二次的请求已经大部分被负载到RS2所在的服务器上了。由于RS2是刚启动的服务器,其原来的连接数目为0。实验说明ls算法已经满足了我们的要求。

rr(轮训)算法的测试。

 

      我们在client通过ab压力测试命令来测试。

[root@client1 ~]# ab -c 100 -n 10000 http://200.200.200.100/

然后我们在lvs上输入ipvsadm命令会看到如下结果。说明每个服务器承受了500的请求。

 

加权算法的测试:wrr

[root@client1 ~]# ab -c 100 -n 10000 http://200.200.200.100/

我们通过在lvs上ipvsadm测试的结果。注意:这里我们10的权重设置的是100,20设置的是10.文件设置位置如下:

 

real_server 200.200.200.20 80 {           #定义真实服务器的ip和提供服务器的端口号

        weight 10

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }

    real_server 200.200.200.10 80 {

weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

        }

    }