Nginx: 使用KeepAlived配置实现虚IP在多服务器节点漂移及Nginx高可用原理

使用KeepAlived配置实现虚IP在多服务器节点漂移


1 )环境准备

  • 2台 linux , 一主一备
    • 节点1:192.168.184.30 CentOS 7 Master
    • 节点2:192.168.184.40 CentOS 7 Backup
    • VIP 192.168.184.50
  • 安装 KeepAlived, $ yum install keepalived
    • 注意,安装好yum源,base 源就有这个软件
    • 两台都执行安装
  • 关闭selinux 和 防火墙
    • $ setenforce 0 临时关闭
      • vim /etc/sysconfig/selinux 编辑 SELINUX=disabled 永久关闭
    • $ systemctl stop firewalld 关闭
      • systemctl disable firewalld 关闭自启动
    • 这里非常重要,否则可能两台机器无法通信

2 ) 相关配置说明

  • 查看软件生成了哪些文件, $ rpm -ql keepalived
    • 可以选择其中一台去执行
    • 输出有一些比较重要的文件和目录,可以去看看,这里着重说明
    • /etc/keepalived/keepalived.conf 主配置文件
    • /etc/sysconfig/keepalived 更改默认属性配置文件
    • /usr/bin/genhash 二进制程序
    • /usr/lib/systemd/system/keepalived.service 使用systemctl 启动停止查看
    • /usr/libexec/keepalived 这是lib包
    • /usr/sbin/keepalived 这是主程序文件
  • 查看相关配置文件 $ vim /etc/keepalived/keepalived.conf
    • 可以先在一台上操作,比如 184.30 这台机器
    • ! Configuration File for keepalived 这一段是注释
    • global_defs 块中,决定了全局属性,全局配置, 对整个 keepalived 生效
      global_defs {notification_email {   # 这里可以写多个邮箱, 确保服务器在内网并且邮箱可收到当前服务器发送的邮件admin@baidu.commaster@baidu.com}notification_email_from  ka@baidu.com  # 填写自己的邮箱smtp_server 192.168.184.200smtp_connect timeout 30 # 连接邮件服务器时的超时时长router_id Nginx  # 这里 router_id 自己起个名字# vrrp_skip_check_adv_addr # 以下都注释掉# vrrp_strict     # 严格的vrrp限制,可以注释掉,可能会有绑定好了,但ping不通的问题,所以注释了# vrrp_garp_interval 0# vrrp_gna_interval 0
      }
      
    • vrrp_instance Nginx_1 块,是vrrp的实例,名称叫做 Nginx_1 这个自己修改
      vrrp instance Nginx_1 {state MASTER        # 标记是 master 还是 backupinterface ens33       # 当前服务器需要绑定的网卡,指定一块网卡, 根据实际情况指定内网网卡(184.30这块)virtual_router_id 51   # 标识虚拟路由id,可以自己写,要确保相同名称的实例,这里的id是一样的priority 100   # 指定优先级,值越大,转移优先级越高advert_int 1authentication {auth_type PASS # 认证方式,通过密码auth_pass 1111}virtual_ipaddress { # 虚拟的ip地址,下面可以填入多个,VIP 也可以就填一个,按照之前设计192.168.200.50}
      }
      
    • 其他配置都可以先删除
  • 接着,在 184.40 的 /etc/keepalived/keepalived.conf 配置文件做类似必要修改
    global_defs {notification_email {admin@baidu.commaster@baidu.com}notification_email_from  ka@baidu.com smtp_server 192.168.184.200smtp_connect timeout 30 # 连接邮件服务器时的超时时长router_id Nginx # vrrp_skip_check_adv_addr# vrrp_strict# vrrp_garp_interval 0# vrrp_gna_interval 0
    }vrrp instance Nginx_1 { # 这里要和 master 配置成同一个实例名称,否则不会成功state BACKUP   # 注意这里    interface ens33       # 根据实际情况指定内网网卡(184.40这块)virtual_router_id 51   # 同 master 一致,才能保证转移priority 98    # 这个优先级较小advert_int 1authentication {auth_type PASS # 认证方式,通过密码auth_pass 1111}virtual_ipaddress { # 虚拟的ip地址,下面可以填入多个,VIP 也可以就填一个,按照之前设计192.168.200.50}
    }
    
  • 配置好两台之后,我们在 184.30 机器上监控下日志,新开一个控制台, $ tail -f /var/log/messages
  • 之后再 184.30 上开启一个终端,启动 $ systemctl start keepalived
  • 通过 var/log/messages 日志的监控,我们可以看到如下关键信息
    Starting Keepalived v1.3.5 (03/19,2017),git commit v1.3.5-6 g6fa32f2   这里可以看到软件版本
    Opening file '/etc/keepalived/keepalived.conf'   这里正在打开配置文件
    Starting Healthcheck child process, pid=3968   这里进行健康检查
    Starting VRRP child process, pid=3969    这里启动 VRRP 协议
    Keepalived healthcheckers[3968]: Opening file '/etc/keepalived/keepalived.conf
    Registering Kernel netlink reflector
    Registering Kernel netlink command channel
    Registering  gratuitous  ARP  shared  channel
    Opening file '/etc/keepalived/keepalived.conf'
    Started LVS and VRRP High Availability  Monitor
    VRRP Instance(Nginx 1) removing protocol VIPs.
    Using LinkWatch kernel netlink reflector...
    VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
    VRRP_Instance(Nginx_1) Transition to MASTER STATE  # 注意这里,进入 master 状态
    VRRP_Instance(Nginx_1) Entering MASTER  STATE
    VRRP_Instance(Nginx_1) setting protocol IPs.  # 注意这里,设置 ip
    Sending gratuitous ARP on ens33 for 192.168.184.50   # 配置184.50到当前节点
    VRRP_Instance(Nginx_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.184.50 # 不停发送信息
    Sending gratuitous ARP on ens33 for 192.168.184.50
    Sending gratuitous ARP on ens33 for 192.168.184.50
    
    • 184.30 后面在局域网内不停发送 ARP 广播信息:我已经有了184.50地址了,并且我是健康的
    • 184.40 机器收到后发现自己的优先级较低,会自动进入备用和待命状态
  • 在184.30 这台机器上检查 $ ip a
    1: lo: <LOOPBACK,UP, LOWER UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid lft forever preferred lft foreverinet6 :: 1/128 scope hostvalid lft forever preferred lft forever2: ens33: <BROADCAST,MULTICAST, UP, LOWER UP> mtu 1500 qdisc pfifo fast state UP qlen 1
    000link/ether 00:0c:29:e1:51:9c brd ff:ff:ff:ff:ff:ffinet 192.168.184.30/24 brd 192.168.184.255 scope global ens33valid lft forever preferred lft foreverinet 192.168.184.50/32 scope global ens33valid lft forever preferred lft forever inet6 fe80::e2f8:ff8a:c97a:2368/64 scope linkvalid lft forever preferred lft forever
    
    • 这里可以看到 ens33上存在: inet 192.168.184.50/32 scope global ens33
    • 也就是 184.50 被绑定到了 ens33 网卡上了
    • 使用其他机器,比如 184.40 ping 这个 184.50 显示正常
    • 这样,184.50 这个 VIP 就可以正常对外提供服务了
  • 按照同样的方法,监测并启动 184.40 这台 backup 机器
    • 它会进入 BACKUP STATE 并不断进行监测
    • 有一条重要信息:VRRP_Instance(Nginx_1) Received advert with higher priority 100, ours 98
    • 可见,基于优先级,这里仍旧是 BACKUP STATE
    • 执行 $ ip a 时,184.40 是不会有 184.50 的VIP信息的

3 )模拟主节点宕机

  • 在 184.30 机器上,$ systemctl stop keepalived 或 $ reboot
  • 在 184.40 机器上监测的日志信息中会发现,立即进入 MASTER STATE
    • 并且 setting protocol VIPs.
    • 同时,继续广播自己已经拥有了 184.50,其他机器去主动更新本地ARP缓存表
    • 通过 $ ip a 可以看到 184.50 已经有了
  • 当184.30机器恢复并重新上线
    • 184.30 会立即变成 MASTER STATE
    • 184.40 会立即降级 BACKUP STATE
    • 这个是默认的配置,有时候我们并不想有这个效果,会对业务存在一定风险
  • 如果不想重新上线后又变成了 MASTER STATE,即非抢占式的
    • 在两台机器的 /etc/keepalived/keepalived.conf 的 vrrp_instance Nginx_1 段中
    • 添加一项配置 nopreempt 并且 都配置成 state BACKUP,没有 MASTER 了
    • 这样就都配置成了非抢占式,注意这里,非抢占式都配置成 BACKUP
    • 只要有一台配置了 MASTER 并且优先级较大,非抢占式就不会成功,就会去抢占
  • 以上就实现了2台机器的 VIP 转移, 需要多个机器的话,就多配置几台即可

4 )日志管理

  • 默认情况下,配置到了 /var/log/messages 中,如果不想配置在这里
  • 可以在 /etc/sysconfig/keepalived 中
    # Options for keepalived. See `keepalived --help' output and keepalived(8) and
    # keepalived.conf(5) man pages for a list of all options. Here are the most
    #  common ones :
    #
    #  --vrrp                  -P       Only run with VRRP subsystem.
    #  --check                 -C       Only run with Health-checker subsystem.
    #  --dont-release-vrrp     -V       Dont remove VRRP VIPs & VROUTEs on daemon stop.
    # --dont-release-ipvs      -I       Dont remove IPVS topology on daemon stop.
    # --dump-conf              -d       Dump the configuration data.
    #  --log-detail            -D       Detailed log messages.
    #  --log-facility          -S       0-7 Set local syslog facility (default=LOG DAEMON)
    #KEEPALIVED OPTIONS="-D -d -S  0"   # 修改这里,默认是 -D
    
    • KEEPALIVED OPTIONS="-D -d -S 0" 将 日志文件 放入 -S 中
  • 之后,$ vim /etc/rsyslog.conf 更改日志的存放位置
    local7.*                           /var/log/boot.log
    local0.*                           /var/log/keepalived/keepalived.log
    
  • 之后,$ systemctl restart rsyslog 重启日志服务
  • 之后,$ systemctl restart keepalived 重启 keepalived
  • 检查,$ cd /var/log/keepalived/ && ll 下发现存在 keepalived.log 文件
    • 以后,所有的 keepalived 日志都会写在这里

