Nginx + keepalived 实现双机热备

Nginx + keepalived

keepalived 简介

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

VRRP 协议

VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由)。

占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

Nginx + keepalived

服务器架构

主(master) VIP 备(backup)
192.168.1.17 192.168.1.181 192.168.1.19

  1. 安装 keepalived
    主、备服务器上分别安装、启动 keepalived,并设置开机启动。
    $ yum install -y keepalived
    $ systemctl start keepalived
    $ systemctl enable keepalived

  2. 修改 keepalived 配置文件
    主、备服务器分别修改配置文件,注意state要填写对应节点身份,interface要对应真实网卡,priority数值要能反映主备优先级,virtual_router_id 、authentication、virtual_ipaddress配置项要一致。
    修改完以后记得重启服务
    $ vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    vrrp_instance VI_1 {
        state MASTER       #标识为主服务器(BACKUP)
        interface em1      #对应网卡
        virtual_router_id 51	#id 号,主、备要一致
        priority 100	        #优先级,主要比备小;有多个备时,优先级高的接管
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111       #主、备一致
        }
        virtual_ipaddress {
            192.168.1.181        #定义vip
        }
    }
    
  3. Nginx 主页
    yum 安装 Nginx ,分别修改主、备服务器的 Nginx页面。
    $ yum install nginx
    $ vim /usr/share/nginx/html/index.html
    修改以后主、备页面如下:
    Nginx + keepalived 实现双机热备_第1张图片

  4. VIP 偏移
    主、备服务器均开启 keepalived,查看主网卡信息,发现 vip 在主服务器上:
    em1: mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 44:a8:42:2b:08:1f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.17/24 brd 192.168.1.255 scope global noprefixroute em1
    valid_lft forever preferred_lft forever
    inet 192.168.1.181/32 scope global em1
    valid_lft forever preferred_lft forever
    inet6 fe80::46a8:42ff:fe2b:81f/64 scope link
    打开nginx页面,结果如下:显示的内容是主服务器的网页信息。
    Nginx + keepalived 实现双机热备_第2张图片
    关闭主服务器上的 keepalived,查看备服务器日志,发现,vip已经偏移。
    Mar 28 10:36:38 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Transition to MASTER STATE
    Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Entering MASTER STATE
    Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) setting protocol VIPs.
    Mar 28 10:36:39 compute7 Keepalived_healthcheckers[143498]: Netlink reflector reports IP 192.168.1.181 added
    Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
    Mar 28 10:36:44 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
    查看备网卡信息:181已经偏移到备服务器
    em1: mtu 1500 qdisc mq state UP qlen 1000
    link/ether 18:66:da:f2:44:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.19/24 brd 192.168.1.255 scope global em1
    valid_lft forever preferred_lft forever
    inet 192.168.1.181/32 scope global em1
    valid_lft forever preferred_lft forever
    inet6 fe80::1a66:daff:fef2:4434/64 scope link
    valid_lft forever preferred_lft forever
    查看 Nginx 主页:发现显示的信息已经是备服务器
    Nginx + keepalived 实现双机热备_第3张图片

  5. Nginx 检查脚本
    该脚本检测 nginx 的运行状态,并在 nginx 进程不存在时尝试重启 nginx,如果重启失败则停止 keepalived,准备让其他机器接管。
    #!/bin/bash
    counter= ( p s − C n g i n x − − n o − h e a d i n g ∣ w c − l ) i f [ " (ps -C nginx --no-heading|wc -l) if [ " (psCnginxnoheadingwcl)if["{counter}" = “0” ];then
    /usr/sbin/nginx
    sleep 2
    counter= ( p s − C n g i n x − − n o − h e a d i n g ∣ w c − l ) i f [ " (ps -C nginx --no-heading|wc -l) if [ " (psCnginxnoheadingwcl)if["{counter}" = “0” ];then
    systemctl stop keepalived
    fi
    fi
    修改主上 keepalived 配置文件,添加监控脚本。

    注意: interval 要比nginx监控脚本数值要大,不然会报错 exited due to signal 15。
    查看 /var/log/messages 发现:
    WARNING – default user ‘keepalived_script’ for script execution does not exist – please create
    解决办法:在 chk_nginx 脚本下添加执行用户 user root 配置项。
    ! Configuration File for keepalived

    vrrp_script chk_nginx {
    
        script "/etc/keepalived/check_nginx.sh"           #脚本位置
        interval 4                                        #脚本执行间隔(要大于检测脚本时间间隔)
        weight -2                                         #检测失败则优先级-2
        fall  2                                           #检测两次失败才算失败
        rise 1                                            #检测一次成功就成功
        user root                                         #脚本执行用户
    }
    
    vrrp_instance VI_1
     {
        state MASTER
        interface em1
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.181
        }
        track_script {                                   #实例中添加要执行的脚本
           chk_nginx
        }
    }                                  
    

    日志文件位置 /var/log/messages

  6. 检测脚本是否成功

    • 主服务器,关闭主 Nginx进程,看能否成功启动。
      $ pkill nginx
      打开页面发现成功调用健康检查脚本、启动了 Nginx,测试成功。
      Nginx + keepalived 实现双机热备_第4张图片
    • 主服务器, Nginx重启失败,看 VIP 是否偏移。(为了测试方便,这里我们可以通过修改健康检查脚本里的参数,故意写错参数)
      Nginx + keepalived 实现双机热备_第5张图片

你可能感兴趣的:(linux,Nginx,服务器,Nginx,Keepalived)