浅入浅出keepalived+nginx实现高可用双机热备

对应用keepalived+nginx技术实现nginx高可用进行简单的分析,下面是通过对keepalived添加校验nginx存活脚本,监控nginx的状态,应用keepalived的主备模式实现nginx的高可用。
假如192.168.100.2和192.168.100.3两台机器安装了nginx,负载均衡配置一模一样。这两台机器对外的虚拟IP是:192.168.100.10,当100.2宕机或nginx未启动或启动失败,则将100.3选举为master,100.10绑定到100.3继续对外提供访问。

浅入浅出keepalived+nginx实现高可用双机热备_第1张图片

1、简介

1.1、keepalived

Keepalived是一个基于VRRP协议来实现的服务高可用方案。VRRP协议(虚拟路由冗余协议—— Virtual Router Redundancy Protocol,简称VRRP),是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。VRRP广泛应用在边缘网络 中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以 及即使在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。 简单来说就是,VRRP协议允许一台机器可以拥有一个或者多个虚拟IP。在高可用的一组机器中,有 一个master,多个slave,对外提供一个虚IP,通过虚IP访问master,slave负责监控master,如果 master宕机,则选举其中一个slave接管master,虚IP绑定到新的master上(俗称IP漂移),从而实现了高可用。具体请查看官网。
浅入浅出keepalived+nginx实现高可用双机热备_第2张图片
(摘自官网)
keepalived是一种高性能的服务器高可用或热备解决方案, keepalived可以用来防止服务器单点故障的发生,通过配合nginx可以实现 web 前端服务的高可用。可见keepalived的主备模式是针对宕机等情况,实现vip的漂移。

1.2、nginx

nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用,具体请查看官网。
浅入浅出keepalived+nginx实现高可用双机热备_第3张图片
(摘自官网)
keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和nginx配合来实现web前端服务的高可用。
Keepalived+Nginx实现高可用的思路:

  1. 请求不要直接打到nginx上,应该先通过keepalived(这就是所谓虚拟IP,VIP);
  2. keepalived应该能监控nginx的生命状态(提供一个用户自定义的脚本,定期检查nginx进程状态,进行权重变化,,从而实现nginx故障切换);

2、环境

准备2台机器,均为linux系统,ip地址分别为192.168.100.2和192.168.100.3,分别对应keepalived的master节点和backup节点,在2台机器上均安装keepalived和nginx服务。

vip ip keepalived nginx端口
192.168.100.10 192.168.100.2 master 80
192.168.100.10 192.168.100.3 backup 80

3、下载安装

3.1、nginx下载安装

准备linux版本的nginx安装包nginx-1.22.1.tar.gz
在2台机器上(ubuntu16.04)进行安装,编译安装命令如下:

# 更新源
apt-get update
# 安装gcc g++ 的依赖库
apt-get install build-essential 
apt-get install libtool  
# 安装pcre依赖库
apt-get install libpcre3 libpcre3-dev
# 安装zlib依赖库
apt-get install zlib1g-dev
# 安装openssl
apt-get install openssl libssl-dev

# 安装nginx
tar -zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx
make && make install

启动命令如下:

# 启动
nginx
# 停止
nginx -s stop
# 重启
nginx -s reload
# 测试
curl http://127.0.0.1:80

3.2、keepalived下载安装

准备linux版本的keepalived安装包keepalived-2.2.7.tar.gz
在2台机器上(ubuntu16.04)进行安装,编译安装命令如下:

# 安装依赖包
apt-get install libssl-dev openssl libpopt-dev
# 安装keepalived
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/usr/local/keepalived
make && make install

# 设置 keepalived 服务开机启动
chkconfig keepalived on
# 若chkconfig:未找到命令,执行下面解决
apt-get install sysv-rc-conf
cp /usr/sbin/sysv-rc-conf /usr/sbin/chkconfig

我们发现根本没有’/usr/local/etc/keepalived/keepalived.conf’ or '/etc/keepalived/keepalived.conf’这两个配置文件,甚至连对应的目录都没有,这一点keepalive做的不太好。下面需要手动创建目录,复制配置文件。

# 将 keepalived 设置为系统服务
cp  keepalived.conf.sample  keepalived.conf
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# 或对配置文件建立软链接
ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf   /etc/keepalived/keepalived.conf
# 或直接对目录建立软链接
ln -s /usr/local/keepalived/etc/keepalived   /etc/keepalived

mkdir /etc/sysconfig
cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ #从keepalived源码目录复制,安装目录中没有
cp /usr/local/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/init.d/ #从keepalived源码目录复制,安装目录中没有

注1:先查看keepalived的状态(先不启动,Keepalived很坑爹的),因为还需要将配置文件移动到对应的目录并修改配置文件,否则Keepalived启动不起来的。

systemctl daemon-reload 				#重载
systemctl stop keepalived.service  		#停止
systemctl start keepalived.service  	#启动keepalived
systemctl status keepalived.service  	#查看keepalived状态
systemctl restart keepalived          #重启

注2:查看一下/usr/local/keepalived/sbin/keepalived这个命令的使用帮助,从下面的使用帮助我们可以看的出来,keepalived命令启动时的默认配置文件使用了’/usr/local/etc/keepalived/keepalived.conf’
or ‘/etc/keepalived/keepalived.conf’。