Nginx 高可用原理


1 ) 原理

  • 同一时刻,两台Nginx只能有一台拥有 VIP
  • 当 Nginx 挂掉,KeepAlived 不会因为Nginx挂掉而转移 VIP
  • 而是宕机(或KeepAlived服务退出)之后才能转移
  • 我们需要写一个脚本,把 keepalived 和 Nginx 结合起来,实现服务的故障转移
  • 我们需要监测nginx程序,如果nginx 宕掉,那么就触发故障转移
  • 比如说,有两台Nginx服务器,准备好相同的数据,一台服务器节点宕掉之后
  • 另外一台服务器节点把对应的Nginx服务给我启动起来
  • 只要ip漂过来之后,对于用户来说,仍然能访问到相关服务

2 ) 脚本

  • $ vim nginx_health.sh 用于监测 nginx
    #!/bin/bash
    #ps -ef | grep nginx | grep -v grep &> /dev/nullif [ $? -ne 0 ];thenkillall keepalived
    fi
    
    • $? 表示 上一行命令的执行结果
  • 这里,当 Nginx 存在,执行 $ ps -ef | grep nginx | grep -v grep &> /dev/null 再执行 $ $? 这里是 0
  • 如果,Nginx 不存在,执行 $ ps -ef | grep nginx | grep -v grep &> /dev/null 再执行 $ $? 这里是 1 (非零)
  • 充分说明,我们可以通过这条命令的返回值来确定 Nginx 进程是否存在
  • 对脚本赋予执行权限 $ chmod +x nginx_health.sh
  • 两台机器都做以上处理,后续需要在 KeepAlived 配置文件中利用这样的脚本去追踪Nginx的状态
  • 并且配置实现对 Nginx 的高可用,此处留下思考,不再提供细节

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter、Python、Postman测试工具对比

