本次实验需要两台DR(调度器),两台RS(真实服务器)
DR1:192.168.0.221
DR2:192.168.0.222
RS1:192.168.0.223
RS2:192.168.0.224
DR配置
先安装基础软件包
[root@DR1 ~]# yum install -y gcc gcc-c++ make openssl-devel kernel-devel kernel-headers libnl* libpopt* popt-static libnfnet* keepalived
软链接内核文件以供ipvsadm安装使用
[root@DR1 ~]# ln -s /usr/src/kernels/2.6.32-642.11.1.el6.x86_64 /usr/src/linux
解压ipvsadm
[root@DR1 ~]# tar xzvf ipvsadm-1.26.tar.gz
[root@DR1 ipvsadm-1.26]# make &&make install
安装好ipvsadm后即可,无需修改其他文件
由于keepalived软件包已包含在上述基础软件包中,所以可直接在/etc/keepalived中修改keepalived.conf中修改文件使用,亦或使用以下提供的精简内容替换使用:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #配置管理员邮箱,用于报警,一行设置一个,可以设置多个,系统需要开启sendmail 服务
}
notification_email_from [email protected] #设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server地址
smtp_connect_timeout 30 #设置连接smtp服务超时时间
router_id LVS_DEVEL1 #路由ID,和BACKUP 要不同,不然会报错
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER表示此主机是主用服务器,BACKUP表示是备用服务器。
interface eth1 #指定检测网络的接口
virtual_router_id 55 #虚拟路由标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的。
priority 100 #定义优先级,数字越大,优先级越高,在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒。
authentication { #设定验证类型和密码。
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码,在一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信。
}
virtual_ipaddress{
192.168.0.220 #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个。
}
}
virtual_server 192.168.0.220 80 { #设置虚拟服务器,需要指定虚拟ip地址和服务端口,ip与端口之间用空格隔开。
delay_loop 6 #设置健康检查时间,单位是秒。
lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法
lb_kind DR #设置LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式可选。
persistence_timeout 2 #会话保持时间,单位是秒,这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在2秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受2秒的时间限制。由于在本次属于实验性质,需要看到轮询功能的情况,所以将此值调整得2秒这么小。
protocol TCP #指定转发协议类型,有tcp和udp两种。
real_server 192.168.0.223 80 { #配置服务节点1,需要指定realserver的真实IP地址和端口,ip与端口之间用空格隔开。
weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源。
TCP_CHECK { #realserve的状态检测设置部分,单位是秒
connect_timeout 10 #10秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 192.168.0.224 80 { #配置服务节点2
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry3
}
}
}
保存并退出
使用ipvsadm –L –n命令查看keepalived是否运行,正常状态如下:
[root@DR1 keepalived]#ipvsadm -L -n
IP VirtualServer version 1.2.1 (size=4096)
ProtLocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.220:80 rr persistent 2
-> 192.168.0.223:80 Route 1 0 0
-> 192.168.0.224:80 Route 1 0 0
OK,keepalived正常运作
查看eth1网卡是否有VIP
[root@DR1keepalived]# ip a
1: lo:
link/loopback 00:00:00:00:00:00 brd00: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: eth1:
link/ether 00:0c:29:b0:09:39 brdff:ff:ff:ff:ff:ff
inet 192.168.0.221/24 brd 192.168.0.255scope global eth1
inet 192.168.0.220/32 scope global eth1
inet6 fe80::20c:29ff:feb0:939/64 scope link
valid_lft forever preferred_lft forever
OK,IP地址已经识别出来了
接下来查看ipvsadm默认超时时间
[root@DR1 keepalived]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
900 120 300这三个数值分别是TCP TCPFINUDP的时间.也就是说一条tcp的连接经过lvs后,lvs会把这台记录保存15分钟,就是因为这个时间过长,所以大部分人都会发现做好LVS DR之后轮询现象并没有发生,而且我也看到大部分的教程是没有说明这一点的,巨坑!!!!!!因为是实验性质,所以将此数值调整为非常小,使用以下命令调整:
[root@DR1 ~]# ipvsadm --set 1 2 1
调整之后查看调整效果
[root@DR1 ~]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 1 2 1
OK,没问题。
注:以上列出的仅为DR1的配置,DR2的配置仅需要修改keepalived.conf中的以下选项:
router_id LVS_DEVEL1 可改为 router_idLVS_DEVEL2
state MASTER 改为 state BACKUP
interface eth1 根据网卡具体接口而修改
priority 100 改为 priority 90
下面就可以开始做RS
RS
首先关闭防火墙
[root@localhost ~]# service iptables stop
iptables: Setting chains to policy ACCEPT:filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost ~]# setenforce 0
安装基础软件包
[root@localhost ~]# yum install -y gcc-c++ ncurses-devel gdbm-devel libxml2-devel openssl-devel
安装apache
[root@localhost ~]# tar xzvfhttpd-2.2.14.tar.gz
[root@localhost ~]# cd httpd-2.2.14
[root@localhost httpd-2.2.14]# ./configure--prefix=/usr/local/apache2 --enable-module=so --enable-so --enable-cache --enable-disk-disk-cache --enable-mem-cache --enable-threads --enable-ssl && make && make install
由于是实验性质,所以apache就修改httpd.conf的ServerName和index.html内容而不做其他的设置了
[root@localhost ~]# cd /usr/local/apache2/conf/
[root@localhost conf]# vim httpd.conf
把ServerName www.example.com:80改为 ServerName 0.0.0.0:80
保存退出
[root@localhost conf]# cd ..
[root@localhost apache2]# cd htdocs/
[root@localhost htdocs]# vim index.html
把
保存退出
这样apache就设置完毕了
接下来设置IP转发
在/etc/init.d创建sh文件,把以下内容复制进去,记得要修改VIP地址
#!/bin/bash
. /etc/init.d/functions
SNS_VIP=192.168.0.220
case "$1" in
start)
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 "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
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 "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
保存并退出
赋予文件运行权限
[root@localhost init.d]# chmod a+x lvsrs
运行文件
[root@localhost init.d]# service lvsrs start
RealServer Start OK
OK,运行没问题,查看以下IP地址有没有挂在lo环回口上
[root@localhost init.d]# ip a
1: lo:
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 192.168.0.220/32 brd 192.168.0.220 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth1:
link/ether 00:0c:29:86:2a:17 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.224/24 brd 192.168.0.255 scope global eth1
inet6 fe80::20c:29ff:fe86:2a17/64 scope link
valid_lft forever preferred_lft forever
OK,已经挂上了,接下来就可以开始测试
首先回到DR1的界面上,执行以下命令用于监测连接保持状态(2s刷新一次状态)
[root@DR1 ~]# watch ipvsadm -L -n -c
打开浏览器,输入VIP地址,每隔2秒按F5刷新一次,效果如下图所示:
第一次刷新
查看ipvsadm状态
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.223:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.223:80
第二次刷新
查看ipvsadm状态
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.224:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.224:80
OK,这样MASTER端就没有问题,接下来断开MASTER的eth1网络测试BACKUP DR轮询情况
首先要打开cmd先ping VIP地址 -t,如下图所示
然后执行以下命令关闭eth1网卡,查看ping情况
[root@DR1 ~]# ifdown eth1
可以看到,ping只丢了一个包,就切换到BACKUP DR上了
接下来测试BACKUP DR的轮询情况,也是使用浏览器每隔2秒刷新一次
第一次刷新
查看ipvsadm状态
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.223:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.223:80
第二次刷新
查看ipvsadm状态
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 NONE 192.168.0.219:0 192.168.0.220:80 192.168.0.224:80
TCP 00:00 ESTABLISHED 192.168.0.219:15566 192.168.0.220:80 192.168.0.224:80
OK,这样BACKUP DR就没有问题,整个实验大功告成!
注:以上列出的仅为RS1的配置,RS2的配置仅需要修改index.html中的以下内容:
RealServer1 改为RealServer2