您现在的位置是:首页 >技术交流 >nginx keepalive 高可用原理和实操网站首页技术交流

nginx keepalive 高可用原理和实操

c+猿辅导 2024-06-17 10:43:02
简介nginx keepalive 高可用原理和实操


前言


一、nginx+keepalive搭建高可用服务方案?

使用nginx-keepalived双机热备机制,vip主机可以进行漂移,这样当一台主机挂掉了,还有备用机可以使用,保证了服务的可靠性。
具体的vip漂移架构图,如下:
在这里插入图片描述

二、方案解析

1.keepalive是什么

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

健康检查和失败切换是keepalived的两大核心功能。
所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp

  • core:负责主进程的启动,维护和全局配置文件的加载;
  • check:负责健康检查
  • vrrp:用来实现vrrp协议

2.nginx是什么

Nginx是十分轻量级的HTTP服务器。Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。
Nginx凭借其稳定性、低资源消耗、简单配置和丰富的功能,从十多年前名不见经传的Web服务器软件,发展到如今能够跟Apache匹敌的地位。
1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高
2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度
3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源
5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的
6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行

nginx采用多进程的模式,nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
在这里插入图片描述

三、keepalive与nginx环境安装

安装keepalived

在线安装
yum install keepalived
修改/etc/keepalived/keepalived.conf配置
systemctl enable keepalived; 
systemctl start keepalived;

准备安rpm装包:
mkdir workspace & cd workspace
sudo yum install --downloadonly keepalived --downloaddir=.
rpm -ivh net-snmp-libs-5.7.2-49.el7_9.2.x86_64.rpm
rpm -ivh net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64.rpm
rpm -ivh keepalived-1.3.5-19.el7.x86_64.rpm
修改/etc/keepalived/keepalived.conf配置
systemctl enable keepalived; 
systemctl start keepalived;


下载keepalive(下载官网:https://www.keepalived.org/download.html)
cd /home/*****/workspace/
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar xf  keepalived-2.2.7.tar.gz

cd keepalived-2.2.7
./configure
make -j3&& make install

sudo cp -rf keepalived/etc/keepalived/keepalived.conf.sample /usr/local/sbin/keepalived.conf
/usr/local/sbin/keepalived keepalived.conf


卸载keepalived
yum卸载
yum remove keepalived
或者rpm卸载
rpm -e net-snmp-libs-5.7.2-49.el7_9.2.x86_64
rpm -e net-snmp-agent-libs-5.7.2-49.el7_9.2.x86_64
rpm -e keepalived-1.3.5-19.el7.x86_64
rm -rf /etc/keepalived/*

安装nginx

1.安装nginx:
sudo rpm -Uvh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
sudo yum -y install nginx
sudo nginx -v 
sudo journalctl -u nginx -f

2.查看安装nginx结果:
rpm   -qa  | grep  nginx
3.升级
rpm  -Uvh  新版本软件nginx包 
4.卸载
命令:rpm   -e  nginx

安装报错解决:在这里插入图片描述

解决:
原因是Nginx 启动时 PID 文件并未生成,导致文件无法读取
/usr/lib/systemd/system/nginx.service新增 ExecStartPost=/bin/sleep 0.1
systemctl daemon-reload
systemctl restart nginx

四、高可用配置实例

/etc/keepalived/keepalived.conf如下
Keepalived的配置文件可以分为三块:
全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
VRRP 实例定义块:是 Keepalived 的核心;
虚拟服务器(LVS)定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围内。#和!开头的行都是注释。

简单实例:
主节点

! Configuration File for keepalived
global_defs {                                            #全局配置
        router_id   vplatform1                           #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
        script_user root
        enable_script_security
}

vrrp_script chk_service_state {
        script "/etc/keepalived/check_port.sh"
        #script "killall -0 nginx"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        # rise 2		            #表示需要连续成功2次才能认为是成功的
        # fall 2		            #表示需要连续失败2次才能认为是失败的
        # timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_script avoid_brain_split {
        script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        rise 2		                #表示需要连续成功2次才能认为是成功的
        fall 2		                #表示需要连续失败2次才能认为是失败的
        timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_instance VI_1 {                              #vrrp 实例部分定义,VI_1自定义名称
    state MASTER                                  #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface eth0                                #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 51                          #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 100                                  #定义优先级,数字越大,优先级越高。
    advert_int 1                                  #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                              #设置验证类型和密码,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {                           #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        10.20.40.100/24
    }
    track_script {                                #脚本监控状态
        chk_service_state                         #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
    }
    notify_master /etc/keepalived/slave2master.sh
    notify_backup /etc/keepalived/master2slave.sh
}

从节点

! Configuration File for keepalived
global_defs {                                   #全局配置
        router_id vplatform2                    #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
        script_user root
        enable_script_security
}

vrrp_script chk_service_state {
        script "/etc/keepalived/check_port.sh"
        #script "killall -0 nginx"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        # rise 2		            #表示需要连续成功2次才能认为是成功的
        # fall 2		            #表示需要连续失败2次才能认为是失败的
        # timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_script avoid_brain_split {
        script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
        interval 2                  #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
        weight -20
        rise 2		                #表示需要连续成功2次才能认为是成功的
        fall 2		                #表示需要连续失败2次才能认为是失败的
        timeout 2				    #脚本检测超时时间,超过这个时间则认为检测失败
}

vrrp_instance VI_1 {                              #vrrp 实例部分定义,VI_1自定义名称
    state BACKUP                                  #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    interface eth0                                #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    virtual_router_id 51                          #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    priority 90                                   #定义优先级,数字越大,优先级越高。
    advert_int 1                                  #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    authentication {                              #设置验证类型和密码,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {                           #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
        10.20.40.100/24
    }
    track_script {                                #脚本监控状态
        chk_service_state                         #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
    }
    notify_master /etc/keepalived/slave2master.sh
    notify_backup /etc/keepalived/master2slave.sh
}

checkport实例

#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then     
    systemctl start nginx
    sleep 1                                          
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        systemctl stop keepalived
    elif [ `ps -C keepalived --no-header |wc -l` -eq 0 ];then
        systemctl restart keepalived
    fi
fi

其中slave2master.sh、master2slave.sh以及checkport.sh一定要存在/etc/keepalived/下且权限要正确如下:

chmod 0744 /etc/keepalived/master2slave.sh
chmod 0744 /etc/keepalived/slave2master.sh
chmod 0644 /etc/keepalived/keepalived.conf
chmod 0644 /etc/keepalived/check_port.sh

在主机A上执行ip addr在这里插入图片描述
发现虚拟IP在主机A网卡eth0上,重启主机A,发现虚拟IP消失,在主机B上出现虚拟IP
在这里插入图片描述

如果主机A/B都配置了nginx,可以通过VIP:80访问nginx主页,即便关闭主机A,VIP会切换到主机B上,此时仍然可以访问nginx主页。从而实现了高可用方案。

总结

通过本文的讲解应该对高可用方案有了较深刻的理解,希望能够对你有所帮助。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。