架构环境:

RedHat Linux Enterprise 5.8           keepalive                        LVS-DR

注意:1、事先配置好yum源,利用yum进行相关的软件安装,其可以很好的解决依赖关系

            yum利用DVD光盘配置即可!其详细配置可以参考我的博文“Linux系统常用的软件管理工具rpm、yum及软件源码编译安装”

    2、事先关闭掉相关的iptables规则和selinux


[root@node1 ~]# getenforce  #查看selinux的设置permissive|
[root@node1 ~]# setenforce 0|1  #关闭或开启selinux功能
[root@node1 ~]# vim /etc/selinux/config  #selinux的配置文件
SELINUX=disabled|permissive|enforcing #禁止|禁用|启用selinux

相关服务和名字的定义:

Director:负载调度集群的主机,也简称DR
VIP:Virtual IP,向外提供服务的IP
RIP:Real Server IP,内部真正提供服务的
DIP:与内部主机通信的IP,在DR主机上
CIP:客户端IP


一、架构设计

     利用keepalive来实现lvs的Directory Server的高可用集群,然后在利用keepalive和lvs的高可用来实现web服务的负载均衡!其架构图如下:

二、keepalive的介绍

⑴、keepalive的基本工作机制和应用场景

     keepalive是一个可以提供vrrp已经health-check功能的服务软件,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。同时我们还可以利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

    在本博文中Keepalived的主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

   Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

⑵、VRRP协议

    上面我们提到keepalive利用vrrp来进行health-check功能的,那么VRRP到底是什么那?我们下面来说说VRRP协议吧!

    VRRP:Virtual Router Redundancy Protocol,是虚拟路由冗余协议,通过此协议我们可以把多个路由器做成一个虚拟路由器,从而来保证其中某个路由宕掉的时候不会造成我们内部外出网络的全部中断。

    VRRP中的各个路由器都有一个唯一的标识VRID,其范围为0-255,路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。主控路由器负责对ARP请求用该MAC地址做应答。这样,无论如何切换,保证给终端设备的是唯一一致的IP和MAC地址,减少了切换对终端设备的影响。其中的VRID中的0和255是保留的,0用于IP地址所有者主动放弃主控者角色时使用,255用于VRRP路由器的IP地址和虚拟路由器的接口IP地址相同时所拥有!

    由于VRRP协议比较复杂,这里一两句也介绍不清楚,而我理解的也不深,只是一点点而已,但是这并不影响我们下面的使用,所有还望各位谅解不能在此详细介绍,如果有意深入了解可以下载附件内的“h3c_vrrp介绍.pdf”。

三、RS上相关软件的安装和配置

⑴、web服务的安装和配置

web1和web2上分别配置相应的ip地址
RIP1:172.16.7.3/16
RIP2:172.16.7.4/16

  1、在web1上安装httpd服务并配置RIP和VIP,注意由于是基于LVS的DR模型,我们需要设置本机VIP不能响应外部主机的arp请求。

安装httpd

yum install httpd –y #安装httpd
echo "web1.chris.com" > /var/www/html/index.html  #添加主页内容

配置RIP和设置arp不能被外部主机解析此处使用脚本vipset.sh进行设置,脚本如下:

###########################################################

#!/bin/bash   
#    
# Script to start LVS DR real server.    
# description: LVS DR real server    
#    
.  /etc/rc.d/init.d/functions
VIP=172.16.7.5                #VIP地址   
host=`/bin/hostname`          #定义host变量
case "$1" in   
start)                        #start的时候设置本机arp不被外部主机解析    
       # 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
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask  255.255.255.255 up
              #配置vip在lo:0,并且设置广播地址和子网掩码,此处使用32位是保证此vip不能与其他地址通信。   
        /sbin/route add -host $VIP dev lo:0      #增加路由
;;   
stop)                                                         #stop的时候恢复到系统的初始化arp参数
        # Stop LVS-DR real server loopback device(s).   
        /sbin/ifconfig lo:0 down    
        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
;;   
status)
        # Status of LVS-DR real server.   
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`    
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP`    
        if [ ! "$islothere" -o ! "isrothere" ];then    
            # Either the route or the lo:0 device    
            # not found.    
            echo "LVS-DR real server Stopped."    
        else    
            echo "LVS-DR real server Running."    
        fi    
