且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

CentOS6.5下keepalived+nginx实现双机热备

更新时间:2022-09-17 08:14:16

网上这个架构的博客太多了,还是要自己整理下,按自己的需求记录下才是***的。

介绍

keepalived是一个类似于layer3, 4, 5 交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

官网地址:http://www.keepalived.org/

keepalved官方体系结构图:

CentOS6.5下keepalived+nginx实现双机热备

搭建

1、环境准备

系统:CentOS6.5 64位 2台

Nginx-A   10.0.0.14

Nginx-B   10.0.0.16

VIP          10.0.0.23

注:未做特别说明,两台服务器(两个节点)都一样操作

2、安装依赖

1
yum -y install gcc gcc+ gcc-c++ yum install popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel

3、安装内核

1
yum -y install kernel kernel-devel

4、安装keepalived

1
2
3
tar -zxvf ../keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
 ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.x86_64/

报错:

checking for nl_socket_alloc in -lnl-3... no

checking for nl_socket_modify_cb in -lnl... yes

checking libnfnetlink/libnfnetlink.h usability... no

checking libnfnetlink/libnfnetlink.h presence... no

checking for libnfnetlink/libnfnetlink.h... no

configure: error: 

    !!! Please install libnfnetlink headers.              !!!

解决办法:

1
yum install -y libnfnetlink-devel

预编译后结果:

Keepalived configuration

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

Keepalived version       : 1.2.19

Compiler                 : gcc

Compiler flags           : -g -O2 -DFALLBACK_LIBNL1

Extra Lib                : -lssl -lcrypto -lcrypt  -lnl

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

IPVS use libnl           : Yes

fwmark socket support    : Yes

Use VRRP Framework       : Yes

Use VRRP VMAC            : Yes

SNMP support             : No

SHA1 support             : No

Use Debug flags          : No

1
2
# make
# make install

5、整理管理文件

1
2
3
4
5
6
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
chmod +x /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

建立配置文件目录(注意:keepalived的配置文件默认在/etc/keepalived/目录)

1
mkdir -p /etc/keepalived

6、配置keepalived.conf

节点A配置如下:

1
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

   notification_email {

     admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务

   }

   notification_email_from  admin@lvtao.net        #设置邮件的发送地址

   smtp_server 127.0.0.1                                #设置smtp server地址

   smtp_connect_timeout 30                              #设置连接smtp server的超时时间

   router_id LVS_DEVEL                                  #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息

}

vrrp_instance VI_1 {

    state MASTER              #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器

    interface eth0            #指定HA监测网络的接口

    virtual_router_id 51      #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的

    priority 100              #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级

    advert_int 1              #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒

    nopreempt                 #设置 nopreempt 防止抢占资源,只生效BACKUP节点

    authentication {          #设置验证类型和密码

        auth_type PASS        #设置验证类型,主要有PASS和AH两种

        auth_pass 1111        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信

    }

    virtual_ipaddress {       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    
    10.0.0.23
    
    }

}

virtual_server 10.0.0.23 80 {       #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

    delay_loop 6                    #设置运行情况检查时间,单位是秒

    lb_algo rr                      #设置负载调度算法,这里设置为rr,即轮询算法

    lb_kind DR                      #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选

    persistence_timeout 50          #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。

                                    #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。

                                    #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,

                                    #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制

    protocol TCP                    #指定转发协议类型,有TCP和UDP两种

    real_server 10.0.0.14 80 {      #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开

        weight 3                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器

                                    #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源

        TCP_CHECK {                 #realserver的状态检测设置部分,单位是秒

            connect_timeout 10      #表示3秒无响应超时

            nb_get_retry 3          #表示重试次数

            delay_before_retry 3    #表示重试间隔

            connect_port 80
            }

    }

    real_server 10.0.0.16 80 {

        weight 3
        TCP_CHECK {

            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
            }

    }

}

节点B配置如下:

1
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

   notification_email {

     admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务

   }

   notification_email_from  admin@lvtao.net        #设置邮件的发送地址

   smtp_server 127.0.0.1                                #设置smtp server地址

   smtp_connect_timeout 30                              #设置连接smtp server的超时时间

   router_id LVS_DEVEL                                  #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息

}

vrrp_instance VI_1 {

    state BACKUP              #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器

    interface eth0            #指定HA监测网络的接口

    virtual_router_id 51      #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的

    priority  99              #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级

    advert_int 1              #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒

    nopreempt                 #设置 nopreempt 防止抢占资源,只生效BACKUP节点

    authentication {          #设置验证类型和密码

        auth_type PASS        #设置验证类型,主要有PASS和AH两种

        auth_pass 1111        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信

    }

    virtual_ipaddress {       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    
    10.0.0.23
    
    }

}

