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

news2024/9/24 23:27:20

使用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.com
      		master@baidu.com
      	}
      	notification_email_from  ka@baidu.com  # 填写自己的邮箱
      	smtp_server 192.168.184.200
      	smtp_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 还是 backup
      	interface ens33       # 当前服务器需要绑定的网卡,指定一块网卡, 根据实际情况指定内网网卡(184.30这块)
      	virtual_router_id 51   # 标识虚拟路由id,可以自己写,要确保相同名称的实例,这里的id是一样的
      	priority 100   # 指定优先级,值越大,转移优先级越高
      	advert_int 1
      	authentication {
      		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.com
    		master@baidu.com
    	}
    	notification_email_from  ka@baidu.com 
    	smtp_server 192.168.184.200
    	smtp_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 1
    	authentication {
    		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 1
    	link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    	inet 127.0.0.1/8 scope host lo
    		valid lft forever preferred lft forever
    	inet6 :: 1/128 scope host
    		valid lft forever preferred lft forever
    
    2: ens33: <BROADCAST,MULTICAST, UP, LOWER UP> mtu 1500 qdisc pfifo fast state UP qlen 1
    000
    	link/ether 00:0c:29:e1:51:9c brd ff:ff:ff:ff:ff:ff
    	inet 192.168.184.30/24 brd 192.168.184.255 scope global ens33
    		valid lft forever preferred lft forever
    	inet 192.168.184.50/32 scope global ens33
    		valid lft forever preferred lft forever 
    	inet6 fe80::e2f8:ff8a:c97a:2368/64 scope link
    		valid 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/null
    
    if [ $? -ne 0 ];then
    	killall 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.coloradmin.cn/o/2093423.html

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

相关文章

前端源码解读:前端小白也能轻松理解的axios源码

作为前端开发的小伙伴&#xff0c;你肯定对 axios 这个超级好用的 HTTP 请求库不陌生吧&#xff1f;它不仅操作简单&#xff0c;功能还特别强大&#xff0c;难怪大家都爱用&#xff01;但你知道吗&#xff1f;axios 的魅力可不仅仅在于它的好用&#xff0c;真正让人佩服的是它源…

jmeter 响应乱码

Jmeter在做接口测试的时候的&#xff0c;如果接口响应的内容中有中文&#xff0c;jmeter的响应内容很可能显示乱码&#xff0c;为了规避这种出现乱码的问题&#xff0c;就要对jmeter的响应结果进行编码处理。 打开jmeter进行接口、压力、性能等测试&#xff0c;出现以下乱码问…

[Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解

目录 1.体育课测验(二)1.题目链接2.算法原理详解 && 代码实现 2.合唱队形1.题目链接2.算法原理详解 && 代码实现 3.宵暗的妖怪1.题目链接2.算法原理详解 && 代码实现 1.体育课测验(二) 1.题目链接 体育课测验(二) 2.算法原理详解 && 代码实现…

数据结构-队列的介绍及循环队列

1.队列的概念 在开始前&#xff0c;请牢记这句话&#xff1a;队列是一个先进先出的数据结构。 队列&#xff08;queue&#xff09;是限定在表的一端进行插入&#xff0c;表的另一端进行删除的数据结构&#xff0c;如同栈的学习&#xff0c;请联系前文所学链表&#xff0c;试想…

python 安装

下载 Download Python | Python.org 安装

jquery下载的例子如何应用到vue中

参考测试圈相亲平台开发流程&#xff08;4&#xff09;&#xff1a;选个漂亮的首页 (qq.com) 下载的文件夹解压到v_love项目的pubilc下的static文件夹内&#xff0c;这里放的都是我们的静态资源。 打开文件夹内的index.html&#xff0c;我们先确定下它是不是我们要的东西&…

产品经理的学习笔记(全集)-持续更新

1.前言 产品经理不是一个软件&#xff0c;也不是一个专业技能&#xff0c;是一个思维量变的过程&#xff1b;内容介绍&#xff1a;P1-产品经理基础认知&#xff1b;P2-从0-1搭建实战项目&#xff08;电商&#xff09; 2.产品经理基础 2.1产品经理定义 产品管理--产品的设计…

求职Leetcode题目(9)

1.通配符匹配 题解&#xff1a; 其中&#xff0c;横轴为string s&#xff0c;纵轴为pattern p 这个表第(m,n)个格子的意义是:【p从0位置到m位置】这一整段&#xff0c;是否能与【s从0位置到n位置】这一整段匹配 也就是说&#xff0c;如果表格的下面这一个位置储存的是T(True)…

SprinBoot+Vue学生选课小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Ubuntu 24.04 VMware里面设置静态ip上网

1.VMware里面设置网络为桥接模式 2.Ubuntu里面检查网卡名称 [~] ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:…

python图像类型分类汇总

图型所在包样例例图热图seabornimport matplotlib.pyplot as plt import seaborn as sns sns.heatmap(df.isnull()) plt.show() Bitmap Bitmap import numpy as np # 获取数据 fraud data_df[data_df[Class] 1] nonFraud data_df[data_df[Class] 0] # 相关性计算 cor…

Leetcode 404-左叶子之和

题目 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 题解 二叉树的题目&#xff0c;如果需要返回某个值&#xff0c;可以分左右子树递归计算&#xff0c;最后sumleftright 递归三部曲&#xff1a; 确定递归函数的参数和返回值 判断一个树的左叶子节点之和&…

函数式接口实现策略模式

函数式接口实现策略模式 1.案例背景 我们在日常开发中&#xff0c;大多会写if、else if、else 这样的代码&#xff0c;但条件太多时&#xff0c;往往嵌套无数层if else,阅读性很差&#xff0c;比如如下案例&#xff0c;统计学生的数学课程的成绩&#xff1a; 90-100分&#…

微分方程(Blanchard Differential Equations 4th)中文版Section6.1

拉普拉斯变换 积分变换 在本章中&#xff0c;我们研究了一种工具——拉普拉斯变换&#xff0c;用于解微分方程。拉普拉斯变换是众多不同类型的积分变换之一。一般来说&#xff0c;积分变换解决的问题是&#xff1a;一个给定的函数 y ( t ) y(t) y(t) 在多大程度上“像”一个…

温馨网站练习运用

第二次与团队一起制作网页虽然不进行商用&#xff0c;但是练习一下还是好的&#x1f60a;&#x1f60a; 我主要负责后端部分&#xff0c;该项目用了SpringBoot框架、SpringSecurity的安全框架、结合MyBatis-Plus的数据库查询。如果想看看&#xff0c;网站&#xff1a;温馨网登…

Python基础性知识(中部分)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1、Python中的语句1.1 顺序语句1.2 条件语句1.3 循环语句1.3.1 while循环1.3.2 for循环1.3.3 break与continue语句 1.4 综合三大语句制作小游戏--人生重开模拟器…

opencv之形态学

文章目录 1. 什么是形态学2. 形态学操作2.1 腐蚀2.2 膨胀2.3 通用形态学函数2.4 开运算2.5 闭运算2.6 形态学梯度运算2.7 礼帽运算2.8 黑帽运算 1. 什么是形态学 在图像处理领域&#xff0c;形态学是一种基于形状的图像分析技术&#xff0c;用于提取和处理图像的形态特征。这包…

存储架构模式-分片架构和分区架构

分片架构 分片架构就可以解决主从复制存在的问题&#xff0c;如果主机能够承担写的性能&#xff0c;那么主从就够了&#xff0c;如果不能&#xff0c;那么就需要分片架构了。 分片架构设计核心 分片架构设计核心-分片规则 案例1&#xff1a;不合理&#xff0c;因为不同年龄是不…

echarts组件——饼图

echarts组件——饼图 饼图&#xff0c;环形图 组件代码 <template><div :class"classname" :style"{height:height,width:width}" /> </template><script> // 环形图 import * as echarts from echarts require(echarts/them…

计算机毕业设计PySpark+Scrapy农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

(1)能够根据计算机软硬件知识和数学知识给出复杂工程设计的基本思路和解决方案&#xff1b;在考虑社会、健康、安全、法律、文化以及环境等因素下可对设计方案及软硬件系统等在技术、经济等方面进行评价&#xff0c;确认其可行性&#xff1b; (2)能够建立软硬件系统、应用数学、…