keepalived+nginx双主热备(有问题私信)

keepalived+nginx双主热备

  • 前言
  • keepalived+nginx双主热备
    • keepalived+nginx双主热备部署
      • 安装nginx
      • 安装keepalived
        • 修改master节点的keepalived配置文件
      • 修改backup节点的keeepalived配置文件
      • 配置keepalived主备
      • 配置keepalived双主热备

前言

有关keepalived和nginx的一些工作原理,简介等相关信息这里就不过多赘述了,有不了不太清楚或者不太了解的朋友可以参考我之前的文章
keepalived相关内容
nginx相关内容01
nginx相关内容02

keepalived+nginx双主热备

在配置双主热备之前,最好先弄明白双机主备
环境说明

系统版本软件版本IP地址
centos7.9keepalived-2.2.7版本 nginx-1.20.1版本192.168.182.130(master)
centos7.9keepalived-2.2.7版本 nginx-1.20.1版本192.168.182.131(backup)

keepalived官网下载地址
nginx官网下载地址

keepalived+nginx双主热备部署

安装nginx

以下操做两台主机都做

[root@130 opt]# pwd
/opt
[root@130 opt]# ls
nginx-1.20.1.tar.gz[root@130 opt]# tar zxf nginx-1.20.1.tar.gz
// 进入解压目录
[root@130 opt]# cd nginx-1.20.1/
[root@130 nginx-1.20.1]# ./configure --with-http_ssl_module  //开始编译
说明一下不加“--prefix=“ nginx会默认安装在/usr/local目录下./configure: error: C compiler cc is not found  //第一个报错
[root@130 nginx-1.20.1]# yum -y install gcc  //解决./configure: error: the HTTP rewrite module requires the PCRE library  //第二个报错
[root@130 nginx-1.20.1]# yum -y install pcre pcre-devel  //解决./configure: error: SSL modules require the OpenSSL library.  //第三个报错
[root@130 nginx-1.20.1]# yum -y install openssl openssl-devel  //解决
[root@130 nginx-1.20.1]# make && make install  //执行完成之后遍安装完成

配置nginx环境,方便使用nginx的二进制命令

[root@130 ~]# echo 'export PATH=$PATH:/usr/local/nginx/sbin' > /etc/profile.d/nginx.sh
[root@130 ~]# source /etc/profile.d/nginx.sh
// 执行完上面的命令后就不需要到sbin目录下执行nginx的二进制命令了

使用systemctl控制nginx

[root@130 ~]# cat > /usr/lib/systemd/system/nginx.service  <<EOF
[Unit]
Description=Nginx server daemon
After=network.target sshd-keygen.service[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s quit
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target
EOF[root@130 ~]# systemctl daemon-reload
[root@130 ~]# systemctl start nginx
[root@130 ~]# systemctl enable nginx.service

//此处为master节点nginx

// 此处为backup节点的nginx

安装keepalived

以下操作同样也需要在两台主机上执行

[root@130 opt]# tar zxf keepalived-2.2.7.tar.gz
[root@130 opt]# cd keepalived-2.2.7/
[root@130 keepalived-2.2.7]# ./configure --prefix=/usr/local/keepalived --sysconf=/etc  //咱们安装在/usr/local命令下,不加--sysconf=/etc可能会报错//第一次编译会出现警告信息,但其实不影响,强迫症患者会不舒服
*** WARNING  this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS  [root@130 keepalived-2.2.7]# yum -y install libnl libnl-devel  //解决
[root@130 keepalived-2.2.7]# make && make install  //进行安装

配置keepalived环境变量

[root@130 ~]# echo 'export PATH=$PATH:/usr/local/keepalived/sbin' > /etc/profile.d/keepalived.sh
[root@130 ~]# source /etc/profile.d/keepalived.sh

生成keeepalived配置文件

[root@130 keepalived]# pwd
/etc/keepalived
[root@130 keepalived]# cp keepalived.conf.sample keepalived.conf
修改master节点的keepalived配置文件
[root@130 keepalived]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id HA01  //此处的id要全局唯一
}vrrp_instance VI_1 {state MASTER  //因为130为master所以状态为masterinterface ens33  //此处根据你的网卡名称变化而变化virtual_router_id 51  //虚拟路由id,在同一组中此处保持一致,也就是主备节点都需要一样priority 100  //优先级advert_int 1  //主备间心跳检测间隔为1秒authentication {  //认证授权的账号和密码auth_type PASSauth_pass 1111}virtual_ipaddress {  //此处为虚拟VIP地址192.168.182.100}
}

