Nginx+Keepalived高可用集群

news2024/9/24 17:14:49

Nginx+Keepalived高可用集群


服务器准备

服务器名IP软件包主从
n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTER
n2RIP192.168.99.122 VIP 192.168.99.200nginx keepalived
h1RIP 192.168.99.133 VIP 192.168.99.200httpd
h2RIP 192.168.32.144 VIP 192.168.99.200httpd

安装部署

n1

#下载nginx、keepalived
#关闭防火墙

yum install -y epel-release && yum install -y nginx keepalived
systemctl stop firewalld && setenforce 0
vim /etc/nginx/nginx.conf

添加负载均衡策略

#在http下建立
upstream httpd {
server 192.168.99.133:80 weight=1;
server 192.168.99.144:80 weight=1;
}
#在server下建立
location / {
proxy_pass http://httpd;
}

#重启nginx
systemctl start nginx
keepalived配置

keepalived配置文件基础配置
此配置为主备模式,先理解主备后,在配置双主模式更简单。

配置文件位置:/etc/keepalived/keepalived.conf
打开也许会很懵,其实用不了太多模块,先备份原配置,然后删掉其他留下最基础的配置(配置全部参数说明参考本文最后)。

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf

基础三个模块,global_defs全局模块,vrrp_instance配置vip模块,vrrp_script 脚本模块,用来检测nginx服务。
注:vrrp_script定义脚本后,在vrrp_instance模块必须加上track_script 参数。我就入了这个坑,导致脚本不生效。

global_defs模块参数

notification_email : keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到。
vrrp_instance模块参数

state : 指定instance(Initial)的初始状态, MASTER 或者BACKUP,不是唯一性的,跟后面的优先级priority参数有关。
interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,(注意自己系统,我的默认是ens33,有的是eth0)
mcast_src_ip : 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id : 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority: 设置本节点的优先级,优先级高的为master(1-255)
advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
authentication : 定义认证方式和密码,主从必须一样
virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
track_script: 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
vrrp_script模块参数
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script

script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx
interval 2: 每2s检测一次
weight -5 : 检测失败(脚本返回非0)则优先级 -5
fall 2: 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 : 检测 1 次成功就算成功。但不修改优先级

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id xczngnix1
}
vrrp_script chk_nginx {
    script "/etc/keepalived/ncheck.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    mcast_src_ip 192.168.99.111
    priority 100

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.99.200
    }
}

创建虚拟IP

cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33:0"
#UUID="fd6ca2fc-2bc6-4fc4-8bc9-5d8b0a279aca"
DEVICE="ens33:0"
ONBOOT="yes"
IPADDR=192.168.99.200
NETMASK=255.255.255.255
systemctl restart network
ip a

nginx测试脚本

# 两台虚拟机都需要监控脚本
vim /etc/keepalived/ncheck.sh
#!/bin/bash
curl 127.0.0.1:80 &> /dev/null
if [ $? -ne 0 ]
	then systemctl stop keepalived
fi
chmod +x /etc/keepalived/ncheck.sh

n2操作与n1不同点

配置文件

! Configuration File for keepalived
global_defs {
    router_id xczngnix2
}
vrrp_script chk_nginx {
    script "/etc/keepalived/ncheck.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    mcast_src_ip 192.168.99.122
    priority 95

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.99.200
    }
}

两台httpd服务器

yum -y install httpd
systemctl stop firewalld && setenforce 0

创建虚拟IP

cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33:0"
#UUID="fd6ca2fc-2bc6-4fc4-8bc9-5d8b0a279aca"
DEVICE="ens33:0"
ONBOOT="yes"
IPADDR=192.168.99.200
NETMASK=255.255.255.255
systemctl restart network
ip a

web1

echo 'web1' > /var/www/html/index.html

web2

echo 'web2' > /var/www/html/index.html
systemctl start httpd

浏览器测试

ip a查看两台虚拟机ip信息,发现只有111有VIP
在这里插入图片描述

192.168.99.200
在这里插入图片描述
手动关闭111的nginx,再查看keepalived状态为关闭,ip a查看VIP漂移到122上
在这里插入图片描述
按顺序开启111的nginx和keepalived,在宿主机访问VIP的nginx结果为web1,ip a发现VIP漂移回111
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

2024江苏省赛 H. 完蛋,我被房产包围了 【费用流、分时图】

完蛋,我被房产包围了 n ≤ 200 , ∑ n ≤ 1 0 4 n \leq 200, \sum n \leq 10^4 n≤200,∑n≤104 求出最大利润 思路 每个代理商每次买房狂潮只能卖出 1 1 1 套房子,小红卖出一套房子贬值 1 1 1 元,小绿卖出一套房子贬值 ⌈ a i 10 ⌉ \…

短视频世上无人再似她:成都鼎茂宏升文化传媒公司

短视频世上无人再似她 —— 记忆中的光影传奇 在短视频盛行的今天,每一位创作者都在用镜头捕捉生活,记录世界,但有那么一位艺术家,她的作品如同夜空中最亮的星,即便是在信息洪流中,也依然闪耀着独一无二的…