virtual_server 10.0.0.23 80 {       #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

    delay_loop 6                    #设置运行情况检查时间,单位是秒

    lb_algo rr                      #设置负载调度算法,这里设置为rr,即轮询算法

    lb_kind DR                      #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选

    persistence_timeout 50          #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。

                                    #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。

                                    #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,

                                    #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制

    protocol TCP                    #指定转发协议类型,有TCP和UDP两种

    real_server 10.0.0.14 80 {      #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开

        weight 3                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器

                                    #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源

        TCP_CHECK {                 #realserver的状态检测设置部分,单位是秒

            connect_timeout 10      #表示3秒无响应超时

            nb_get_retry 3          #表示重试次数

            delay_before_retry 3    #表示重试间隔

            connect_port 80
            }

    }

    real_server 10.0.0.16 80 {

        weight 3
        TCP_CHECK {

            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
            }

    }

}

6、在两台Web Server上执行realserver.sh脚本,为lo:0绑定VIP地址10.0.0.23、抑制arp广播。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
 
#description: Config realserver
 
VIP=10.0.0.23
/etc/rc.d/init.d/functions
case "$1" in
    start)       
        /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP       
        /sbin/route add -host $VIP dev lo:0
        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 >/dev/null 2>&1   
        echo "RealServer Start OK"  
     ;;
    stop)       
        /sbin/ifconfig lo:0 down       
        /sbin/route del $VIP >/dev/null 2>&1   
        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       
        echo "RealServer Stoped"   
    ;;
    *)       
        echo "Usage: $0 {start|stop}"
        exit 1
esac
 
exit 0

分别在主从机上执行   sh realserver.sh start  ,然后就可以使用负载均衡了。

7、抢占模式验证:

  • 先后主服务器上启动keepalived: /etc/init.d/keepalived start  

  • 在主服务器上查看是否已经绑定了虚拟IP: ip addr

  • 再在从服务器上启动keepalived: /etc/init.d/keepalived start 

  • 停止主服务器上的keepalived: /etc/init.d/keepalived stop 然后在从服务器上查看是否已经绑定了虚拟IP:

  • 启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP

优化

1、让keepalived监控NginX的状态

经过前面的配置,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。 但这并不是我们需要的,我们需要的是当NginX停止服务的时候能够自动切换。

keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。

  • 如何监控NginX的状态

最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。

  • 如何尝试恢复服务

如果发现NginX不正常,重启之。等待3秒再次校验,仍然失败则不再尝试。

根据上述策略很容易写出监控脚本。这里使用curl检查nginx端口来判断nginx的状态,记得要首先安装curl。监控脚本如下:

vim check_http_port

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
 
#思路:1、使用curl检查本地nginx可用性
 
#      2、检查失败尝试启动nginx
 
#      3、仍失败,则关闭本地keepalived
 
NGINX=/usr/local/nginx/sbin/nginx
 
PORT="80"
#curl -v -I -m 10 -o /dev/null -s -w %{http_code}"\n" 
curl http://127.0.0.1:$PORT 
 if [ $? -ne 0 ]; then
     #重启nginx
     /etc/init.d/nginx restart
#       $NGINX -s stop
#       $NGINX
    sleep 3
    curl 
    [ $? -ne 0 ] && /etc/init.d/keepalived stop
 fi
  
exit 0

注:脚本加上可执行权限

2、更进一步,为了避免启动keepalived之前没有启动nginx , 可以在/etc/init.d/keepalived的start中首先启动nginx:

1
vim /etc/init.d/keepalived
start() {
    echo -n $"Starting $prog: "
    /etc/init.d/nginx start
    daemon keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?echo[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}

3、keepalived做HA时,经常会遇到抢占式的master和backup之间的切换

example:

通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说是不好的。所以我们要在配置文件加入  nopreempt  非抢占,但是这个参数只能用于state 为backup,故我们在用HA的时候***master 和backup的state都设置成backup 让其通过priority来竞争。

配置  
节点A配置如下:

1
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

   notification_email {

     admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务

   }

   notification_email_from  admin@lvtao.net        #设置邮件的发送地址

   smtp_server 127.0.0.1                                #设置smtp server地址

   smtp_connect_timeout 30                              #设置连接smtp server的超时时间

   router_id LVS_DEVEL                                  #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息

}