使用systemctl控制keepalived

[root@130 keepalived]# vim /usr/lib/systemd/system/keepalived.service //修改service文件
[Unit]
Description=keepalived
After=network-online.target syslog.target [Service]
Type=forking
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived  $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target[root@130 keepalived]# systemctl daemon-reload
[root@130 keepalived]# systemctl start keepalived
[root@130 keepalived]# systemctl enable keepalived.service

修改backup节点的keeepalived配置文件

[root@131 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id HA02
}vrrp_instance VI_1 {state BACKUP  //备用节点改为backupinterface ens33virtual_router_id 51priority 90  //备用节点的优先级要小于主节点advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.182.100}
}

使用systemctl控制keepalived

[root@131 ~]# vim /usr/lib/systemd/system/keepalived.service
[Unit]
Description=keepalived
After=network-online.target syslog.target [Service]
Type=forking
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived  $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID[Install]
WantedBy=multi-user.target[root@131 ~]# systemctl daemon-reload
[root@131 ~]# systemctl start keepalived
[root@131 ~]# systemctl enable keepalived

配置keepalived主备

注意:VIP为192.168.182.100

我们知道此实验的目的是为让nginx能7×24小时的工作,保证用户能正常访问,所以接下来需要编写脚本让keepalived来监听并自动运行此脚本

下面的操作均在master上进行

[root@130 keepalived]# pwd
/etc/keepalived
[root@130 keepalived]# touch check-nginx.sh
[root@130 keepalived]# chmod +x check-nginx.sh
[root@130 keepalived]# vim check-nginx.sh
#!/bin/bash
process=`ps -C nginx | grep -vc PID`  //获取nginx的进程数
if [ $process -eq 0 ];then  //等于0就说明nginx挂了,先尝试启动nginx,然后等待3秒systemctl start nginxsleep 3
elif [ $process -eq 0 ];then  //如果nginx启动不了,说明出现问题了,所以需要将服务转到备用节点上systemctl stop keepalived
fi

// 将上面的脚本加入到keepalived的配置文件中

! Configuration File for keepalivedglobal_defs {router_id HA01
}vrrp_script nginx-check {script "/etc/keepalived/check-nginx.sh"  //此处写咱们脚本的绝对路径interval 2  //每隔两秒执行此脚本weight 10  //执行脚本成功此节点的优先级+10;若写成weight -10,则反之。
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {nginx-check  //追踪咱们上面的脚本
}virtual_ipaddress {192.168.182.100}
}[root@130 keepalived]# systemctl restart keepalived.service

若关闭master上的nginx,keeepalived检测到之后会在3秒内启动nginx,这里我就不做演示了。

从下图可以看到访问VIP时为master上的nginx

下面我们模拟故障情况,假设nginx挂点了,然后我们关闭keepalived,看是否能跳转到backup上

[root@130 keepalived]# systemctl stop keepalived.service //关闭

// 跳转成功

下面的操作在backup上进行

[root@131 keepalived]# pwd
/etc/keepalived
[root@131 keepalived]# touch check_nginx.sh
[root@131 keepalived]# chmod +x check_nginx.sh
[root@131 keepalived]# cat check_nginx.sh 
#!/bin/bash
process=`ps -C nginx --no-header | wc -l`
if [ $process -eq 0 ];thensystemctl start nginxsleep 3
elif [ $process -eq 0 ];thensystemctl stop keepalived.service
fi[root@131 keepalived]# vim keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id HA02
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"weight 10interval 2
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {check_nginx
}virtual_ipaddress {192.168.182.100}
}

