设为首页 收藏本站
查看: 1796|回复: 0

[经验分享] lvs/dr+keepalived实现Web负载均衡Dr高可用

[复制链接]

尚未签到

发表于 2015-11-20 05:12:54 | 显示全部楼层 |阅读模式
一、测试名称
    lvs/dr模式下keepalived应用的测试

二、测试目的
目前有1台lvs/dr转发用户请求到后端web服务器,转发通过脚本控制。有两个问题需要解决,⑴、后端web服务器故障不能提供web服务时lvs/dr仍然向其转发请求;⑵、当lvs/dr故障时,将完全中断web服务。故需要使用软件实现自动增加删除故障web结点,同时实现lvs/dr的双机主备机制。
DSC0000.jpg
三、测试环境
1、本测试中使用4台服务器,包括2台lvs/dr和2台web/server。具体情况见下表,
DSC0001.jpg

说明,lvs-web 192.168.20.*与lvs-dr的内网相连,lvs-web 192.168.0.* 用于数据库的主从复制

2、当前状况如下图所示,
DSC0002.jpg
⑴、用户访问网站的请求首先到达lvs-dr1并通过脚本设置判断如何转发用户请求。
⑵、通过转发的用户请求被lvs-web1和lvs-web2响应后直接返回给客户端。
但是这样的方式可能出现如下问题,
⑴、当lvs-dr1故障时,无法再接受用户请求并将请求转发给真实的web服务器(即便真实web服务器正常)从而导致整个web服务的瘫痪,也就是lvs控制器存在单点故障问题。
⑵、当lvs-dr1正常时,真实地web服务器如lvs-web1故障。此时lvs-dr1并不知道真实服务器是否在正常提供web服务,所以仍然在向故障的lvs-web1转发用户请求。这样的结果是用户请求无法被故障web服务器相应,某些用户可以访问网站有些则无法访问。
注:服务器故障包括:服务器宕机、web服务终止、网线松动等等。

3、基于以上的问题,我们需要想办法实现对lvs控制器和web服务器的健康监测,一旦服务出现问题能保证服务不中断的情况下排除故障。即增加lvs控制器实现主备模式避免单点故障以及自动删除故障web服务结点并当它恢复后再自动添加到群集中这样的功能。


预期状况如下图所示,
DSC0003.jpg
通过上图所示实现以下功能
⑴、lvs-dr1和lvs-dr2采用主从的方式配置,从控制器通过心跳监测主控制器是否存在。当监测到主控制器不存在时接管虚拟IP实现向web服务器转发用户请求。
⑵、lvs控制器监控web服务器是否存在,当服务器出现故障(宕机、服务终止、网线松动)时自动删除故障结点,当服务器上线恢复提供服务后又能够自动将该结点添加到群集中。

DSC0004.jpg
注:
⑴、由于整个测试实施文档在非生产环境下完成,所以使用虚拟机软件VMWare Workstation作为以上所有结点的运行平台。
⑵、测试环境中所有结点的操作系统是Red Hat Enterprise 5.4,内核版本为2.6.18-164.el5。
如何查看系统和内核版本?
①、/etc/issue
DSC0005.jpg
②、uname -a
DSC0006.jpg
③、/proc/version
DSC0007.jpg

⑶、实现lvs群集的两个重要部件是ipvs内核模块和ipvsadm工具包。
当前内核版本的系统已经包含ipvs内核模块,但默认并没有加载到内核中,可以手工加载或安装ipvsadm之后会被加载。
使用modprobe命令手工加载ipvs模块并查询模块是否加载。
DSC0008.jpg
ipvsadm下载地址http://www.linuxvirtualserver.or ... ipvsadm-1.24.tar.gz
⑷、keepalived是一个监测lvs转发器和web服务器状态的软件,下面是官方网站对keepalived的一段解释,官方网站地址http://www.keepalived.org
What is Keepalived ?
The main goal of the keepalived project is to add a strong & robust keepalive facility to the Linux Virtual Server project. This project is written in C with multilayer TCP/IP stack checks. Keepalived implements a framework based on three family checks : Layer3,Layer4 & Layer5/7. This framework gives the daemon the ability of checking a LVS server pool states. When one of the server of the LVS server pool is down, keepalived informs the linux kernel via a setsockopt call to remove this server entrie from the LVStopology. In addition keepalived implements an independent VRRPv2 stack to handle director failover. So in short keepalived is a userspace daemon for LVS cluster nodes healthchecks and LVS directors failover.
Why using Keepalived ?
If your are using a LVS director to loadbalance a server pool in a production environnement, you may want to have a robust solution for healthcheck & failover.