;;    
*)    
            # Invalid entry.    
            echo "$0: Usage: $0 {start|status|stop}"    
            exit 1    
;;    
esac

############################################################

在web1上执行此脚本,来完成vip和arp参数的设置

sh vipset.sh

然后查看相关IP参数信息

ifconfig

2、在web2上安装httpd服务并配置RIP和VIP,注意由于是基于LVS的DR模型,我们需要设置本机VIP不能响应外部主机的arp请求。

安装httpd

yum install httpd –y #安装httpd
echo "web2.chris.com" > /var/www/html/index.html #添加主页内容

配置RIP和设置arp不能被外部主机解析此处使用脚本vipset.sh进行设置,基本内容与web1上使用的脚本相同!

四、DR上相关软件的安装和配置

⑴、ipvsadm软件安装,用于后面的ipvs规则的查看。

yum –y install ipvsadm  #安装用户空间工具ipvsadm
ipvsadm –L –n            #查看系统ipvs规则

⑵、安装keepalive软件和设置相关配置

1、安装keepalive软件,这里使用的是已经制作好的rpm包进行安装,如需要请在博文附件内下载。

DS1和DS2上都进行keepalive的安装:
两种方法:
        源码编译安装:
        configure [--enable-vrrp] [--disable-snmp|--enable-snmp]
        make
        make install
rpm包安装:
我这里利用以及编译制作好的rpm包进行安装
yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm   #不校验并自动安装

至此我们的keepalive软件就安装完毕了,简单吧~下面来看看keepalive的配置文件吧

⑵、keepalive配置文件的详解

keepalive的配置文件是/etc/keepalived/keepalived.conf,其文件内分为:全局配置、vrrp配置、lvs配置、服务程序监控检查

------------------------------------------------------------------------------

全局配置:

! Configuration File for keepalived              #注释
global_defs {                                          #全局配置,配置参数为{}内的内容   
   notification_email {                               #keepalive服务服务信息通知邮箱,可以为多个    
     [email protected]
     [email protected]
     [email protected]
   }    
   notification_email_from [email protected]  #发送信息的时候的发送邮箱    
   smtp_server 192.168.200.1                   #smtp服务器    
   smtp_connect_timeout 30                      #连接smtp超时时间    
   router_id LVS_DEVEL                            #keepalive服务器的ID标识,注意每个服务                                                                 要有一个独立的标识    
}

-----------------------------------------------------------------------------

vrrp的配置:
vrrp_instance VI_1 {                           # 定义vrrp组,VI_1代表第一个组   
    state MASTER                                 #角色,master|backup,当state指定的instance的初始化状态,在两台DS都启动以后,马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER    
    interface eth0                                  #绑定网卡    
    virtual_router_id 51                          #VRID标记(1-244)    
    priority 100                                      #优先级    
    advert_int 1                                     #检查时间间隔,默认为1s    
    authentication {                                # 认证    
        auth_type PASS                            #认证机制,PASS代表字符串    
auth_pass 1111                            #字符串
    }   
    virtual_ipaddress {                             #指定漂移地址,此处既VIP,可以指定多个。    
        192.168.200.16    
        192.168.200.17    
        192.168.200.18    
    }    
}

-------------------------------------------------------------------------------------

LVS的配置:lvs的配置包括两部分,虚拟主机组和虚拟主机,这些配置都会在传递给ipvsadm作为参数的。