root@master:/usr/local/keepalived/sbin# /usr/local/keepalived/sbin/keepalived --help
Usage: /usr/local/keepalived/sbin/keepalived [OPTION...]
  -f, --use-file=FILE          Use the specified configuration file
                                default '/usr/local/etc/keepalived/keepalived.conf'
                                     or '/etc/keepalived/keepalived.conf'
  -P, --vrrp                   Only run with VRRP subsystem
  -C, --check                  Only run with Health-checker subsystem
      --all                    Force all child processes to run, even if have no configuration
  -l, --log-console            Log messages to local console

注3:检查一下keepalived的配置文件/usr/local/keepalived/etc/keepalived/keepalived.conf
参数,因为里面有个vip绑定的网卡,这个网卡写的不对,Keepalive启动仍会是失败。

4、配置keepalived

在keepalived.conf配置文件中的 instance 里面配置 track_script,指定检查nginx是否存活的脚本。

4.1、master

! Configuration File for keepalived
# 全局配置,路由ID,固定不变 
global_defs {
   router_id LVS_DEVEL
}
# 定义Nginx状态检查脚本 
vrrp_script chk_nginx {
   # 具体的脚本
   script "/etc/keepalived/nginx_check.sh"
   interval 2 # 2s执行一次 
   weight -20 # 失败一次 则优先级 -20
}
# VRRP实例 
vrrp_instance VI_1 {
	# 主节点 
    state MASTER
    # 绑定的网卡,使用ifconfig命令查看获取
    interface eno1
    # 虚拟路由id,保证相同
    virtual_router_id 51
    # 优先级,抢占模式下优先级高的称为主
    priority 100
    # 指定发送VRRP通告的间隔,单位是秒
    advert_int 1
    # 安全认证用的密码,自定义即可
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 对外暴露的VIP地址 
    virtual_ipaddress {
        192.168.100.10
    }
    # 指定脚本
    track_script {
      chk_nginx
    }
}

4.2、backup

! Configuration File for keepalived
# 全局配置,路由ID,固定不变 
global_defs {
   router_id LVS_DEVEL
   script_user root
}
# 定义Nginx状态检查脚本 
vrrp_script chk_nginx {
   # 具体的脚本
   script "/etc/keepalived/nginx_check.sh"
   interval 2 # 2s执行一次 
   weight -20 # 失败一次 则优先级 -20
}
# VRRP实例 
vrrp_instance VI_1 {
	# 备节点 
    state BACKUP
    # 绑定的网卡,使用ifconfig命令查看获取
    interface eno1
    # 虚拟路由id,保证相同
    virtual_router_id 51
    # 优先级,抢占模式下优先级高的称为主
    priority 90
    # 指定发送VRRP通告的间隔,单位是秒
    advert_int 1
    # 安全认证用的密码,自定义即可
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 对外暴露的VIP地址 
    virtual_ipaddress {
        192.168.100.10
    }
    # 指定脚本
    track_script {
      chk_nginx
    }
}

4.3、配置 nginx_check.sh

该脚本就是通过ps命令检查nginx进程是否存活,如果不存活,则尝试启动一次再检查,如果还是启动不起来,则把keepalived关闭, 从而让keepalived能检测到,并且 vip 能够漂移到其他机器。

#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
            # 尝试启动一次
            systemctl start nginx
        # 再次检查ngixn 进程
        status2=$(ps -C nginx --no-heading|wc -l)
        if [ "${status2}" = "0"  ]; then
                # 关闭 keepalived 
                systemctl stop keepalived
        fi
fi

需要在2台机器上都配置上这个脚本,且授予可执行权限,然后进行重启,命令如下:

# 给脚本一个可执行的权限
chmode +x /etc/keepalived/nginx_check.sh 
# 重启或者启动keepalived 
systemctl restart keepalived

5、高可用双机热备测试

2台机器分别启动nginx和keepalived服务,查看2台机器上的nginx服务,访问如下:

浅入浅出keepalived+nginx实现高可用双机热备_第4张图片
浅入浅出keepalived+nginx实现高可用双机热备_第5张图片

查看2台机器上的ip地址,如下:

浅入浅出keepalived+nginx实现高可用双机热备_第6张图片
浅入浅出keepalived+nginx实现高可用双机热备_第7张图片
从图中可以看出多出1个虚拟IP。

访问vip 192.168.100.10,结果如下:

浅入浅出keepalived+nginx实现高可用双机热备_第8张图片

当关闭100.2上的nginx后,keepalived将在2s内将它重新启动,当关闭100.2上的keepalived和nginx后,再次访问vip 192.168.100.10,结果如下:

浅入浅出keepalived+nginx实现高可用双机热备_第9张图片

当再次开启100.2上的keepalived和nginx后,再次访问vip 192.168.100.10,结果如下:

浅入浅出keepalived+nginx实现高可用双机热备_第10张图片

当关闭100.3上的keepalived和nginx后,再次访问vip 192.168.100.10,结果如下:

浅入浅出keepalived+nginx实现高可用双机热备_第11张图片
可见,100.3机器宕机后,访问VIP并未受影响,可以正常访问。

6、小结

keepalived 是一种高性能的服务器高可用或热备解决方案, keepalived 可以用来防止服务器单点故障的发生,通过配合 nginx 可以实现 web 前端服务的高可用和双机热备。
在实际的生产项目中,对服务的高可用可以用nginx来实现,但当nginx只有一台 ,访问流量又非常大时,为了避免nginx服务器宕机,可以通过keepalived实现nginx的双机热备。
keepalived实现高可用的原理请查看官网继续研究,若有不当或错误之处,欢迎留言。
感兴趣的小伙伴可以尝试一下~

你可能感兴趣的:(nginx,nginx,keepalived,双机热备)