Nginx+Keepalived实现nginx的高可用集群搭建

    Keepalived 是一款高可用的软件,可以自动侦测服务器状态、移除故障服务器、切换到正常运行的服务器、添加恢复后的服务器到集群中。Keepalived 基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) ,主要在 IP 层、TCP 层和应用层起作用。

  1. IP 层:定期向服务器集群中的服务器发送数据包(Ping),如果发现 IP 地址没有激活,Keepalived 便会报告这台服务器失效,并将它从集群中移除
  2. TCP 层:类似与 IP 层,只不过是检测服务的端口
  3. 应用层:根据用户的设定检查服务程序的运行是否正常,例如:用户设定了几个 URL,Keepalived 可以固定的发起请求,检查这几个 URL 是否可用。

Keepalived 的安装

1、执行解压、配置、make 和 make install

tar -zxvf keepalived-1.2.18.tar.gz
./configure --prefix=/usr/local/keepalived
make && make install

    注:./configure –prefix=/usr/local/keepalived 指定了Keepalived 安装位置的前缀
2、在 /etc/ 下创建 keepalived 文件夹,并创建 keepalived 应用的软连接,使 keepalived 注册为服务

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

3、设置 Keepalived 服务开机启动

chkconfig keepalived on

4、启动服务

service keepalived start
# 或者指定配置文件启动
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived.conf

keepalived.conf 配置

编辑 keepalived.conf 文件:

vim /etc/keepalived/keepalived.conf

下面是 192.168.222.101 主节点的配置文件:

! Configuration File for keepalived

global_defs {
   # keepalived 自带的邮件提醒,需要开启 sendmail 服务,建议用独立的监控或第三方 SMTP
   # notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@firewall.loc
   #}
   # notification_email_from Alexandre.Cassen@firewall.loc
   # smtp_server 192.168.200.1
   # smtp_connect_timeout 30
   router_id LVS_DEVEL # 路由标识符,通常为hostname
}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
## 如果脚本执行结果为0,并且 weight 配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
## 并且 weight 配置的值小于0,则优先级相应的减少。其他情况,维持原本配置的优先级,
## 即配置文件中的 priority 对应的值。
vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
   interval 2 ## 检测时间间隔,单位秒
   weight -20 ## 如果条件成立,权重-20
}

## 定义虚拟路由,VI_1 为虚拟路由的标识符,自己定义名称
vrrp_instance VI_1 {
    state MASTER  ## 主节点为 MASTER,对应的备份节点为 BACKUP
    interface eth0  ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
    virtual_router_id 51  ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,相同的 VRID 为一个组,它将决定多播的 MAC 地址
    priority 100  ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
    advert_int 1  ## 组播信息发送间隔,两个节点设置必须一样,默认1s
    mcast_src_ip 192.168.222.101 ## 本机 IP 地址
    nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    ## 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    ## 虚拟 IP 池,两个节点设置必须一样
    virtual_ipaddress {
        192.168.222.99  ## 虚拟 ip,可以定义多个
        192.168.222.17
    }
    ## 将track_script 块加入 instance 配置块
    track_script {
        chk_nginx ## 执行 Nginx 监控服务
    }
}

Nginx 集群

    Nginx 本身没有集群的机制,因此 Nginx 集群需要使用 keepalived 完成 Nginx 的监控,以达到 Nginx 的高可用。Keepalived + Nginx 的高可用不是用户可以随机访问两台服务器上的 Nginx,而是 Keepalived 监控主机上的 Nginx 是否挂掉,并且不能重新启动,如果不能启动,服务器将杀死 Keepalived 进程,从而使从机绑定 Keepalived 配置的虚拟 IP 。
在 keepalived.conf 中,已经配置了监控 Nginx 服务是否挂掉的配置:

vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
   interval 2 ## 检测时间间隔,单位秒
   weight -20 ## 如果条件成立,权重-20
}

创建 nginx_check.sh 脚本文件:

vim /etc/keepalived/nginx_check.sh

    注:脚本原理是如果 nginx 停止运行,尝试重启,如果无法启动,则杀死本机的 keepalived 进程,keepalived 将虚拟 ip 绑定到 BACKUP 机器上。

nginx_check.sh 文件内容:

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]
    then
        /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]
    then
        killall keepalived
    fi
fi

添加可执行权限:

chmod +x /etc/keepalived/nginx_check.sh

Keepalived 备机配置文件内容(192.168.222.102):

! Configuration File for keepalived

global_defs {
     router_id LVS_DEVEL2 # 路由标识符,通常为hostname
}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为0,并且 weight 配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,并且 weight 配置的值小于0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中的 priority 对应的值。
vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
   interval 2 ## 检测时间间隔,单位秒
   weight -20 ## 如果条件成立,权重-20
}

## 定义虚拟路由,VI_1 为虚拟路由的标识符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP  ## 主节点为 MASTER,对应的备份节点为 BACKUP
    interface eth0  ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
    virtual_router_id 51  ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,相同的 VRID 为一个组,它将决定多播的 MAC 地址
    priority 90  ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
    advert_int 1  ## 组播信息发送间隔,两个节点设置必须一样,默认1s
        mcast_src_ip 192.168.222.102 ## 本机 IP 地址
        ## 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    ## 虚拟 IP 池,两个节点设置必须一样
    virtual_ipaddress {
        192.168.222.99  ## 虚拟 ip,可以定义多个
        192.168.200.17
    }
    ## 将track_script 块加入 instance 配置块
    track_script {
        chk_nginx ## 执行 Nginx 监控服务
    }
}

Nginx 集群的高可用测试

1、准备 192.168.222.101 和 192.168.222.102 两台服务器
2、启动101和102服务器上的 Keepalived 和 Nginx(端口修改为:88)
3、通过配置在 keepalived.conf 文件的 IP 池完成 Nginx的访问

virtual_ipaddress {
        192.168.222.99  ## 虚拟 ip,可以定义多个
        192.168.222.17
    }

4、在浏览器输入:

# 主机 IP 访问
192.168.222.101:88
# 虚拟 IP 访问
192.168.222.99:88
192.168.222.17:88

5、杀死 101 的 Nginx 服务,并查看 nginx 的服务,发现 nginx_check.sh 脚本被执行

nginx -s stop
ps -ef | grep nginx

Nginx+Keepalived实现nginx的高可用集群搭建_第1张图片

6、杀死 101 的 Keepalived(MASTER)

首先查看 Keepalived 主机的虚拟 IP 被绑定到网卡上:

ip a

Nginx+Keepalived实现nginx的高可用集群搭建_第2张图片

杀死 Keepalived 主机服务:

service keepalived stop

再次查看 Keepalived 主机的虚拟 IP,发现被移除:
Nginx+Keepalived实现nginx的高可用集群搭建_第3张图片

再看 102 备机上的虚拟 IP:
Nginx+Keepalived实现nginx的高可用集群搭建_第4张图片

再次启动 101 服务器上的 Keepalived:
101 的 Keepalived 绑定了虚拟 IP,102 的 Keepalived 取消了绑定虚拟 IP

service keepalived start
ip a

Nginx+Keepalived实现nginx的高可用集群搭建_第5张图片
Nginx+Keepalived实现nginx的高可用集群搭建_第6张图片

你可能感兴趣的:(nginx,keepalived)