一、JMeter 总结&#xff1a;适合对代码不敏感的使用人员&#xff0c;不会代码也可以完成接口自动化&#xff0c;设计框架。适合紧急迭代的项目。 JMeter接口测试的优势 小巧轻量级&#xff0c;并且开源免费&#xff0c;社区接受度高&#xff0c;比较容易入门支持多协议&…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

音频原始数据PCM

PCM全称是脉冲编码调制数据。PCM数据是未经过压的音频数据&#xff0c;它由模拟信号信号经过采样、编码等步骤抓换成的数字信号。 一、音频基础知识讲解 1.1频率 声音是由震动产生的&#xff0c;所以声音是有频率的&#xff0c;人类可以听到的声音频率大概在20HZ~20KHZ 1.2振…

Windows通过网线连接开发板共享网络

Windows端 打开更开适配器选项右键WLAN–属性–共享 右键以太网–属性–Internet协议版本4(TCP/IPv4) 记住IP地址 开发板端 查看网卡 ifconfig设置IP在同一网段 ifconfig eth0 192.168.137.2 netmask 255.255.255.0设置网关 route add default gw 192.168.137.1配置DNS su…

minio最新源码编译(处理安全扫描中跨域访问、.js.map等不安全问题) 版本:RELEASE.2024-06-26T01-06-18Z

编译前注意事项 编译基于tag为RELEASE.2024-06-26T01-06-18Z的版本处理安全扫描问题。如&#xff1a;敏感信息泄露、.js.map、跨域访问问题需要准备两个工程&#xff0c;前端工程console和minio工程&#xff0c; 目录结构处理: gowork/ │ └── src/├── github.com├── …

华为 HCIP-Datacom H12-821 题库 (6)

有需要题库的可以看主页置顶 V群仅进行学习交流 1.转发表中 FLAG 字段中B 的含义是&#xff1f; A、可用路由 B、静态路由 C、黑洞路由 D、网关路由 答案&#xff1a;C 解析&#xff1a; 可用路由用U 表示&#xff0c;静态路由用 S 表示&#xff0c;黑洞路由用 B 表示&#x…