配置keepalived双主热备

  • 看咱们上面的主备配置都是master在提供服务只有当master宕机时backup才会接管进行工作,所以这就会导致有一台主机就会处于闲置状态
  • 双主就是两台主机都提供服务,当master上nginx宕机后,keepalived也会停掉,这时master上的VIP时便跳转到backup,而当backup节点挂掉时backup便会将请求转到master上,看下面的示例演示

在master节点上配置

[root@130 keepalived]# vim keepalived.conf  //在配置文件最后一行添加下面内容
vrrp_instance VI_2 {  //因为这是第二组,又因为这里需要全局唯一所以不能与上面的 VI_1一致state BACKUP  //因为双主的话,master和backup都是对方的master,上面第一组时master是backup的主,所以现在master应该为backu的备interface ens33virtual_router_id 52  //此处同一节点需保持一致,所以要修改为52priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}
virtual_ipaddress {192.168.182.101  //因为是新的一组主备,所以需要再添加一个VIP}
}[root@130 keepalived]# systemctl restart keepalived.service
[root@131 keepalived]# pwd
/etc/keepalived
[root@131 keepalived]# vim keepalived.conf  //也是在配置文件的最后一行添加下面内容
vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}
virtual_ipaddress {192.168.182.101}
}[root@131 keepalived]# systemctl restart keepalived.service

//访问第二组的VIP能正常访问nginx02

//这里我们关闭master节点上的keepalived

[root@130 keepalived]# systemctl stop keepalived.service

//这里发现第一组的VIP100也可以访问到nginx02,反之若backup上的keepalived挂掉,能访问到nginx01,至此双主热备成功。

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

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

相关文章

【论文笔记】《Learning Deconvolution Network for Semantic Segmentation》

重要说明&#xff1a;严格来说&#xff0c;论文所指的反卷积并不是真正的 deconvolution network 。 关于 deconvolution network 的详细介绍&#xff0c;请参考另一篇博客&#xff1a;什么是Deconvolutional Network&#xff1f; 一、参考资料 Learning Deconvolution Netwo…

【Leetcode】2861. 最大合金数

文章目录 题目思路代码结果 题目 题目链接 假设你是一家合金制造公司的老板&#xff0c;你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用&#xff0c;并且你可以使用 k 台机器来制造合金。每台机器都需要特定数量的每种金属来创建合金。 对于第 i 台…

【word visio绘图】关闭visio两线交叉的跳线(跨线)

【visio绘图】关闭visio两线交叉的跳线&#xff08;跨线&#xff09; 1 如何在Visio绘图中关闭visio两线交叉的跳线&#xff08;跨线&#xff09;第一步&#xff1a;打开Visio并创建您的图形第二步&#xff1a;绘制您的连接线第三步&#xff1a;关闭跳线第四步&#xff1a;手动…

dnSpy调试工具二次开发2-输出日志到控制台

本文在上一篇文章的基础上继续操作&#xff1a; dnSpy调试工具二次开发1-新增菜单-CSDN博客 经过阅读dnSpy的源码&#xff0c;发现dnSpy使用到的依赖注入用了MEF框架&#xff0c;所以在源码中可以看到接口服务类的上面都打上了Export的特性或在构造方法上面打上ImportingConst…

C/C++ - 类的封装特性

目录 类的封装 语法格式 声明定义 分文件 访问权限 类作用域 对象模型 构造函数 默认构造函数 带参构造函数 拷贝构造函数 构造函数重载 委托构造函数 初始数据列表 构造默认参数 构造函数删除 析构函数 析构函数概念 析构函数特性 析构函数示例 析构调用…

坚持刷题 | 平衡二叉树

文章目录 题目考察点代码实现实现总结对实现进一步改进扩展提问 坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天继续二叉树&#xff1a;平衡二叉树 题目 110.平衡二叉树 考察点 递归能力&#xff1a; 能否使用递归来解决问题。树的基本操作&#xff1a;能否正确地访…

DS:带头双向循环链表的实现(超详细!!)

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01;&#xff01; 博主的上篇文章介绍了链表&#xff0c;以及单链表的实现。 单链表的实现&#xff08;超详细&#xff01;&#xff01;&#xff09; 其实单链表的全称叫做不带头单向不循环链表&#xff0c;本文…

zabbix使用自动发现批量监控服务器