vrrp_instance VI_1 {

    state BACKUP              #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器

    interface eth0            #指定HA监测网络的接口

    virtual_router_id 51      #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的

    priority 100              #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级

    advert_int 1              #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒

    nopreempt                 #设置 nopreempt 防止抢占资源,只生效BACKUP节点

    authentication {          #设置验证类型和密码

        auth_type PASS        #设置验证类型,主要有PASS和AH两种

        auth_pass 1111        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信

    }

    virtual_ipaddress {       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    
    10.0.0.23
    
    }

}

virtual_server 10.0.0.23 80 {       #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

    delay_loop 6                    #设置运行情况检查时间,单位是秒

    lb_algo rr                      #设置负载调度算法,这里设置为rr,即轮询算法

    lb_kind DR                      #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选

    persistence_timeout 50          #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。

                                    #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。

                                    #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,

                                    #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制

    protocol TCP                    #指定转发协议类型,有TCP和UDP两种

    real_server 10.0.0.14 80 {      #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开

        weight 3                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器

                                    #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源

        TCP_CHECK {                 #realserver的状态检测设置部分,单位是秒

            connect_timeout 10      #表示3秒无响应超时

            nb_get_retry 3          #表示重试次数

            delay_before_retry 3    #表示重试间隔

            connect_port 80}

    }

    real_server 10.0.0.16 80 {

        weight 3
        TCP_CHECK {

            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
            }

    }    
    vrrp_script check_http_port {   #配置nginx监听检查

        script "/etc/keepalived/check_http_port.sh"  #nginx监听检查脚本

        interval 2                  #检查间隔

        weight 2                    #权重

    }

    track_script {

         check_http_port

    }
 }

节点B配置如下:

1
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

   notification_email {

     admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务

   }

   notification_email_from  admin@lvtao.net        #设置邮件的发送地址

   smtp_server 127.0.0.1                                #设置smtp server地址

   smtp_connect_timeout 30                              #设置连接smtp server的超时时间

   router_id LVS_DEVEL                                  #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息

}

vrrp_instance VI_1 {

    state BACKUP              #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器

    interface eth0            #指定HA监测网络的接口

    virtual_router_id 51      #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的

    priority  100              #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级

    advert_int 1              #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒

    nopreempt                 #设置 nopreempt 防止抢占资源,只生效BACKUP节点

    authentication {          #设置验证类型和密码

        auth_type PASS        #设置验证类型,主要有PASS和AH两种

        auth_pass 1111        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信

    }

    virtual_ipaddress {       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    
    10.0.0.23
    
    }

}

virtual_server 10.0.0.23 80 {       #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开

    delay_loop 6                    #设置运行情况检查时间,单位是秒

    lb_algo rr                      #设置负载调度算法,这里设置为rr,即轮询算法

    lb_kind DR                      #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选

    persistence_timeout 50          #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。

                                    #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。

                                    #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作,

                                    #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制

    protocol TCP                    #指定转发协议类型,有TCP和UDP两种

    real_server 10.0.0.14 80 {      #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开

        weight 3                    #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器

                                    #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源

        TCP_CHECK {                 #realserver的状态检测设置部分,单位是秒

            connect_timeout 10      #表示3秒无响应超时

            nb_get_retry 3          #表示重试次数

            delay_before_retry 3    #表示重试间隔

            connect_port 80
            }

    }

    real_server 10.0.0.16 80 {

        weight 3
        TCP_CHECK {

            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
            }

    }    
    vrrp_script check_http_port {   #配置nginx监听检查

        script "/etc/keepalived/check_http_port.sh"  #nginx监听检查脚本

        interval 2                  #检查间隔

        weight 2                    #权重

    }

    track_script {

         check_http_port

    }
 }

keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。

如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加

如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少

其他情况,维持原本配置的优先级,即配置文件中priority对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

注意:这样配置后,我们要注意启动keepalived服务的顺序,假设我想让A成为backup那就不能先启动A的keepalived服务。

4、非抢占模式验证:

  • 先后在一台服务器上启动keepalived: /etc/init.d/keepalived start   ,则这台为主服务器。

  • 在主服务器上查看是否已经绑定了虚拟IP: ip addr

  • 再在另一台服务器上启动keepalived: /etc/init.d/keepalived start   ,则这台为从服务器。

  • 停止主服务器上的keepalived: /etc/init.d/keepalived stop 然后在从服务器上查看是否已经绑定了虚拟IP:

  • 启动主服务器上的keepalived,看看主服务器能否重新接管虚拟IP(配置了不抢占)。



本文转自 ygqygq2 51CTO博客,原文链接:http://blog.51cto.com/ygqygq2/1737346,如需转载请自行联系原作者