keepalived+lvs实现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

实验拓扑如下:

安装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 {
 [email protected]
   }
   notification_email_from [email protected]
   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: <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: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: <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: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规则应该会被删除,direct2上的IPVS规则会被添加
在direct1上执行如下命令用来模拟MASTER发生故障
#service keepalived stop
执行完成以后,分别在direct1和direct2上执行如下命令,来观察各个direc上的IPVS规则:
#ipvsadm  -L -n 
执行完成后,就会发现direct1上面的规则没有了,而这些规则在direct2生成了。这里就不截图了。

测试三
当后端的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切换事务发生时,如何发送警告给指定的管理员?

完美补充一
当后端的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,即修改这个文件中的内容即可。

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

5、测试
在浏览器上面输入http://192.168.108.100,观察网页的内容

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

vip=192.168.108.100
contact=‘[email protected]‘

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/httpd start
 exit 0
 ;;
backup)
 notify backup
 /etc/rc.d/init.d/httpd restart
 exit 0
 ;;
fault)
 notify fault
 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地址不存在了且IPVS规则也被删除,则表示操作都成功了。一旦发生主从切换,root用户应该可以收到相关的邮件信息了。

时间: 2024-10-12 18:50:12

keepalived+lvs实现http的高可用性的相关文章

centos7+LVS+KeepAlived实现Nginx服务的高可用性

centos7+LVS+KeepAlived实现Nginx服务的高可用性 说到服务的高可用性,我们前面文章介绍了很多了,在linux下实现的方式有很多种,在此主要介绍Centos7+LVS+Keepalived实现Nginx服务的高可用性,具体见下: 环境介绍 hostname:Nginx01 IP:192.168.6.10 Role:Nginx Server hostname:Nginx02 IP: 192.168.6.11 Role:Nginx Server hostname:LVS01 I

keepalived+lvs

keepalived+lvs 前面我们讲解了使用LVS实现服务器的负载均衡,但是有两个问题我们没有解决分别是调度器的单点故障,第二个是服务器池的健康检查,今天我们使用keeplaved解决这两个问题,实际上keeplaved就是LVS的辅助工具. keeplaved主要实现的功能就是故障切换和健康检测来判断调度器和节点服务器的可用性,并及时隔离替换为新的服务器,当故障主机恢复时自动添加回来.官方站点位于http://www.keepalived.org/ 下载地址http://www.keepa

keepalived+LVS 实现双机热备、负载均衡、失效转移 高性能 高可用 高伸缩性 服务器集群

本章笔者亲自动手,使用LVS技术实现实现一个可以支持庞大访问量.高可用性.高伸缩性的服务器集群 在读本章之前,可能有不少读者尚未使用该技术,或者部分读者使用Nginx实现应用层的负载均衡.这里大家都可以阅读本章,即使部分读者使用Nginx负载均衡,但是在大流量下性能相对于工作在链路层的LVS真是不能同日而语,并且LVS不仅可以实现WEB方面的负载均衡,其他诸如数据库.FTP.Mail等都可以实现. 通常对于小型网站,很多都使用单台服务器,顶多在弄个缓存服务器.数据库服务器.但是一旦流量上来,单台

keepalived lvs 实现lvs高可用

keepalived 简介 keepalived是借用VRRP协议来实现高可用性的,VRRP协议是解决单点故障,使路由器和层三交换机实现冗余功能. keepalived启动后会有三个进程 父进程:内存管理,子进程管理等等 子进程:VRRP子进程 子进程:healthchecker子进程 从图上可以看出,两个子进程都被系统WatchDog看管,两个子进程各自操作自己的事,healthchecker子进程负责检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查

mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

mysql主从复制与lvs+keepalived实现负载高可用 目录 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方案    4 3.1.环境    4 3.2.架构图    5 3.3.设计原理    6 4.相关软件安装    6 4.配置mysql的主从    7 5.通过lvs+keepalived实现负载与热备,并实现读写分离    8 1.前言 最近研究了下高可用的东西,这里总结一下mysql主从复制读

Keepalived+LVS(dr)高可用负载均衡集群的实现

一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+lvs双主高可用负载均衡集群及LAMP应用keepalived-1.2.13-7.el7.x86_64ipvsadm-1.27-7.el7.x86_64httpd-2.4.6-45.el7.centos.x86_64mariadb-5.5.52-1.el7.x86_64php-5.4.16-42.el7.x86_64 二 原理及拓扑图 1.vrrp协议vrrp(Vir

深入理解keepalived+lvs

深入理解keepalived+lvs keepalived篇: master和bakeup之间的通信(vrrp协议) master : 172.25.88.1 bakeup :172.25.88.2 1.在matser上抓vrrp的包 [[email protected] ~]# /etc/init.d/keepalived startStarting keepalived:                                       [  OK  ][[email protec

centos6中三台物理机配置nginx+keepalived+lvs

以下只是简单的安装配置,并没有测试这套负载,各种参数大家可以自己测试 vip:10.0.50.170 lvs server:10.0.50.183 real server:10.0.50.184/185 183/184/185同步时间,并且安装nginx # ntpdate time.nist.gov # yum install nginx # /etc/init.d/nginx start 在184/185上编写测试页面/usr/share/nginx/html/index.html 183上

keepalived+lvs简单搭建

 实现Keepalived+Lvs , 主要做 RealServer 健康检查及LoadBalance 主机与Master,Backup 主机正常运行,其中一部分主机做高可用,另一部分做负载均衡.通过在HA 主机上安装 keepalived 服务形成主备形式并进行 rr 轮询调度,使用VIP 来 Director向客户端提供服务 IP,Keepalived 能在服务器出现故障时将其从系统中剔除并将服务改换至其他正常节点,当坏掉的节点恢复正常时能够将其加入到服务器集群中,并在实时发现故障时能够发送