实验前提:
1、本次实验作者使用的是RHEL5.8的32位系统平台。
2、实验所需软件为ipvsadm、keepalived、httpd
3、每个节点对应的ip地址如下:
direct1 192.168.108.199
direct2 192.168.108.201
realserver1 192.168.108.202
realserver2 192.168.108.150
VIP 192.168.108.100
实验拓扑如下:
安装ipvsadm
在keepalived的配置文件中有一部分是关于LVS的配置,这部分配置在keepalived脚本启动后会作为参数传递给ipvsadm,ipvsadm从而会自动生成相关的IPVS规则。ipvsadm需要在两个direct上都安装
#yum -y install ipvsadm
安装keepalived
在这里使用编译的方式进行安装keepalived,软件下载地址http://www.keepalived.org/download.html
keepalived需要在前端2个direct上都安装
#tar xf keepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#./configure --prefix=/
#make && make install
如果在安装keepalived时出现如下错误,只需要在编译时,添加--disable-fwmark参数即可
checking for nl_socket_modify_cb in -lnl... no
configure: WARNING: keepalived will be built without libnl support.
checking for kernel version... 2.6.18
checking for IPVS syncd support... yes
checking for kernel macvlan support... no
checking whether SO_MARK is declared... no
configure: error: No SO_MARK declaration in headers
编辑配置文件/etc/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from xsl@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DIRECT1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 88
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass suiji
}
virtual_ipaddress {
192.168.108.100
}
}
virtual_server 192.168.108.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.108.150 80 {
weight 1
HTTP_GET {
url {
path /www/xsl.com/index.html
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
real_server 192.168.108.202 80 {
weight 1
HTTP_GET {
url {
path /www/xsl.com/index.html
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
编辑好配置文件后,可以将这个文件复制到另一个direct节点,另一个节点必须事先创建好/etc/keepalived目录
#scp /etc/keepalived/keepalived.conf direct2:/etc/keepalived
然后在direct2上修改state为BACKUP,priority为90即可
#chkconfig --add keepalived
#chkconfig keepalived on
接在在这两个direct上启动keepalived服务
#service keepalived start
当keepalived启动完成之后,可以检查虚拟IP地址是否已经生产,且虚拟IP地址位于MASTER上。
由于在配置文件中将direct1设置为MASTER,因此,只需要在direct上执行如下命令,即可检查配置是否成功
#ip addr show
1: lo: 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: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:ed:fa:67 brd ff:ff:ff:ff:ff:ff
inet 192.168.108.199/24 brd 192.168.108.255 scope global eth0
inet 192.168.108.100/32 scope global eth0
inet6 fe80::20c:29ff:feed:fa67/64 scope link
valid_lft forever preferred_lft forever
需要说明的是虚拟ip地址是配置在接口上的,作为这个接口的第二地址,因此,使用ifconfig命令是看不出来的。
测试VIP漂移过程
当direct1发生故障时,测试VIP是否会漂移到direct2上去。
可以在direct1上执行如下命令来模拟direct1发生故障:
#service keepalived stop
执行命令完成之后,再在direct2上执行如下命令:
#ip addr show
1: lo: 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: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:4f:f1:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.108.201/24 brd 192.168.108.255 scope global eth0
inet 192.168.108.100/32 scope global eth0
inet6 fe80::20c:29ff:fe4f:f16a/64 scope link
说明,当direct1发生故障时,VIP会立即漂移到direct2上去
其实配置到这里,keepalived的高可用功能已经实现了,接下来需要配置的是与lvs有关的内容
realserver上的配置
安装httpd服务
在两个realserver上安装httpd服务
#yum -y install httpd
#service httpd start
安装完成后,最好是编辑一下每个realserver上的httpd默认根路径下的文件,即/var/www/html/index.html文件,使得2个文件保持不一致。方便后续测试。
然后在本机测试一下,看http服务是否可以正常访问,如果可以正常访问,则继续下面的操作。
将http服务设置为开机自启动。需要在两个realserver上都执行
#chkconfig httpd on
在两个realserver上配置VIP,配置VIP的命令如下:
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#ifconfig lo:0 192.168.108.100 broadcast 192.168.108.100 netmask 255.255.255.255 up
#route add -host 192.168.108.100 dev lo:0
在MASTER上查看IPVS规则是否生成
#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.108.100:80 rr
-> 192.168.108.202:80 Route 1 0 0
-> 192.168.108.150:80 Route 1 0 0
测试一
在浏览器上面输入http://192.168.108.100,然后再观察页面的内容
然后再次刷新页面,观察页面的内容
从上面测试知道,LVS的负载均衡功能已经实现。
测试二
当direct1发生故障时,direct1上的IPVS规则应该会被删除。
在direct1上执行如下命令用来模拟MASTER发生故障
#service keepalived stop
执行完成以后,分别在direct1和direct2上执行如下命令,来观察各个direc上的IPVS规则:
#ipvsadm -L -n
执行完成后,就会发现direct1上面的规则没有了。这里就不截图了。
测试三
当后端的realserver发生故障或运行在realserver上的服务发生故障时,则与这个realserver相关的IPVS规则会被删除。
如在realserver1上执行如下命令,来模拟httpd服务发生故障
#service httpd stop
然后再在作为MASTER上的服务器上查看IPVS规则,使用如下命令即可查看IPVS规则,这里我的direct2是作为MASTER。
#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.108.100:80 rr
-> 192.168.108.150:80 Route 1 0 0
看看,与realserver1相关的IPVS规则被删除了,说明测试成功。
其实,实验做到这里来,一个LVS+keepalived来实现web服务的高可用集群基本成功了。只是,对于这个实验仍然有许多不足之处,比如:
1、如果后端的realserver都发生故障,则前端的direct将无法响应客户端的请求,因此,会出现客户端打不开页面的情况,因此,在这种情况下,我们最好是返回一个提示信息给用户(如网站正在维护,请您稍后在浏览),这样给用户的感觉就比较直观。
2、其中在整个实验过程中,我们实现MASTER/BACKUP切换的主要是通过停止keepalived服务来进行的,那如何通过脚本来完成模式切换功能呢?
3、当VRRP切换事务发生时,如何发送警告给指定的管理员?
4、当keepalived与nginx或haproxy实现高可用时,如果nginx或haproxy服务本身不可用时,此时仍然需要实现主从切换,虽然MASTER服务器虽然可以正常工作,但是不能对外提供服务,这也是不允许的?该过程如何实现?
补充一
当后端的realserver都出现故障时,如何返回一个提示信息给用户?
配置步骤:
1、需要在所有的direct上安装httpd服务并将其设置为开机自启动,如:
#yum -y install httpd
#chkconfig httpd on
2、修改httpd服务默认根路径下的文件index.html的内容
echo "Site is down for maintenance, please wait while browsing" > /www/xsl.com/index.html
说明:这里我采用的基于虚拟主机的httpd服务,因此,根路径可能不一样。如果是基于中心主机来配置的httpd服务,那么它的默认根路径下的文件为/var/www/html/index.html,即修改这个文件中的内容即可。
3、在所有的direct上启动httpd服务
#service httpd start
4、修改配置文件,需要在所有的direct上做修改
#vim /etc/keepalived/keepalived.conf
需要在virtual_server 192.168.108.100 80 { }中添加一样这样的信息
sorry_server 127.0.0.1 80
如:
virtual_server 192.168.108.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
sorry_server 127.0.0.1 80
...
}
4、模拟所有的realserver都down掉,如下命令需要在所有的realserver上执行
#service httpd stop
发现网页的内容就是我们刚刚添加的内容。说明当所有的realserver都挂掉之后,访问的httpd服务是MASTER上的httpd服务,本地的httpd服务将返回本地页面中的内容给用户,该页面主要提供警示信息。
补充二、通过自写监测脚本来实现MASTER/BACKUP的切换
1、在所有的direct的配置文件/etc/keepalived/keepalived.conf添加如下配置:
vrrp_script chk_httpd_down {
scripts "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" 这个表示要执行的命令或脚本
interval 2 每个2秒检测一次
weight 20 检测失败后,本节点的priority值会响应减少20
fall 2 如果检测2次都失败了,则认为失败
rise 1 如果检测一次成功,则认为是成功了。
}
脚本对好了之后,还需要在实例中调用。下面这段配置需要添加到实例配置下
track_script {
chk_httpd_down
}
整个步骤如下:vrrp_script chk_httpd_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0 "
interval 2 每隔2秒检查一下该文件是否存在
weight -20 上述脚本如果执行失败(即状态码返回1),则优先级减20
fall 2 连续检查2次都失败了,则最终认为失败了
rise 1 连续检查1次成功了,则认为成功了。
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 88
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass suiji
}
virtual_ipaddress {
192.168.108.100
}
track_script {
chk_httpd_down
}
}
上述添加的内容的意思是:只要在/etc/keepalived/目录下存在down这个文件,则MASTER就会切换成BACKUP。
3、测试
在当前MASTER节点上的/etc/keepalived/目录下创建down文件,观察此时节点的状态,此时你会发现,VIP已经飘逸到之前的BACKUP上去了。此时此刻该节点的状态为BACKUP。
补充三、当VRRP切换事务发生时,如何发送警告给指定的管理员?
在所有的direct上修改配置文件,并添加如下配置
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
这段配置是配置在vrrp_instance VI_1 {}实例中的
编写通知脚本
#vim notify.sh
通知脚本如下:
#vim notify.sh
#!/bin/bash
#author:xsl
#description: An example of notify script
#
notify() {
mailsubjiect="`hostname` is to be $1 ,$vip floating" #这里是邮件的主题
mailbody="`date '+%F %H:%M:%S'`:vrrp transition,`hostname` changed to be $1 "
echo $mailbody | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault
/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo "usage:`basename $0` {master|backup|fault}"
exit 1
;;
esac
给脚本加执行权限
#chmod +x notify.sh
然后将其复制一份传给direct2
#scp /etc/keepalived/notify.sh direct2:/etc/keepalived/
测试,在direct1节点上添加down文件
#touch /etc/keepalived/down
查看虚拟IP地址是否还位于direct1上
#ip addr show
查看ipvs规则是否已被删除
#ipvsadm -L -n
如果虚拟ip地址不存在了,则表示操作都成功了。一旦发生主从切换,root用户应该可以收到相关的邮件信息了。
四、当keepalived与nginx或haproxy实现高可用时,如果nginx或haproxy服务本身不可用,如何实现主从切换?
其实这个过程和之前自写脚本完成MASTER/BACKUP切换过程是一样的。以haproxy为例,其配置如下:
vrrp_script haproxy_check {
script "killall -0 haproxy" //这个命令用来测试haproxy这个进程是否存在,不会真正执行
interval 2
weight -2
}
track_script {
haproxy_check
}