keepalived下载地址http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
⑸、web服务器上需要安装apache2,cronolog是选择安装软件,它可以格式化日志文件的格式,易于对apache日志的管理和分析。
Apache2下载地址http://www.apache.org
Cronolog下载地址http://cronolog.org/download/cronolog-1.6.2.tar.gz

四、测试步骤
1、配置各个结点的主机名、IP地址。配置过程暂省略,如上面表格所示
注:修改主机名需要/etc/sysconfig/network和/etc/hosts两个文件,然后重新启动生效。
2、在lvs-dr1和lvs-dr2上安装ipvsadm和keepalived,过程如下:
⑴、安装ipvsadm,从官方网站下载ipvsadm-1.26.tar.gz后
# tar xvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# ln -sv /usr/src/kernels/2.6.18-164.el5-i686 /usr/src/linux
DSC0009.jpg

Make && make install
或yum install ipvsadm –y

⑵、安装keepalived,从官方网站下载keepalived-1.1.15.tar.gz后
# tar xvf keepalived-1.1.15.tar.gz
# cd keepalived-1.1.15
# ./configure
Make && make install

# 查看keepalived位置 #
DSC00010.jpg

#cp
/usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp
/usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir
/etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf
/etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/
#service keepalived start|stop     #做成系统启动服务方便管理.

3、在lvs-web1和lvs-web2上安装并配置apache和cronolog。
⑴、安装cronolog,从官方网站下载cronolog-1.6.2.tar.gz后
# tar xvf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure
# make && make install

DSC00011.jpg

⑵、安装apache,从官方网站下载httpd-2.2.19.tar.gz后
编译安装,此处省略…….

直接访问客户端
DSC00012.jpg
DSC00013.jpg
Web服务正常访问

4、使用ipvs脚本实现单台lvs控制器转发请求到两台web服务器
⑴、lvs-dr1/lvs控制器
①、ipvs脚本
#!/bin/sh
#chkconfig: 2345 20 80
# description: start LVS ofDirectorserver
VIP1=192.168.20.100
VIP2=192.168.20.101
RIP1=192.168.20.9
RIP2=192.168.20.10
. /etc/rc.d/init.d/functions
case "$1" in
start)  echo " start LVSof DirectorServer"
# set the VirtualIP Address   
/sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
/sbin/ifconfig eth0:2 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
/sbin/route add -host $VIP1 dev eth0:0
/sbin/route add -host $VIP2 dev eth0:2
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP1:80 -s wlc
/sbin/ipvsadm -A -t $VIP2:80 -s wlc
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 –g
/sbin/ipvsadm -a -t $VIP2:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP2:80 -r $RIP2:80 -g
#Run LVS
/sbin/ipvsadm
#end  
;;
stop)
echo "close LVS Directorserver"  
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"  
     exit 1
esac

②、lvs-dr1的网络配置
DSC00014.jpg
③、在/etc/rc.local中添加,脚本开机启动
DSC00015.jpg

