当前位置: 首页 > news >正文

从零到一使用开源Keepalived配置实现高可用的集群教程

一、Keepalived实现高可用集群——抢占式

        Keepalived提供了vrrp_script、notify_master、notify_backup等多个功能模块,通过这些模块可以实现对集群资源的托管以及集群服务的监控。

        在默认情况下,Keepalived可以实现对系统死机、网络异常及Keepalived本身进行监控,也就是说当系统出现死机、网络出现故障或Keepalived进程异常时,Keepalived会进行主备节点的切换。但这些还是不够的,因为集群中运行的服务也随时可能出现问题,因此,还需要对集群中运行服务的状态进行监控,当服务出现问题时也进行主备切换。Keepalived作为一个优秀的高可用集群软件,也考虑到了这一点,它提供了一个【vrrp_script】模块专门用来对集群中服务资源进行监控下面将通过使用keepalived配置一套基于HTTPD的高可用集群系统来实际演示一下Keepalived高可用集群的实操流程:

 1.1、应用环境说明

应用环境说明
序号应用环境说明
1两台物理机或虚拟机,使⽤RHEL9/Almalinux9.1及其更高系统(192.168.1.9、192.168.1.36)
2在服务器上安装部署Keepalived-2.3.4
3

两台服务器都安装上Apache的Web服务

#服务器快捷安装Apache Web服务流程#1-快捷安装Apache Web服务
yum install httpd -y#2-启动Apache Web服务
systemctl start httpd
systemctl status httpd#3-进入httpd的默认网站目录(/var/www/html/)创建一个名为index.html的文件
#(且直接将该文件的内容设置为该服务器的IP地址)
#【Apache的默认配置路径是(/etc/httpd);默认配置文件是(/etc/httpd/conf/httpd.conf)】
cd /var/www/html/
vi index.html#4-永久放开服务器的80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

 1.2、keepalived实现http高可用配置实操

        我们先在【192.168.1.9】服务器上配置,让后再将配置好的内容复制一份传输到另外一台服务器【192.168.1.36】上修改即可,详细的操作流程如下:

#在【192.168.1.9】服务器上配置keepalived的主节点实现http高可用操作流程#1-进入服务器的keepalived的配置路径
cd /etc/keepalived#2-分别在服务器keepalived的默认配置路径【/etc/keepalived/】下创建keepalived的进入master、backup、fault状态的脚本,用来感知状态的自动切换情况
#2.1-在服务器keepalived的默认配置路径【/etc/keepalived/】下创建并编辑【master.sh】脚本及其脚本的内容
vi /etc/keepalived/master.sh#!/bin/bash
LOGFILE=/var/log/keepalived-http-state.log
echo "[Master]" >> $LOGFILE
date >> $LOGFILE#2.2-在服务器keepalived的默认配置路径【/etc/keepalived/】下创建并编辑【backup.sh】脚本及其脚本的内容
vi /etc/keepalived/backup.sh#!bin/bash
LOGFILE=/var/log/keepalived-http-state.log
echo "[Backup]" >> $LOGFILE
date >> $LOGFILE#2.3-在服务器keepalived的默认配置路径【/etc/keepalived/】下创建并编辑【fault.sh】脚本及其脚本的内容
vi /etc/keepalived/fault.sh#!bin/bash
LOGFILE=/var/log/keepalived-http-state.log
echo "[Fault]" >> $LOGFILE
date >> $LOGFILE#3-分别将创建好的master.sh、backup.sh、fault.sh文件的权限都修改为755
chmod 755 master.sh
chmod 755 backup.sh
chmod 755 fault.sh#4-编辑keepalived的配置文件【/etc/keepalived/keepalived.conf】及其文件内容(注意:killall -0 httpd的含义是检测httpd服务是否存在【0表示存在】,否则就是不存在)
vi /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVEL
}vrrp_script check_httpd{script "killall -0 httpd"interval 2
}vrrp_instance HA_1 {state MASTERinterface ens33virtual_router_id 151priority 100advert_int 2authentication {auth_type PASSauth_pass qwer1234}notify_master "/etc/keepalived/master.sh"notify_backup "/etc/keepalived/backup.sh"notify_fault "/etc/keepalived/fault.sh"track_script{check_httpd}virtual_ipaddress{192.168.1.216/24 dev ens33}
}#5-将【192.168.1.9】主服务器上配置好的(backup.sh fault.sh master.sh keepalived.conf)文件都传输一份到【192.168.1.36】备份服务器上               
scp backup.sh fault.sh master.sh keepalived.conf root@192.168.1.36:/etc/keepalived#6-修改备份服务器【192.168.1.36】上的keepalived.conf文件及其修改的内容
cd /etc/keepalived! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVEL
}vrrp_script check_httpd{script "killall -0 httpd"interval 2
}vrrp_instance HA_1 {state BACKUPinterface ens33virtual_router_id 151priority 90advert_int 2authentication {auth_type PASSauth_pass qwer1234}notify_master "/etc/keepalived/master.sh"notify_backup "/etc/keepalived/backup.sh"notify_fault "/etc/keepalived/fault.sh"track_script{check_httpd}virtual_ipaddress{192.168.1.216/24 dev ens33}
}

 1.3、启动keepalived并监测httpd且做主备切换测试

        我们首先启动keepalived的主节点服务器上的keepalived并监测该服务器上的通用消息日志,然后在启动keepalived的备用服务器上的keepalived并监测该服务器上的通用日志消息日志;接着就是分别对Apache的Web服务httpd做停止和再次启动的主备切换测试,详细操作流程如下:

#启动主节点服务器上的keepalived并监测该服务器上的通用消息日志流程#1-分别再打开主服务器【192.168.1.9】和备份服务器【192.168.1.36】的新终端,并且监测日志
tail -f /var/log/messages#2-在另一个终端上启动主服务器【192.168.1.9】上的keepalived服务并查看该服务器上虚拟IP是否绑定在指定的物理网卡上(后去查看执行【tail -f /var/log/messages】命令的终端输入信息)
systemctl start keepalived.service
ip addr#3-我们在浏览器中输入我们在keepalived配置绑定在该服务器物理网卡的虚拟IP(如:192.168.1.216)此时应该可以访问到主服务器(192.168.1.9)的网页内容
192.168.1.216#4-查看主服务器(192.168.1.9)上keepalived自己的日志文件(即:有两个记录【先是Backup】然后是【Master】)
tail -f /var/log/keepalived-http-state.log#5-在另一个终端上启动主服务器【192.168.1.36】上的keepalived服务并查看该服务器上虚拟IP是否绑定在指定的物理网卡上(后去查看执行【tail -f /var/log/messages】命令的终端输入信息)
systemctl start keepalived.service
ip addr#6-我们在浏览器中输入我们在keepalived配置绑定在该服务器物理网卡的虚拟IP(如:192.168.1.216)此时还是访问到主服务器(192.168.1.9)的网页内容
192.168.1.216#7-查看备份服务器(192.168.1.36)上keepalived自己的日志文件(即:有两个记录【先是Backup】然后是【Master】)
tail -f /var/log/keepalived-http-state.log#8-我们先停止备用服务器(192.168.1.36)上的httpd服务后查看【/var/log/keepalived-http-state.log】日志与【/var/log/messages】日志
systemctl stop httpd.service
tail -f /var/log/keepalived-http-state.log#9-再次启动备用服务器的httpd服务
systemctl start httpd#10-停止主服务器(192.168.1.9)上的httpd服务后查看【/var/log/keepalived-http-state.log】日志与【/var/log/messages】日志和访问浏览器【192.168.1.216】此时还是访问到备用服务器(192.168.1.36)的网页内容
systemctl stop httpd.service
tail -f /var/log/keepalived-http-state.log#10.1-再次启动主服务器(192.168.1.9)上的httpd服务后查看【/var/log/keepalived-http-state.log】日志与【/var/log/messages】日志和访问浏览器【192.168.1.216】此时还是访问到主服务器(192.168.1.9)的网页内容
systemctl start httpd
tail -f /var/log/keepalived-http-state.log

        纵观该抢占式高可用集群使用Keepalived的整个运行过程和切换过程,看似合理,事实上并非如此:在一个高负载、高并发、追求稳定的业务系统中,执行一次主、备切换对业务系统影响很大,因此,不到万不得已,尽量不要进行主、备角色的切换(也就是说,在主节点发生过程后,必须要切换到备用节点,而在主节点恢复后,不希望再次切回主节点,直到备用节点发生故障时才进行切换,这就是前面绍过的不抢占功能,可以通过Keepalived的“nopreempt”选项来实现);具体的详细操作如下【启用keepalived的不抢占式模式】实操流程:

二、启用keepalived的不抢占模式

#启用keepalived的不抢占模式(主要有三点:1、在keepalived的配置文件的vrrp_instance模块中添加上【nopreempt】关键字【注意这个关键字只在优先级数值大的服务器keepalived的配置文件中设置,其余备用节点不用添加】;2、在keepalived的配置文件的vrrp_instance模块中state必须修改为BACKUP;3、在keepalived的配置文件的vrrp_instance模块中主节点优先级【priority】数值必须比其他备用节点大)#1-我们修改主节点服务器(192.168.1.9)的keepalived的配置文件【/etc/keepalived/keepalived.conf】及其内容如下:
vi /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVEL
}vrrp_script check_httpd{script "killall -0 httpd"interval 2
}vrrp_instance HA_1 {state BACKUPinterface ens33virtual_router_id 151priority 100advert_int 2nopreemptauthentication {auth_type PASSauth_pass qwer1234}notify_master "/etc/keepalived/master.sh"notify_backup "/etc/keepalived/backup.sh"notify_fault "/etc/keepalived/fault.sh"track_script{check_httpd}virtual_ipaddress{192.168.1.216/24 dev ens33}
}#2-重启keepalived服务让配置生效(然后查看通用日志【/var/log/message】和浏览器查看虚拟IP【192.168.1.36】)此时显示的是备用的网站(192.168.1.36)内容(因为重启keepalived服务会先停止keepalived然后在启动就让备用的服务器做为主服务了,除非是该备用服务出现异常宕机或者服务故障才会在次切换主节点了,否则就一直默认是该备用服务器作为主节点)此时访问虚拟IP地址【192.168.1.216】就是显示备用服务器192.168.1.36的网站了
systemctl restart keepalived.service
ip addr#3-若需要再次让我们配置的主服务器(192.168.1.9)成为keepalived的主节点,则需要等到备用服务器(192.168.1.36)宕机或者服务停止或异常后就会自动切换到192.168.1.9了(我们这里手动停止备用服务器的httpd服务来模拟故障)然后再次访问虚拟IP地址【192.168.1.216】就是显示主节点服务器192.168.1.9的网站了
systemctl stop httpd
ip addr#3.1-此时可以查看主节点服务器(192.168.1.9)的【ip addr】信息可以看到已经绑定了keepalived的虚拟IP(192.168.1.216)
ip addr#3.2-我们再次手动启动备用服务器(192.168.1.36)的httpd服务来恢复故障和查看该服务器对应的keepalived的虚拟IP是否绑定上(结果是,虽然该备用服务器的httpd服务已经恢复,但是依然是作为备用服务;只有等目前的主服务器(192.168.1.9)宕机或者httpd服务故障才会切换到该备用服务器上来)
systemctl start httpd
ip addr

三、通过vrrp_script实现对集群资源的监控

 3.1、通过killall命令探测服务运行状态

        这种监控集群服务的方式主要是通过【killall -0 服务名称】命令实现的。killall会发送一个信号到正在运行的指定命令的进程。如果没指定信号名,则发送SIGTERM。SIGTERM也是信号名的一种,代号为15,它表示以正常的方式结束程序的运行。其实killall可用的信号名有很多,可通过“killall -l”命令显示所有信号名列表,其中每个信号名代表对进程的不同执行方式,例如,代号为9的信号表示将强制中断一个程序的运行。这里要用到的信号为0,代号为0的信号并不表示要关闭某个程序,而表示对程序(进程)的运行状态进行监控,如果发现进程关闭或其他异常,将返回状态码1,反之,如果发现进程运行正常,将返回状态码0。vrrp_script模块正是利用了killall命令的这个特性,变相的实现了对服务运行状态的监控

