18@高可用keepalived

1|0keepalived 高可用

1|1一、什么是高可用

高可用keepalived一般是指两台机器启动,有着完全相同的业务系统,当期中有一台机器down机了,另外一台机器(服务器)就能够快速的接管,维持正常状态进行,对于正在访问的用户是无感知的。

1|2二、高可用keepalived(可以用什么)

1、硬件通常使用 **F5** 2、软件通常使用 **keepalived**

1|3三、keepalived是怎么实现高可用的

keepalived软件是基于VRRP协议来实现的,VRRP是虚拟路由冗余协议,主要用于解决单点故障问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySR9ECEf-1620666487305)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1620660306316.png)]

#VRRP是如何诞生的,原理又是什么 #举例说明 比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办? 通常做法是给路由器增加一台北街店,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。 问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办? 问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以? 其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)
如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3mFCVpk-1620666487308)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1620660354934.png)]

#高可用keepalived核心概念 1、如何确定谁是主节点谁是背节点(选举投票,优先级) 2、如果Master故障,Backup自动接管,那么Master回复后会夺权吗(抢占试、非抢占式) 3、如果两台服务器都认为自己是Master会出现什么问题(脑裂)

1|4四、keepalived 高可用环境配置

1|01.准备环境

主机IP身份
lb01172.15.1.5master
lb02172.15.1.6backup
keepaviled192.168.15.4VIP

1|02.配置nfs挂载点,nginx配置共享目录

#创建挂载点 [root@nfs ~]# vim /etc/exports 172.16.1.0/20(rw,sync,all_squash,anonuid=1000,anongid=1000) #配置文件位置 #挂载 [root@lb01 ~]# mount -t nfs 172.16.1.31:/nfs/keepalived /etc/nginx/conf.d/ # 重启nfs服务 [root@nfs nfs]# systemctl restart nfs-server rpcbind

1|03.安装高可用keepalived(lb01与lb02)

[root@lb01 ~]# yum install -y keepalived [root@lb02 ~]# yum install -y keepalived

1|04.配置nginx配置文件

# 编写NGINX配置文件 [root@lb02 ~]# cat /etc/nginx/conf.d/hzl.conf upstream http { server 172.16.1.7:8081; server 172.16.1.8:8082; server 172.16.1.9:8082; } server { listen 443 ssl; #执行https进行访问 server_name _; ssl_certificate /etc/nginx/cert/server.crt; #认证证书 ssl_certificate_key /etc/nginx/cert/server.key; #认证秘钥 location / { proxy_pass http://hzl; #代理链接池名称 } } server { listen 80; server_name 192.168.15.5; rewrite (.*) https://$server_name$request_uri; #匹配所有格式 } #配置文件检查,重启nginx [root@lb02 ~]#nginx -t [root@lb02 ~]# systemctl restart nginx

1|05.配置keepalived节点

#查看配置keepalived文件 [root@lb01 ~]# rpm -qc keepalived /etc/keepalived/keepalived.conf /etc/sysconfig/keepalived #配置主节点配置文件master [root@lb01 ~]# vim /etc/keepalived/keepalived.conf global_defs { #全局配置 router_id lb01 #身份验证 } vrrp_instance VI_1 { state MASTER #状态,只有MASTER和BACKUP,MASTER是主,BACKUP是备 interface eth0 #网卡绑定,心跳检测 virtual_router_id 51 #虚拟路由标识,组id,把master和backup判断为一组 priority 100 #优先级(真正判断是主是从的条件)(值越大优先级越高) advert_int 3 #检测状态间隔时间(单位是秒) # nopreempt #表示非抢占式 authentication { #认证 auth_type PASS #认证方式 auth_pass 1314 #认证密码指定 } virtual_ipaddress { 192.168.15.4 #虚拟的VIP地址 } } #配置从节点配置文件backup [root@lb02 ~]# vim /etc/keepalived/keepalived.conf global_defs { #全局配置 router_id lb02 #标识身份->名称 } vrrp_instance VI_1 { state BACKUP #标识角色状态 interface eth0 #网卡绑定接口 virtual_router_id 51 #虚拟路由id priority 50 #优先级 advert_int 3 #监测间隔时间 # nopreempt authentication { #认证 auth_type PASS #认证方式 auth_pass 1314 #认证密码 } virtual_ipaddress { 192.168.15.4 #虚拟的VIP地址 } } #域名解析(测试访问) 192.168.15.4 www.linux.lb.com