virtual_server 192.168.200.100 443 {       #设置VIP port    
    delay_loop 6                                        #多少秒检查一次real server的健康状态     
    lb_algo rr                                             #调度算法     
    lb_kind NAT                                          #lvs模型     
    nat_mask 255.255.255.0                       #虚拟VIP的掩码     
    persistence_timeout 50                          #长连接时间     
    protocol TCP                                          #协议类型
    real_server 192.168.201.100 443 {          #定义real server    
        weight 1                                            #定义权重     
        SSL_GET {                                        #检查web服务的SSL状况     
            url {     
              path /     
              digest ff20ad2481f97b1754ef3e12ecd3a9cc     
            }     
            url {                                               #检查服务器的web服务状况     
              path /mrtg/     
              digest 9b3a0c85a887a256d6939da88aabd8cd     
            }     
            connect_timeout 3                            #连接超时时间     
            nb_get_retry 3                                 #重试次数     
            delay_before_retry 3                         #重试连接时间间隔     
        }     
    }     
}
⑶、keepalive在DS1和DS2上进行相关配置,并实现VIP的高可用和web集群的负载均衡:
! Configuration File for keepalived
global_defs {   
   notification_email {    
     chris@localhost    
   }    
   notification_email_from root@localhsot    
   smtp_server 127.0.0.1    
   smtp_connect_timeout 30    
   router_id LVS_DEVEL    
}
vrrp_instance VI_1 {   
    state MASTER    
    interface eth0    
    virtual_router_id 51    
    priority 101    
    advert_int 1    
    authentication {    
        auth_type PASS    
        auth_pass chris    
    }    
    virtual_ipaddress {    
        172.16.7.5    
    }    
}
virtual_server 172.16.7.5 80 {   
    delay_loop 6    
    lb_algo rr    
    lb_kind DR    
    protocol TCP
    real_server 172.16.7.3 80 {   
        weight 2    
        TCP_CHECK {    
            connect_timeout 3    
            nb_get_retry 3    
            delay_before_retry 1    
            connect_port 80    
            }    
        }    
    real_server 172.16.7.4 80 {    
        weight 2    
          TCP_CHECK {    
            connect_timeout 3    
            nb_get_retry 3    
            delay_before_retry 1    
            connect_port 80    
            }    
        }    
}

然后把DS1上的keepalive.conf复制到DS2上,并把其中的stata改成BACKUP,priority修改为100,其他的保存不变

至此我们的DS高可用已经设置完了,启动keepalive测试下效果吧

DS1和DS2上分别开启keepalive服务

service keepalived start

此时利用vip访问一下我们的web服务,看看能否正常不吧

下面模拟一下DS1宕掉吧~看看其vip能否否自动漂移

在DS1上停止keepalive服务

service keepalived stop

DS2上查看下地址是否漂移过来了吧!

此时的vip进行web访问

五、web服务的高可用集群

    通过上面的相关配置,我们利用keepalive实现了DS的高可用,然后利用LVS的DR模型实现了web服务的负载均衡,那下面我们就通过keepalive的相关功能来实现web服务的高可用!这里keepalive通过调用相关的脚本进行对服务器的相关操作!其架构图如下

⑴在DS1和DS2上分别安装httpd服务,并设设置主页内容

yum –y install httpd

echo "DS1.chris.com" > /var/www/html/index.html

启动服务进行测试

service httpd start

⑵、配置keepalive服务

1、利用上面实验已经安装好的keepalive进行设置,这里不再重新安装,所以配置之前先把keepalive服务关掉:service keepalived stop

相关配置如下:(配置脚本在附件内-keepalive.conf-webha)

! Configuration File for keepalived
global_defs {   
   notification_email {    
         [email protected]    
         [email protected]    
   }    
   notification_email_from [email protected]    
   smtp_connect_timeout 3    
   smtp_server 127.0.0.1    
   router_id LVS_DEVEL    
}
vrrp_script chk_httpd {   
    script "killall -0 httpd"    #kill -0是模拟kill httpd服务,并不是真的kill,只是检查其服务是否存在    
    interval 2    
        # check every 2 seconds    
    weight -2    
        # if failed, decrease 2 of the priority    
    fall 2    
        # require 2 failures for failures    
    rise 1    
        # require 1 sucesses for ok    
}
vrrp_script chk_schedown {   
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"        #利用/etc/keepalive/下的down文件是否存在来进行服务的关闭    
   interval 2                                                                         #每2秒检查一次    
   weight –2                                                                         #如果存在,权重-2    
}
vrrp_instance VI_1 {   
    interface eth0
    state MASTER
    priority 101
    virtual_router_id 51
garp_master_delay 1
    authentication {   
        auth_type PASS    
        auth_pass password    
    }
    track_interface {   
       eth0    
    }    
        # optional, monitor these as well.    
        # go to FAULT state if any of these go down.
    virtual_ipaddress {   
        172.16.7.5/16 dev eth0 label eth0:0           #配置虚拟VIP,并指定端口和别名    
    }    
        #addresses add|del on change to MASTER, to BACKUP.    
        #With the same entries on other machines,    
        #the opposite transition will be occuring.    
        #/ brd  dev  scope  label 

然后把此配置文件复制到DS2 上,并修改其中的

state BACKUP              #修改其为从服务器

priority 100                  #修改优先权低于主服务器的

2、增加服务控制脚本—httpd.sh,把其到到配置文件内定义的目录/etc/keepalived/内,其脚本内容如下:(脚本在附件内-httpd.sh)

#!/bin/bash   
# Author: MageEdu     
# description: An example of notify script    
#
ifalias=${2:-eth0:0}   
interface=$(echo $ifalias | awk -F: '{print $1}')    
vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}')    
#contact='[email protected]'    
contact='root@localhost'
workspace=$(dirname $0)
notify() {   
    subject="$ip change to $1"    
    body="$ip change to $1 $(date '+%F %H:%M:%S')"    
    echo $body | mail -s "$1 transition" $contact    
}
case "$1" in   
    master)    
        notify master    
        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