#通过killall命令探测服务运行的状态示例vrrp_script check_mysqld {script "killall -0 mysqld"interval 2
}
track_script {check_mysqld
}

        在这个例子中,定义了一个服务监控模块check_mysqld,其采用的监控的方式是通过“killall -0 mysqld”的方式,其中“interval”选项检查的时间间隔,即2秒钟执行一次检测。

#直接在Linux中运行命令测试#1-直接运行kiall的测试命令
killall -0 httpd#2--查看上一个命令的执行结果命令(结果显示0表示成功;否则就是失败)
echo $?

 3.2、检测测端口运行状态

        检测端口的运行状态,也是最常见的服务监控方式,在Keepalived的vrrp_script模块中可以通过如下方式对本机的端口进行检测:

#通过检测端口运行状态来探测
vrrp_script check_httpd {script "</dev/tcp/127.0.0.1/80"interval 2fall   2rise   1
}
track_script {check_httpd
}

  在这个例子中,通过“</dev/tcp/127.0.0.1/80”这样的方式定义了一个对本机80端口的状态检测,其中,“fall”选项表示检测到失败的最大次数,也就是说,如果请求失败两次,就认为此节点资源发生故障,将进行切换操作;“rise”表示如果请求一次成功,就认为此节点资源恢复正常。

#直接在Linux中运行端口检测验证#1-直接输入需要验证的端口命令
</dev/tcp/127.0.0.1/80#2-查看上一个命令的执行结果命令(结果显示0表示成功;否则就是失败)
echo $?

 3.3、通过shell语句进行状态监控

        在Keepalived的vrrp_script模块中甚至可以直接引用shell语句进行状态监控:

#在Keepalived的vrrp_script模块中甚至可以直接引用shell语句进行状态监控
vrrp_script chk_httpd {script "if [ -f /var/run/httpd/httpd.pid ]; then exit 0; else exit 1; fi"interval 2fall   1rise   1
}
track_script {chk_httpd
}

        在这个例子中,通过一个shell判断语句,检测httpd.pid文件是否存在,如果存在,就认为状态正常,否则认为状态异常,这种监测方式对于一些简单的应用监控或者流程监控非常有用。从这里也可以得知,vrrp_script模块支持的监控方式十分灵活。

 3.4、通过脚本进行服务状态监控

        通过脚本进行服务状态监控是最常见的监控方式,其监控过程类似于Nagios的执行方式,不同的是,这里只有0、1两种返回状态。

#通过脚本进行服务状态监控#1-keepalived中的vrrp_instance里面的配置
vrrp_script chk_mysqld {script "/etc/keepalived/check_mysqld.sh"interval 2
}
track_script {chk_mysqld
}#2-【/etc/keepalived/check_mysqld.sh】脚本的内容
#!/bin/bash
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD='xxxxxx'
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" > /dev/null 2>&1
if [ $? = 0 ] ;thenMYSQL_STATUS=0
elseMYSQL_STATUS=1
fiexit $MYSQL_STATUS

        这个一个最简单的实现mysql服务状态检测的shell脚本,它通过登录mysql数据库后执行查询操作来检测mysql运行是否正常,如果检测正常,将返回状态码0,否则返回状态码1。其实很多在Nagios下运行的脚本,只要稍作修改,即可在这里使用,非常方便。

四、keepalived问题排查技巧

keepalived的问题排查技巧
检测两个keepalived主机之间是否能通信的办法如下三个:
序号说明
1停掉一个keepalived,看另外一个keepalived的日志/var/log/messages 里是否有新的日志。
2

用嗅探器抓包