⑵、web服务器/ lvs-web1和lvs-web2
①、ipvs脚本
#!/bin/bash
#
# lvsdrrs init script to hide loopback interfaces on LVS-DR
# Real servers. Modify this script to suit# your needs. You at least need to set the correct VIP address(es).
#
# Script to start LVS DR real server.
#
# chkconfig: 2345 20 80
# description: LVS DR real server
#
# You must set the VIP address to use here:
VIP1=192.168.20.100
VIP2=192.168.20.101
case "$1" in
start)   
# Start LVS-DR real server on this machine.  
/sbin/ifconfig lo down  
/sbin/ifconfig lo up   
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   
/sbin/ifconfig lo:0 $VIP1 netmask 255.255.255.255 up  
/sbin/ifconfig lo:1 $VIP2 netmask 255.255.255.255 up  
/sbin/route add -host $VIP1 dev lo:0  
/sbin/route add -host $VIP2 dev lo:1
;;
stop)  
# Stop LVS-DR real server loopback device(s).  
/sbin/ifconfig lo:0 down  
/sbin/ifconfig lo:1 down
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep "$VIP1"`
isrothere=`netstat -rn | grep "$VIP1"`
if [ "$islothere" = "" -a "$isrothere" = "" ];then   
# Either the route or the lo:0 device   
# not found.   
echo "LVS-DR real server Stopped."  
else   
echo "LVS-DR Running."  
fi
;;
*)  
# Invalid entry.  
echo "$0: Usage: $0 {start|status|stop}"  
exit 1
;;
esac

DSC00016.jpg
⑶、测试转发
①、在客户端浏览器访问192.168.20.100/192.168.20.101
使用ipvsadm -l查看控制器转发状态。

DSC00017.jpg

②、模拟web服务器故障,将lvs-web2网络中断。
我们会看到,当访问到web2是会显示,无妨访问网页……
DSC00018.jpg

说明:4,为利用ipvs实现转发

5、使用keepalived实现单台lvs控制器转发请求到两台web服务器,并且lvs控制器监控web服务器的状态并自动添加删除web结点。
⑴、在lvs控制器上安装keepalived后需要停止原来的lvsdr脚本,然后根据需要对keepalived配置文件进行调整,而web服务器的脚本和网络配置不需要进行任何改动。
①keepalived脚本
[iyunv@lvs-dr1 keepalived]# pwd   /etc/keepalived/keepalived.conf
/usr/local/etc/keepalived  # keepalived配置文件的路径 #这里为:/etc/keepalived/keepalived.conf
[iyunv@lvs-dr1 keepalived]# ll keepalived.conf
-rw-r--r-- 1 root root 1627 Aug 16 09:13 keepalived.conf  # keepalived配置文件名 #
[iyunv@lvs-dr1 keepalived]# more keepalived.conf  (/etc/keepalived/keepalived.conf )
global_defs {
   notification_email {
      15301727316@189.cn
  #   failover@firewall.loc
  #   sysadmin@firewall.loc
   }
   notification_email_from zalifei@126.com
   smtp_server 127.0.0.1  
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

# 2011-09-05 by zyf
# VIP1
vrrp_instance VI_1 {
    state MASTER  从为SLAVE
    interface eth0
    virtual_router_id 51
    priority 100  从为99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.20.100
        192.168.20.101
    }
}

virtual_server 192.168.20.100 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 50
protocol TCP
    real_server 192.168.20.9 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.20.10 80 {
        weight 3
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

virtual_server 192.168.20.101 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.20.9 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
real_server 192.168.20.10 80 {
        weight 3
        TCP_CHECK {
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}
# shell end

停掉lvs_dr.sh演示脚本
停止./lvs-dr.sh stop 将/etc/rc.local里面的开机启动内容删除
启动keepalived service keepalived start

DSC00019.jpg
访问192.168.20.100/192.168.20.101
DSC00020.jpg

此时,用户请求将只被转发到lvs-web1上。

DSC00021.jpg
启动web2服务,查看

DSC00022.jpg
启动httpd服务之后5秒之内lvs-web2又重新被加到转发列表中

控制器通过发送ICMP包判断lvs-web2已经不存在,所以将它从转发列表中删除。lvs-dr1会根据配置文件不断监测real_server,当lvs-web2重新上线并能够提供web服务之后dr1又会重新将web2添加到转发列表中。
这个过程删除和添加web结点的过程与上面停止httpd服务的完全一致的,在此不再赘述。这些过程只是在服务器端进行,对于用户来说是完全透明的,他们并不会感受到服务器端正在发生的变化。

6、避免lvs控制器单点故障,添加lvs-dr2到群集中使用keepalived实现控制器的主备。
⑴、keepalived配置文件 /etc/keepalived/keepalived.conf
[iyunv@lvs-dr1 keepalived]# pwd
/usr/local/etc/keepalived  # keepalived配置文件位置 #这里为:/etc/keepalived/keepalived.conf
[iyunv@lvs-dr1 keepalived]# ll keepalived.conf
-rw-r--r-- 1 root root 1624 Aug 16 23:19 keepalived.conf
[iyunv@lvs-dr1 keepalived]# more keepalived.conf
如上keepalived.conf,不在累述

启动keepalived服务,service keepalived start

测试
主:
DSC00023.jpg
停止主keepalived服务,service keepalive stop
DSC00024.jpg

DSC00025.jpg

好了,到这里基本架构已完成,多亏网络大侠的帮助,继续努力...

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141302-1-1.html 上篇帖子: LVS + keepalived 实现负载均衡 下篇帖子: linux集群系列(一):LVS+Keepalived以DR模式实现负载均衡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表