1|06.配置区别

KEEPALIVED配置区别MASTER主节点BACKUP从节点
router_id(路由唯一标识)lb01lb02
state(角色状态)masterbackup
priority(优先级设定)10050

1|07.启动keepalived

#启动时查看日志 [root@lb02 ~]# tail -f /var/log/messages #先启动从 [root@lb02 ~]# systemctl start keepalived #启动时查看日志 [root@lb01 ~]# tail -f /var/log/messages #再启动主 [root@lb01 ~]# systemctl start keepalived

1|08.配置keepalived日志

一、修改 /etc/sysconfig/keepalived 把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -d -S 0" #其中-S指定syslog的facility 二、重启keepalived服务 [root@lb01 ~]#service keepalived restart [root@lb01 ~]#systemctl restart keepalived 三、设置syslog,修改/etc/syslog.conf,添加内容如下 # keepalived -S 0 local0.* /var/log/keepalived.log 注:local0是l是字符L的小写

1|5五、高可用keepalived (抢占式与非抢占式)

1|01、节点启动

#当两个节点都启动时 #由于节点的优先级高于节点backup,所以VIP在节点master上面 [root@lb01 ~]# ip a | grep 192.168.15.4 #master接管(主节点) inet 192.168.15.4 scope global eth0 #停止master主节点的keepalived [root@lb01 ~]# systemctl stop keepalived #节点backup检测不到节点master的心跳,主动接管VIP [root@lb02 ~]# ip a | grep 192.168.15.4 #backup接管(从节点) inet 192.168.15.4/24 scope global eth0 #重新启动master主节点 [root@lb01 ~]# systemctl start keepalived [root@lb01 ~]# ip a | grep 192.168.15.4 #master接管,恢复之前状态 inet 192.168.15.4/24 scope global eth0

1|02、配置非抢占式nopreempt

1.修改节点状态,两边状态都必须是**backup** 2.两个节点都要加上 **nopreempt** 3.优先级仍保持不同 #注节点配置master lobal_defs { router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 3 ***nopreempt*** authentication { auth_type PASS auth_pass 1314 } virtual_ipaddress { 192.168.15.4 } } #从节点配置backup lobal_defs { router_id lb02 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 50 advert_int 3 ***nopreempt*** authentication { auth_type PASS auth_pass 1314 } virtual_ipaddress { 192.168.15.4 } }

1|03、通过windows验证mac地址切换

#查看VIP在节master上面 [root@lb01 ~]# ip a | grep 192.168.15.4 inet 192.168.15.4/24 scope global eth0 #windows查看mac地址 C:\Users\admin> arp -a #将节点master的keepalived停止 [root@lb01 ~]# systemctl stop keepalived #节点backup查看VIP [root@lb02 ~]# ip a | grep 192.168.15.4 inet 192.168.15.4/24 scope global eth0 #再次查看MAC地址 C:\Users\admin> arp -a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KF5FeDKj-1620666487312)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1620666393395.png)]

1|04、测试访问

#配置本地hosts 192.168.15.4 www.linux.lb.com

1|6六、高可用keepalived(脑裂)

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方是否存活,各自去调用资源,分配工作,而此时两台服务器都还活着并且在工作。

1|01、脑裂的故障

1.服务器网线松动,网络故障 2.服务器硬件发生损坏,硬件故障 3.主备服务器之间开启了防火墙

1|02.开启防火墙(两台)

[root@lb01 ~]# systemctl start firewalld [root@lb02 ~]# systemctl start firewalld

1|03、访问页面测试

#访问浏览器因为开启防火墙,所以访问不了站点,需要配置开启http服务 [root@lb02 ~]# firewall-cmd --add-service=http [root@lb02 ~]# firewall-cmd --add-service=https

1|04、解决脑裂