数字社交的先锋:探索Facebook的未来发展

在当今数字化时代,社交媒体已经成为人们日常生活中不可或缺的一部分。而在众多社交平台中,Facebook一直处于引领地位,不断探索和创新,塑造着数字社交的未来。本文将深入探讨Facebook作为数字社交的先锋,探索其未来发展…

天锐绿盾和bitlocker有啥区别?

#绿盾文档加密系统# 天锐绿盾和BitLocker是两种不同的数据加密解决方案,它们各自有不同的重点和应用场景,以下是它们之间的主要区别: PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 移动…

华为hcip是什么?华为hcip网络工程师值得考吗?

前面我们讲了华为认证各个方向hcie的内容,那么很多同学会问,华为hcip是什么?华为hcip网络工程师值得考吗? 华为HCIP是什么? 华为HCIP(Huawei Certified ICT Professional)认证是华为技术有限公…

这三个网站我愿称之为制作答辩PPT的神

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

Leetcode—3146. 两个字符串的排列差【简单】

2024每日刷题&#xff08;135&#xff09; Leetcode—3146. 两个字符串的排列差 实现代码 class Solution { public:int findPermutationDifference(string s, string t) {int maps[26];int mapt[26];for(int i 0; i < s.size(); i) {int idxs s[i] - a;int idxt t[i] …

精酿啤酒的未来:啤酒的发展与展望

随着人们生活水平的提高和对品质生活的追求&#xff0c;精酿啤酒逐渐受到了广泛的关注和喜爱。作为精酿啤酒的代表&#xff0c;Fendi club啤酒凭借其与众不同的酿造工艺与技术&#xff0c;逐渐在市场中树立了良好的口碑。然而&#xff0c;面对未来激烈的竞争和不断变化的市场需…

摸鱼大数据——Linux搭建大数据环境(安装zooKeeper和zookeeper shell命令)五

安装zookeeper软件 1.上传软件 使用CRT等客户端远程上传 zookeeper-3.4.6.tar.gz 文件到/export/software目录下 2.解压软件 [rootnode1 ~]# cd /export/software/ [rootnode1 software]# tar -xzvf zookeeper-3.4.6.tar.gz -C /export/server/ [rootnode1 software]# cd /ex…

CentOS上Zookeeper集群安装部署

简介 Zookeeper是一款分布式的集群化软件&#xff0c;可以在多台服务器上部署&#xff0c;并协同组成分布式集群一起工作。 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的…

若依cloud-plus(RuoYi-Cloud-Plus)框架(后端)分析

文章目录 本文以mysql为例项目结构图环境(最起码的配置)数据库初始化文件位置配置服务启动架构图框架分析&#xff1a; 本文以mysql为例 官方文档&#xff1a; https://plus-doc.dromara.org/#/ruoyi-cloud-plus/home 项目结构图 RuoYi-Cloud-Plus ├─ ruoyi-api …

霸道龙尊短视频:成都鼎茂宏升文化传媒公司

霸道龙尊短视频&#xff1a;龙族的传奇与现代的交融 在数字化时代的浪潮中&#xff0c;短视频以其短小精悍、内容丰富的特点&#xff0c;迅速占领了人们的碎片时间。成都鼎茂宏升文化传媒公司而在这些短视频中&#xff0c;一股独特的“霸道龙尊”风潮正在悄然兴起&#xff0c;…

JavaScript基础(七)

isNaN //用来判断一个变量是不是一个非数字 不是来判断是不是number类型&#xff0c;而是判断当前值能不能转为number类型&#xff0c;OK&#xff1f;懂了。 还有同学不明白&#xff0c;来看实例: <script> //isNaN(非数字)→true &#xff08;数字&#xff09;→fal…

实战| 手把手教你实现俯卧撑实时计数:OpenCV+MediaPipe

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

No Cortex-M SW Device Found

将DIO和CLK管脚调换一下

从0到1,百亿级任务调度平台的架构与实现

尼恩&#xff1a;百亿级海量任务调度平台起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

深度学习面试问题 | 降维

本文给大家带来的百面算法工程师是深度学习降维面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&#…

免费/低价服务资源的使用经验谈

互联网之所以吸引人的其中一个原因就是“免费”&#xff0c;不过免费却不好用的话&#xff0c;我想也不入多数人的法眼。如果可以给予少量的费用却有不错的服务资源&#xff0c;那么也是最好不过的事情。现在就让我们看看互联网有哪些免费或者低价的开发服务器资源。 首先列出…

C++自定义脚本文件执行

FunctionCall.h&#xff1a; #include <sstream> #include <string> #include <vector> // 函数调用 class FunctionCall { public: FunctionCall(); ~FunctionCall(); std::string call(const st…

MySQL数据库从入门到精通(下)

对表做了修改之后&#xff0c;记得点击对应图标按钮重新执行一下。 1.创建角色表 数据库一开始就要设计好&#xff0c;轻易不要改动。一个账号下可能有多个角色&#xff0c;所以我们单独再创建另一个表role用来存储所有的角色信息。其中idrole表示角色id&#xff0c;name表示名…