当有大量新增服务器需要监控时&#xff0c;为避免一台一台手动操作浪费人力&#xff0c;我们使用自动发现功能来进行操作&#xff1a; 以下以zabbix6.4.0版本为例 如下,点击自动发现&#xff0c;创建发现规则&#xff1a; 点击更新&#xff0c;保存&#xff0c;之后点告警---…

在 React 组件中使用 JSON 数据文件,怎么去读取请求数据呢?

要在 React 组件中使用 JSON 数据&#xff0c;有多种方法。 常用的有以下几种方法&#xff1a; 1、直接将 JSON 数据作为一个变量或常量引入组件中。 import jsonData from ./data.json;function MyComponent() {return (<div><h1>{jsonData.title}</h1>&…

node.js Redis SETNX命令实现分布式锁解决超卖/定时任务重复执行问题

Redis SETNX 特性 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中&#xff0c;我将使用键“lock:tcaccount_[pk]”和“status:tcaccount_[pk]”分别表示锁定键和状态键。 获…

AAC解码算法原理

关于更多音视频开发内容&#xff0c;请参考专栏音视频开发 AAC&#xff08;Advanced Audio Coding&#xff09;是一种高级音频编码标准&#xff0c;它是一种十分流行的音频压缩格式&#xff0c;通常用于存储和传输音频数据。AAC提供了高音质和高压缩效率&#xff0c;广泛应用于…

Android源码设计模式解析与实战第2版笔记(四)

第三章 自由扩展你的项目–Builder 模式 Builder 模式的定义 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 Builder 模式的使用场景 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时 多个部件或零件&…

Android 基础技术——Handler

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Handler 为什么一个线程对应一个Looper&#xff1f; 核心&#xff1a;通过ThreadLocal保证 Looper.prepare的时候&#xff0c;ThreadLocal.get如果不空报异常&#xff1b;否则调用ThreadLocal.set,…

Cesium渲染白膜数据

async DrawBaiMoFun2() {// tiles 矩阵变换let changePostion = (tileSet, tx, ty, tz, rx, ry, rz, scale, center) => {if (!center) return;const m = Cesium.Transforms.eastNorthUpToFixedFrame(center);const surface =center ||Cesium.Cartesian3.fromRadians(cartog…

自动驾驶代客泊车AVP决策规划详细设计

背景 随着产品的不断迭代&#xff0c;外部停车场的铺开&#xff0c;PAVP车辆需要应对的场景将越来越复杂&#xff0c;因此整体算法泛化能力的提升显得尤为关键。为了打磨巡航规划的能力&#xff0c;算法架构应当设计的更为灵活&#xff0c;可以针对使用场景迁入更为先进有效的算…

【Linux】分区向左扩容的方法

文章目录 为什么是向左扩容操作前的备份方法&#xff1a;启动盘试用Ubuntu后进行操作 为什么是向左扩容 Linux向右扩容非常简单&#xff0c;无论是系统自带的disks工具还是apt安装的gparted工具&#xff0c;都有图像化的界面可以操作。但是&#xff0c;都不支持向左扩容。笔者…

01 Redis的特性+下载安装启动+Redis自动启动+客户端连接

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…

免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理

1、TVbox下载地址、影视接口、配置教程 下载地址 TVbox TVbox可用接口地址合集 注&#xff1a;接口均来源于互联网收集分享&#xff01;所有接口都是经过测试的&#xff0c;如果出现加载失败等情况&#xff0c;可能是因为接口针对的盒子有兼容问题&#xff0c;可以多试试几…

Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等

1.查看被占用的端口的进程&#xff0c;netstat/ss -antulp | grep :端口号 2.通过上面的命令就可以列出&#xff0c;这个端口被哪些应用程序所占用&#xff0c;然后找到对应的进程PID https://img-blog.csdnimg.cn/c375eb2bed754426b373907acaa7346e.png 3.根据PID查询进程。…

isctf---web

圣杯战争 php反序列 ?payloadO:6:"summon":2:{s:5:"Saber";O:8:"artifact":2:{s:10:"excalibuer";O:7:"prepare":1:{s:7:"release";O:5:"saber":1:{s:6:"weapon";s:52:"php://filter…