#脑裂解决案列一: #干掉一台服务 [root@lb02 ~]# systemctl stop keepalived #检测(判断是否有脑裂现象) #先做信任,免密登录 [root@lb01 ~]# ssh-keygen #生成秘钥 [root@lb01 ~]# sh-copy-id 172.16.1.6 #编写脚本 [root@lb01 ~]# vim check_naolie.sh #!/bin/sh vip=192.168.15.4 lb02_ip=172.16.1.6 while true;do ssh $lb02_ip 'ip a | grep 192.168.15.4' &>/dev/null if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then echo "ha is split brain.warning." else echo "ha is ok" fi sleep 3 done #脚本添加执行权限 [root@lb01 ~]# chmod +x check_naolie.sh #脑裂解决案列二: #开启防火墙 [root@lb01 ~]# systemctl start firewalld [root@lb02 ~]# systemctl start firewalld # 当主节点和从节点都提供服务的时候(脚本探测) # 做免密 [root@lb01 ~]# ssh-keygen #生成秘钥 [root@lb01 ~]# sh-copy-id 172.16.1.6 [root@lb02 ~]# sh-copy-id 172.16.1.5 #脚本编写 [root@lb02 ~]# vim check_naolie.sh #!/bin/bash VIP="192.168.15.4" MASTERIP="172.16.1.6" BACKUPIP="172.16.1.5" while true; do #循环脚本 # 探测VIP PROBE='ip a | grep "${VIP}"' ssh ${MASTERIP} "${PROBE}" > /dev/null MASTER_STATU=$? ssh ${BACKUPIP} "${PROBE}" > /dev/null BACKUP_STATU=$? if [[ $MASTER_STATU -eq 0 && $BACKUP_STATU -eq 0 ]];then ssh ${BACKUPIP} "systemctl stop keepalived.service" fi sleep 3 done #脚本添加执行权限 [root@lb01 ~]# chmod +x check_naolie.sh #引用补充: -eq 等于 -ne 不等于 -ge 大于等于 -gt 大于 -le 小于等于 -lt 小于

1|7七、高可用keepalived和nginx

1|01.域名解析到VIP

1.nginx默认监听所有IP

1|02.nginx故障切换脚本

#如果nginx宕机,用户请求页面会失败,但是keepalive没有关闭,VIP仍然在nginx挂掉了的机器上,导致影响业务; #我们应该编写一个脚本,判断nginx状态,如果nginx挂掉,先尝试重启nginx,如果启动不了则关掉keepalived # nginx检测脚本一 [root@lb01 ~]# vim /etc/keepalived/check_web.sh #!/bin/bash ps -ef | grep [n]ginx &>/dev/null if [ $? -eq 1 ];then systemctl start nginx &>/dev/null sleep 3 ps -ef | grep [n]ginx &>/dev/null if [ $? -eq 1 ];then systemctl stop keepalived fi fi #脚本优化: [root@lb01 ~]# vim /etc/keepalived/check_web.sh #!/bin/sh nginxpid=$(ps -C nginx --no-header|wc -l) 1#判断Nginx是否存活,如果不存活则尝试启动Nginx if [ $nginxpid -eq 0 ];then systemctl start nginx sleep 3 2#等待3秒后再次获取一次Nginx状态 nginxpid=$(ps -C nginx --no-header|wc -l) 3#再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本 if [ $nginxpid -eq 0 ];then systemctl stop keepalived fi fi [root@lb01 keepalived]# chmod +x check_web.sh # nginx检测脚本二 [root@lb01 ~]# vim /etc/keepalived/check_web.sh #!/bin/bash nginxnum=`ps -ef | grep [n]ginx | wc -l` if [ $nginxnum -eq 0 ];then systemctl start nginx sleep 3 nginxnum=`ps -ef | grep [n]ginx | wc -l` if [ $nginxnum -eq 0 ];then systemctl stop keepalived.service fi fi #脚本添加权限 [root@lb01 keepalived]# chmod +x check_web.sh

1|03.调用脚本

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf global_defs { router_id lb01 } #每5秒执行一次脚本,脚本执行完成时间不能超过5秒,否则会重新执行脚本,死循环 vrrp_script check_web { script "/etc/keepalived/check_web.sh" interval 5 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1314 } virtual_ipaddress { 192.168.15.4 } #调用计划脚本 track_script { check_web } } #给脚本添加权限 [root@lb01 keepalived]# chmod +x check_web.sh #使用测试访问 192.168.15.4 www.linux.lb.com

__EOF__

本文作者ଲ小何才露煎煎饺
本文链接https://www.cnblogs.com/zeny/p/15121562.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ଲ小何才露煎煎饺  阅读(85)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示