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

news2024/11/26 5:32:39

对应用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、简介

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的漂移。

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台机器上均安装keepalived和nginx服务。

vipipkeepalivednginx端口
192.168.100.10192.168.100.2master80
192.168.100.10192.168.100.3backup80

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 {
        125.10.100.100
    }
    # 指定脚本
    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服务,访问如下:

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

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

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

访问vip 192.168.100.10,结果如下:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

6、小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++深入浅出(九)—— 多态

文章目录1. 多态的概念2. 多态的定义及实现🍑 多态的构成条件🍑 虚函数🍑 虚函数的重写🍑 虚函数重写的两个例外🍑 C11的override 和 final🍑 重载、覆盖(重写)、隐藏(重定义)的对比3. 抽象类🍑…

微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第二步注入dll文件

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 上一篇文章我们提到过,微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第一步登录微信,需要的大家可以点进去看。 文接上篇,本文主要介绍如果将机器人接入到微信中的方法之一,别的方法后面专…

如何快速了解项目源文件的构成?基于 Node.js 实现项目源代码数据统计工具

当希望了解一个项目的代码规模时,首先可能会想对项目源文件的数量、类型分布、代码行数等做一下数据统计。使用 Linux/git 命令可以满足简单的统计需求,使用流行的 cloc 工具可以实现详细的源代码分析数据。此外也可以使用 Node.js 编码简单的实现个性化…

1.7配置OSPF手动汇总

实验7:配置OSPF手动汇总 实验目的实现OSPF路由汇总的配置阐明OSPF引入的外部路由时进行路由汇总的方法实验拓扑配置OSPF手动汇总实验拓扑如图1-17所示。 图1-17 配置OSPF手动汇总 实验步骤配置IP地址,配置OSPF(和实验6一致,此处略)在…

我还是学生,需要做副业吗?致各位迷茫的学生们

大家好,我是蝶衣王的小编,今天跟大家聊一聊,学生党应该做副业吗本文仅支持成人学生党查看,如果您还是未成年人,请立即退出本文。如今你唯一要做的就是好好学习,不要想那么多关于金钱的事,等到你…

CMMI-立项管理流程

立项管理(Project Initialization Management, PIM)的目的是:(1)采纳符合机构最大利益的立项建议,通过立项管理使该建议成为正式的项目(即合法化)。(2)杜绝不…

2023年阿里云活动有哪些实例规格的云服务器?如何选择这些实例规格

2023年阿里云活动有哪些实例规格的云服务器?新手用户通过阿里云活动选购阿里云服务器的时候实例规格应该怎么选,因为同配置的云服务器往往有多种不同是规格的云服务器可供选择,而且不同实例规格的云服务器之间价格差别还比较大,因…

CPP2022-28-期末模拟测试01

6-1 实现一个计算三角形面积的简单函数(假设输入的边长合理)。 分数 10 全屏浏览题目 切换布局 作者 王和兴 单位 东北大学秦皇岛分校 实现一个计算三角形面积的简单函数(假设输入的边长合理)。 函数接口定义: do…

Seata-server 源码学习(一)

Seata源码学习引入 学习了Seata的应用以后,我们从这开始要开始分析Seata的源码相关内容 源码下载 官方地址:https://seata.io/zh-cn/blog/download.html 通过idea打开seata-1.4.2版本的源码 回顾AT模式 其实在之前的应用课程中,我们已经用…

Windows 离线安装 MySQL 8

目录 1. 下载离线安装包 2. 上传解压 3 配置 my.ini 文件 4 设置系统环境变量 5 安装 MySQL 6 登录 MySQL 客户环境是内网环境,不能访问外网,只能离线安装 MySQL 了。 1. 下载离线安装包 MySQL 离线压缩包官网下载地址:MySQL :: Down…

Java基础面试题——面向对象和集合专题

文章目录1. 面向对象和面向过程的区别2. 介绍下Java中的基本数据类型3. 标识符的命名规则4. instanceof关键字的作用5.重载和重写的区别6.介绍下内部类7.介绍下Java中的四种引用8.HashCode的作用9.有没有可能两个不相等的对象有相同的hashcode10.深拷贝和浅拷贝的区别是什么?1…

STM32单片机DS18B20测温程序源代码

OLED液晶屏电路接口DS18B20电路接口STM32单片机DS18B20测温程序源代码#include "sys.h"#define LED_RED PBout(12)#define LED_GREEN PBout(13)#define LED_YELLOW PBout(14)#define LED_BLUE PBout(15)#define DS18B20_IO_IN() {GPIOA->CRL&0XFFFFFFF0;GPIOA…

使用Arthas定位问题

功能概述 首先,Arthas的常用功能大概有以下几个: 解决依赖冲突 sc命令:模糊查看当前 JVM 中是否加载了包含关键字的类,以及获取其完全名称。 sc -d 关键字 注意使用 sc -d 命令,获取 classLoaderHash命令&#xff1a…

Java 快速判断一个 IP 是否在给定的网段内

目录方法一:借助于 Java 提供的 InetAddress方法二:撸个算法实现(二进制计算)其他数字转为子网掩码要在Java中判断一个IP地址是否在给定的网段内,可以使用子网掩码将IP地址和子网掩码进行与操作来提取网络地址&#xf…

计算机网络入门

一,计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化,网络化和信息化,它是一个以网络为核心的信息时代。有三类大家很熟悉的网络,即电信网络,有线电视网络和计算机网络。按照最初的服务分工,…

GB28181-2022注册注销基本要求、注册重定向解读和技术实现

规范解读GB28181-2022注册、注销基本要求相对GB28181-2016版本,做了一定的调整,新调整的部分如下:——更改了注册和注销基本要求(见 9.1.1,2016 年版的 9.1.1)。1.增加对NAT模式网络传输要求,宜…

Vulnhub 渗透练习(一)—— Breach 1.0

环境搭建 环境下载: https://www.vulnhub.com/entry/breach-1,152/ 环境描述: Vulnhub 中对此环境的描述: VM 配置有静态 IP 地址 (192.168.110.140),因此您需要将仅主机适配器配置到该子网。 这里我用的是 VMware &#xff0…

零信任-腾讯零信任iOA介绍(4)

​腾讯零信任介绍 腾讯零信任是一种信息安全架构,旨在通过限制对计算设备、数据和应用程序的访问来保护敏感信息。腾讯零信任的主要思想是,任何计算设备、数据或应用程序都不应被自动信任,并需要经过授权后才能访问敏感信息。 腾讯零信任的…

MyBatis的工作原理

1、读取MyBatis 配置文件:mybatis-config.xml 为MyBatis 的全局配置文件,配置了MyBatis 的运行环境等信息,例如数据库连接信息。 2、加载映射文件。映射文件即SQL 映射文件,该文件中配置了操作数据库的SQL 语句,需要在…

运动耳机买什么样的好、最好用的运动耳机排行榜

2月中旬,气温回暖,路面冰雪融化,又到了运动的好时节。难道还要每天上下班后就回家躺着嘛,浪费时间可耻,为什么不做一些更有意义的事情呢?即刻出发,开始空余,享受运动锻炼的乐趣&…