⑶、在DS1和DS2上开启keepalive服务,并进行查看相关信息

下面我们访问一下web服务吧~使用vip地址!

下面假设DS1服务器宕掉了,看看vip是否能自动漂移并启动DS2上的web服务,我们在脚本内定义了利用在/etc/keepalived/目录下down文件是否存在来实现测试吧


看下DS2上和web服务

此此,我们的web服务的高可用集群已经建立完成,当然这只是比较简单的实验测试,在实际的工作需要中我们可以把web服务的主页放到一个共享存储上,来保证web内容的一致性!

六、双主模型

我们通过定义不同的vrrp_instance来实现两个DS互为双主的架构:

vrrp_instance 1内:

        DS1为主

        DS2为从

vrrp_instance 2内:

         DS1为从

         DS2为主

其设置只需要在前面配置文件下增加如下内容即可:

vrrp_instance VI_2 {   
    interface eth0    
    state BACKUP  # BACKUP for slave routers    
    priority 100  # 100 for BACKUP    
    virtual_router_id 52    
    garp_master_delay 1
    authentication {   
        auth_type PASS    
        auth_pass password    
    }    
    track_interface {    
       eth0    
    }    
    virtual_ipaddress {    
        172.16.7.6/16 dev eth0 label eth0:1    
    }    
    track_script {    
        chk_httpd    
        chk_mantaince_down    
    }
    notify_master "/etc/keepalived/httpd.sh master eth0:1"   
    notify_backup "/etc/keepalived/httpd.sh backup eth0:1"    
    notify_fault "/etc/keepalived/httpd.sh fault eth0:1"    
}

然后配置DS2上的配置文件内增加如下内容:

vrrp_instance VI_2 {   
    interface eth0    
    state MASTER  # BACKUP for slave routers    
    priority 101  # 100 for BACKUP    
    virtual_router_id 52    
    garp_master_delay 1
    authentication {   
        auth_type PASS    
        auth_pass password    
    }    
    track_interface {    
       eth0    
    }    
    virtual_ipaddress {    
        172.16.7.6/16 dev eth0 label eth0:1    
    }    
    track_script {    
        chk_httpd    
        chk_mantaince_down    
    }
    notify_master "/etc/keepalived/httpd.sh master eth0:1"   
    notify_backup "/etc/keepalived/httpd.sh backup eth0:1"    
    notify_fault "/etc/keepalived/httpd.sh fault eth0:1"    
}

然后重启keepalive服务,查看DS1和DS2

测试web

此时可以把DS1宕掉,测试

此时测试web服务,其都是DS2上的了

至此我们实现了基于keepalive的web双主高可用集群!

       总结:通过以上实验我们了解了keepalive实现高可用,并利用lVS实现web负载均衡的架构全部过程,最后利用keepalive的双主模型实现了web服务的高可用架构!

      内容比较多,写的比较乱,还望各位见谅,其中错误望各位指正~~谢谢

                                                                   chrinux—chris linux