主服务器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
}
}