原油市场“闪崩”,国际油价单日下跌超4%!

KlipC报道&#xff1a;当地时间9月3日周二&#xff0c;延续早些时候的跌势&#xff0c;国际油价暴跌。WTI原油收跌近4.4%&#xff0c;逼近70美元大关&#xff1b;布伦特原油跌破75美元&#xff0c;跌幅4.86%&#xff0c;均抹去今年所有涨幅。 据悉&#xff0c;受到威胁后逃离了…

系统编程-数据库

数据库 目录 数据库 引入 1、先安装数据库 2、数据库设置密码 3、数据库的进入和退出(前提 你的密码更改过了) 数据库的基本操作 1、显示所有的数据库 2、创建数据库 3、删除数据库 4、选择数据库 在数据库中对表进行操作 1、查看当前数据库中的表 2、在数据库中…

如何在算家云搭建Qwen2(智能对话)

一、Qwen2简介 Qwen2 是由阿里云通义千问团队研发的新一代大型语言模型系列&#xff0c;它在多个方面实现了技术的飞跃和性能的显著提升。以下是对 Qwen2 的详细介绍&#xff1a; GitHub - QwenLM/Qwen2: Qwen2 is the large language model series developed by Qwen team, …

GD32 Flash读写与存储数据操作,亲测可用

这里写自定义目录标题 联系作者请加一、GD32 Flash特性二、Flash读写操作1. Flash读取操作2. Flash写入操作三、注意事项四、其他方法联系作者请加 如有技术问题及项目需求请加作者微信! 一、GD32 Flash特性 存储空间划分:GD32的Flash存储空间通常分为主存储块和信息块。主存…

SpringBoot学习(5)(springboot整合mybatis)

目录 1、整合mybatis基本介绍 &#xff08;1&#xff09;spring整合mybatis &#xff08;2&#xff09;springboot整合mybatis 2、案例&#xff08;根据用户id&#xff0c;返回用户所有信息&#xff09; &#xff08;1&#xff09;新建数据库连接、数据库、表。插入值 &a…

探索MongoDB的Python之钥:pymongo的魔力

文章目录 探索MongoDB的Python之钥&#xff1a;pymongo的魔力背景&#xff1a;为什么选择pymongo&#xff1f;简介&#xff1a;pymongo是什么&#xff1f;安装&#xff1a;如何将pymongo纳入你的项目&#xff1f;基础用法&#xff1a;五个核心函数介绍1. 连接到MongoDB2. 选择数…

【Spring Boot 3】【Web】自定义过滤器

【Spring Boot 3】【Web】自定义过滤器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…

【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据、2013-2022年的省市县三级的逐日SO2数据、2008-2022年我国省市县三级的逐日NO2数据和2000-2022年我国省市县三级…

ubuntu20.04(wsl2)测试 arcface 人脸识别(计算特征向量)

1. 参考博客和代码、模型仓库&#xff1a; 1.1. 【C随记】collect2: error: ld returned 1 exit status错误分析与解决 1.2. Visual Studio 2022新建 cmake 工程测试 tensorRT 自带样例 sampleOnnxMNIST 1.3.报错&#xff1a;ModuleNotFoundError: No module named ‘ten…

基于tesseract实现文档OCR识别

导入环境 导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库&#xff0c;用于图像处理。 import numpy as np import argparse import cv2设置命令行参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--imag…

视频集中存储智能边缘计算网关软硬一体机智能边缘计算网关应用场景

在信息化飞速发展的今天&#xff0c;数据处理的速度和效率直接影响到各行各业的运作和发展。传统的云计算模式虽然强大&#xff0c;但在面对实时性和带宽要求越来越高的应用场景时&#xff0c;往往显得力不从心。此时&#xff0c;智能边缘计算网关的出现&#xff0c;为我们带来…

长效静态代理IP推荐:天启代理IP的优势与应用

在如今这个互联网的时代&#xff0c;代理IP已成为许多网络活动的必备工具。相比动态代理IP&#xff0c;长效静态代理IP以其稳定性和长时间有效性&#xff0c;成为了许多用户的首选。今天&#xff0c;我们将深入探讨长效静态代理IP的优势&#xff0c;并重点推荐天启代理IP。 什…

Docker compose 安装 ELK

1. 简介 方案概述 我们使用 Filebeat 作为日志收集器&#xff0c;接入到 Redis 队列&#xff0c;然后消费队列中的日志数据流转到 Logstash 中进行解析处理&#xff0c;最后输出到 Elasticsearch 中&#xff0c;再由 Kibana 展示到页面上。我们采用 Elasticsearch 3 节点集群…

web前端-网页

一、网页 1.网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素,它通常由图片、链接、文字、声…