昊漫玉 发表于 2018-12-30 15:13:52

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

  网上这个架构的博客太多了,还是要自己整理下,按自己的需求记录下才是最好的。
介绍
  keepalived是一个类似于layer3, 4, 5 交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
  官网地址:http://www.keepalived.org/
  keepalved官方体系结构图:
http://s3.运维网.com/wyfs02/M00/7A/03/wKioL1agq6uz5uZBAACvmPaJUHQ965.png
搭建
1、环境准备
  系统:CentOS6.5 64位 2台
  Nginx-A   10.0.0.14
  Nginx-B   10.0.0.16
  VIP          10.0.0.23
  注:未做特别说明,两台服务器(两个节点)都一样操作
2、安装依赖
yum -y install gcc gcc+ gcc-c++ yum install popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel3、安装内核
yum -y install kernel kernel-devel4、安装keepalived
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.            !!!
  解决办法:
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
# make
# make install5、整理管理文件
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/目录)
mkdir -p /etc/keepalived6、配置keepalived.conf
  节点A配置如下:
vi /etc/keepalived/keepalived.conf! Configuration File for keepalived
global_defs {
   notification_email {
   admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
   }
   notification_email_fromadmin@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配置如下:
vi /etc/keepalived/keepalived.conf! Configuration File for keepalived
global_defs {
   notification_email {
   admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
   }
   notification_email_fromadmin@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必须是一致的
    priority99            #定义优先级,数字越大,优先级越高,在同一个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广播。
#!/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
#!/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:
vim /etc/init.d/keepalivedstart() {
    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配置如下:
vi /etc/keepalived/keepalived.conf! Configuration File for keepalived
global_defs {
   notification_email {
   admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
   }
   notification_email_fromadmin@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配置如下:
vi /etc/keepalived/keepalived.conf! Configuration File for keepalived
global_defs {
   notification_email {
   admin@localhost.com             #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
   }
   notification_email_fromadmin@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必须是一致的
    priority100            #定义优先级,数字越大,优先级越高,在同一个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) 不管提高优先级还是降低优先级,最终优先级的范围是在,不会出现优先级小于等于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(配置了不抢占)。



页: [1]
查看完整版本: CentOS6.5下keepalived+nginx实现双机热备