#用嗅探器抓包(224.0.0.18是VRRP组播使用的目的地址,默认为组播每秒发送一次)
#【注意:网卡名称需要修改为自己服务器的实际网卡名称(通过ifconfig命令查看网卡名称)】
tcpdump -v -i ens33 host 224.0.0.18
tcpdump -vvv -n -i eth1 host 224.0.0.18

3

在做集群的时候,尽量关闭每个主机上的selinux服务和iptables服务,这样会减少很多问题。

#1-关闭Linux自带的防火墙命令
systemctl stop firewalld
systemctl disable firewalld#2-关闭iptables命令
yum install iptables -y
yum install iptables-services -y
iptables -F
iptables -L -n
service iptables save
more /etc/sysconfig/iptables#3-查看selinux是否关闭(设置【SELINUX=disabled】)保存后退出重启系统生效
cat /etc/selinux/config

文章转载自:

http://xXxAQRK3.Ljbpk.cn
http://pAqnplWL.Ljbpk.cn
http://IM1MU39s.Ljbpk.cn
http://GaUXnmPM.Ljbpk.cn
http://Y70PDkmw.Ljbpk.cn
http://8KowsCYf.Ljbpk.cn
http://QsgmwhYf.Ljbpk.cn
http://Awhdv4zW.Ljbpk.cn
http://4ncm48fa.Ljbpk.cn
http://wksC6kBV.Ljbpk.cn
http://j0uiEPqB.Ljbpk.cn
http://B0mzK5jU.Ljbpk.cn
http://CDmy8vVh.Ljbpk.cn
http://cMaZXQtn.Ljbpk.cn
http://65j2B31Q.Ljbpk.cn
http://rcRtnvYv.Ljbpk.cn
http://mi360hNj.Ljbpk.cn
http://8tREoVjL.Ljbpk.cn
http://E61k0eVJ.Ljbpk.cn
http://eAjFG6TQ.Ljbpk.cn
http://swOZY3qe.Ljbpk.cn
http://XdjVtVBI.Ljbpk.cn
http://fWuF19pl.Ljbpk.cn
http://Y9pgl1SX.Ljbpk.cn
http://7vakWOjX.Ljbpk.cn
http://StuFnnco.Ljbpk.cn
http://pnBV7rgK.Ljbpk.cn
http://EhehwUbT.Ljbpk.cn
http://nP8ABqSk.Ljbpk.cn
http://mlqoYw9V.Ljbpk.cn
http://www.dtcms.com/a/387005.html

相关文章:

  • RAG与Fine-tuning-面试
  • Syslog服务
  • git clone vllm
  • 物联网的发展展望
  • PySpark处理超大规模数据文件:Parquet格式的使用
  • Spring Boot项目通过tomcat部署项目(包含jar包、war包)
  • 网络四层模型和七层模型的区别
  • 项目部署——LAMP、LNMP和LTMJ
  • 支付宝免押租赁平台源码
  • 不建议在 Docker 中跑 MySQL
  • PPT中将图片裁剪为爱心等形状
  • YOLO 模型前向推理全流程(以 YOLOv8 为例)
  • 【Redis】--集群
  • TRUNCATE还是DELETE?MySQL高效清空表的选择策略与实战指南
  • 【AI】AI评测入门(四):Evaluator Prompt拆解
  • Redis以`后台`方式启动方法
  • 【每日算法】找出字符串中第一个匹配项的下标 LeetCode
  • 【12】新国都 ——新国都 嵌入式 第一轮一面,技术面,校招,面试问答记录
  • 线程池-面试
  • 设计模式学习笔记(一)
  • 贪心算法应用:旅行商问题最近邻算法(TSP Nearest Neighbor)
  • 高系分七:软件工程
  • spark hive presto doris 对substr函数的差异
  • webpack5
  • M:Dijkstra算法求最短路径
  • C++11 atomic
  • 工作中真正常用的 git 操作
  • 【Java】P5 Java流程控制——分支结构详解
  • 下载 | Win10 2021官方精简版,预装应用极少!(9月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)
  • 【面试场景题】交易流水表高qps写入会有锁等待或死锁问题吗