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

news/2024/7/7 21:44:38 标签: nginx, keepalived, 双机热备

对应用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继续对外提供访问。

在这里插入图片描述

1、简介

keepalived_6">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是一种高性能的服务器高可用或热备解决方案, keepalived可以用来防止服务器单点故障的发生,通过配合nginx可以实现 web 前端服务的高可用。可见keepalived的主备模式是针对宕机等情况,实现vip的漂移。

nginx_11">1.2、nginx

nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用,具体请查看官网。
在这里插入图片描述
(摘自官网)
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台机器上均安装keepalivednginx服务。

vipipkeepalivednginx端口
192.168.100.10192.168.100.2master80
192.168.100.10192.168.100.3backup80

3、下载安装

nginx_29">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

keepalived_64">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启动仍会是失败。

keepalived_133">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 {
        125.10.100.100
    }
    # 指定脚本
    track_script {
      chk_nginx
    }
}

nginx_checksh_221">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台机器分别启动nginxkeepalived服务,查看2台机器上的nginx服务,访问如下:

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
从图中可以看出多出1个虚拟IP。

访问vip 192.168.100.10,结果如下:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
可见,100.3机器宕机后,访问VIP并未受影响,可以正常访问。

6、小结

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


http://www.niftyadmin.cn/n/66252.html

相关文章

如何利用chatgpt入门学习零知识证明?

Rust开源零知识证明算法有没有优秀的rust开源的零知识证明算法,是的,有很多优秀的 Rust 开源的零知识证明算法,以下是其中一些:bellman: 一个 Rust 实现的零知识证明库,它支持高效的 Groth16 零知识证明系统&#xff0…

【并发编程】LockSupport源码详解

目录 一、前言 1.1 简介 1.2 为什么说LockSupport是Java并发的基石? 二、LockSupport的用途 2.1 LockSupport的主要方法 2.2 使用案例 2.3 总结 三、LockSupport 源码分析 3.1 学习原理前的前置知识 3.1.1 Unsafe.park()和Unsafe.unpark() 3.1.2wait和notify/notify…

华为HCIE学习之Openstack Nova组件

文章目录一、openstack组成形式二、Nova的模块1、Nova-api功能2、Nova-scheduler功能3、Nova-conductor功能4、Nova-novncproxy5、Nova-compute三、nova中的一些概念 一、openstack组成形式 openstack由一个个组件组成,每个组件由一个个模块组成。 二、Nova的模块…

事件10001,10016,10037

事件10001,10016, 10037 1.检测系统问题 扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一致情况: ​ Dism /Online /Cleanup-Image /ScanHealth 在前一条命令执行完以后,发现系统文件有损坏时使用&#…

RFC2544 网络基准测试(Benchmarking Methodology for Network Interconnect Dev)

RFC2544是什么? 为了对网络设备(交换机、防火墙等网络互通设备)的性能进行客观的评价,避免不同厂家各说各话,定义的测试方法和测试报告的格式。厂家研发生产的网络设备入网销售一般来说,都必须要参照RFC2544的标准测试。 RFC254…

计算机网络篇

网络体系结构概述 分层的基本原则 每层都实现一种相对独立的功能,降低大系统的复杂度。各层之间界面自然清晰,易于理解,相互交流尽可能少。各层功能的精确定义独立于具体的实现方法,可以采用最合适的技术来实现。保持下层对上层的独立性,上层单向使用下层提供的服务。整个…

如何用Redis实现延迟队列

背景前段时间有个小项目需要使用延迟任务,谈到延迟任务,我脑子第一时间一闪而过的就是使用消息队列来做,比如RabbitMQ的死信队列又或者RocketMQ的延迟队列,但是奈何这是一个小项目,并没有引入MQ,我也不太想…

Python 异步: 当前和正在运行的任务(9)

我们可以反省在 asyncio 事件循环中运行的任务。这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现。 1. 如何获取当前任务 我们可以通过 asyncio.current_task() 函数获取当前任务。此函数将为当前正在运行的任务返回一个任务对象。 ... # …