linux主从切换口令,利用LVS+keepalived的主从模式实现http的高可用性

实验前提:

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

实验拓扑如下:

1e22bf96a46f65926b1b47022bcf8d0b.png

安装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,然后再观察页面的内容

b08d94c68ecc51492dd143ad63cb6bbd.png

然后再次刷新页面,观察页面的内容

570ce56e3e564131a1a41aeb0241f2ec.png

从上面测试知道,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

a464170882a378230416a194d625d334.png

发现网页的内容就是我们刚刚添加的内容。说明当所有的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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值