Keepalived高可用集群部署
1、keepalived说明
Keepalived最初是为lvs负载均衡软件设计的,三个功能,管理lvs,实现集群节点健康检查,作为系统网络服务的高可用功能(failover)。
Keepalived高可用对之间是通过vrrp协议通信。
2、安装keepalived环境说明
硬件环境准备,如下
hostname |
ip |
说明 |
Lb01 |
192.168.19.154 |
Keepalived主服务器(nginx) |
Lb02 |
192.168.19.157 |
Keepalived从服务器(nginx) |
Web01 |
192.168.19.154 |
Web01服务器 |
Web02 |
192.168.19.157 |
Web02服务器 |
3、Nginx、keepalived安装
[root@www logs]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@www logs]# ls /usr/local/nginx/
[root@www logs]# yum install keepalived -y
4、启动keepalived
Centos7默认网卡,因此启动前需要修改配置网卡信息,
[root@www keepalived]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
[root@www keepalived]# systemctl start keepalived
[root@www keepalived]# ip add |grep 200
inet 192.168.200.16/32 scope global ens33
inet 192.168.200.17/32 scope global ens33
inet 192.168.200.18/32 scope global ens33
5、keepalived配置文件解析
主要有3个功能,本章主要讲解高可用功能,高可用部分主要分为两个重要区块:全局定义部分和实例定义区块。
[root@www keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
全局部分:主要设置故障通知和Router ID标识,示例配置如上,
第一行是注释,!和#都表示注释。
第二行为空行
第3-8行定义报警故障的Email通知
第9行指定发送邮件的发送人,可选
第10行指定smtp_server发送邮件的smtp服务器,如果本机开启了sendmail或者postfix,就可以使用上面的默认配置实现邮件发送,可选
第11行,连接smtp_server超时时间
第4-11行,都可以不配置,实际工作会交给(zabbix、nagios)监控系统。
第12行,是keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。
Vrrp实例定义区块
具体实例配置信息,keepalived主备状态,端口,优先级,认证方式和ip信息。
19 vrrp_instance VI_1 {
20 state MASTER
21 interface ens33
22 virtual_router_id 51
23 priority 100
24 advert_int 1
25 authentication {
26 auth_type PASS
27 auth_pass 1111
28 }
29 virtual_ipaddress {
30 192.168.200.16
31 192.168.200.17
32 192.168.200.18
33 }
34 }
第19行,标识定义一个vrrp_instance实例,名字为VI_1,每个vrrp_instance实例可以认为是服务的一个实例或者作为一个业务服务,在keepalived服务配置中,这样的vrrp_instance实例可以有多个,注意存在主节点的vrrp_instance实例在备节点中也需要存在,这样才能实现故障切换接管。
第20行,state表示当前实例VI_1的角色状态,当前角色为MASTER,这个状态只能有MASTER和BACKUP两者状态,并且需要大写字母,当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。
第21行,interface为网路通信接口。对外提供服务的网络接口,如eth0、eth1.
第22行,virtual_router_id,虚拟路由id的标识,这个标识最好是一个数字,并且在keepalived中唯一,MASTER和SLAVE需要保持一致,否则会出现脑裂问题。
第23行,priority为优先级,其后面是一个数字,数字越大,标识优先级越高,在同一个vrrp_instance实例中,MASTER配置优先级要高于SLAVE。若MASTER为150,一般建议SLAVE为100或更小的数值,一般建议隔50以上为佳。
第24行,同步通知间隔,MASTE和SLAVE之间通信时间,单位为秒。
第25-28行,authentiction为权限认证配置。官网推荐使用PASS明文方式,密码最好4-8位数字,同一实例的MASTER和SLAVE使用相同的密码才能通信。
第29-32行,虚拟ip地址,可以配置多个,每个地址占一行。
6、keepalived主从配置
主要有,如下参考配置。
如上,主从配置信息,注意MASTER和SLAVE配置文件的三个差别。
6、keepalived脑裂问题
什么是脑裂?
由于某些原因,导致两台高可用服务对在指定时间内,无法检测到对方的心跳信息,各自取得资源及服务的所有权,而此时两台高可用服务器对都还存活并正常运行,这样会导致同一个ip或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个vip,用户数据会写入两端,造成数据不一致或数据丢失,这种情况称为脑裂。
脑裂发生原因?
高可用服务对之间心跳线链路发生故障,导致无法正常通信。(如,心跳线坏了,网卡驱动,ip冲突,交换机)
高可用服务器开启了iptables、firewalld防火墙拦住了心跳信息
心跳网络配置信息不对
其他配置不当,心跳方式,广播。
解决脑裂问题
使用串行电缆和以太网电缆,同时使用两条心跳
当检测脑裂,强行关闭一个心跳节点
接入监控软件,通过监控信息判断故障节点
7、keepalived主主配置
主主配置,对于多实例而言。
供参考,暂未使用。
8、keepalived配置邮件
操作步骤如下,
yum install mailx -y 安装邮件服务
[root@www keepalived]# tail -3 /etc/mail.rc
set from=wangweiwei_11@sina.cn smtp=smtp.sina.cn
set smtp-auth-user=wangweiwei_11@sina.cn smtp-auth-password=xxx
set smtp-auth=login
邮件测试发送:echo "hello world" | mail -s "hello" 498886724@qq.com
[root@www keepalived]# cat keepalived.conf
...
virtual_router_id 51
priority 150
advert_int 1
# Keepalived进入MASTER状态执行脚本
notify_master "/etc/keepalived/mail_notify.sh master"
# Keepalived进入BACKUP状态执行脚本
notify_backup "/etc/keepalived/mail_notify.sh backup"
# Keepalived进入FAULT状态执行脚本
notify_fault "/etc/keepalived/mail_notify.sh fault"
authentication {
auth_type PASS
auth_pass 1111
....
}
[root@www keepalived]# cat mail_notify.sh
#!/bin/bash
echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com
触发邮件告警,
9、keepalived配置脚本检查主从切换状态记录
结合具体的应用实现,完善脚本。
[root@www keepalived]# cat keepalived.conf
...
advert_int 1
# Keepalived进入MASTER状态执行脚本
notify_master "/etc/keepalived/master_notify.sh master"
# Keepalived进入BACKUP状态执行脚本
notify_backup "/etc/keepalived/backup_notify.sh backup"
# Keepalived进入FAULT状态执行脚本
notify_fault "/etc/keepalived/fault_notify.sh fault"
...
[root@www keepalived]# cat master_notify.sh
#!/bin/bash
echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com
LOGFILE=/var/log/keepalived-state.log
echo "[Mster]" >>$LOGFILE
date >> $LOGFILE
[root@www keepalived]# cat backup_notify.sh
#!/bin/bash
echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com
LOGFILE=/var/log/keepalived-state.log
echo "[Backup]" >>$LOGFILE
date >> $LOGFILE
[root@www keepalived]# cat fault_notify.sh
#!/bin/bash
echo "192.168.19.154 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" 1456576084@qq.com
LOGFILE=/var/log/keepalived-state.log
echo "[Fault]" >>$LOGFILE
date >> $LOGFILE
查看日志,[root@www keepalived]# cat /var/log/keepalived-state.log
[Mster]
Sat Aug 22 19:49:21 CST 2020
[Mster]
Sat Aug 22 19:51:25 CST 2020
[Backup]
Sat Aug 22 19:53:18 CST 2020
10、keepalived配置脚本健康检查
结合具体的应用实现,当nginx或者ha故障,则停止当前节点的keepalived,自动切换到备用节点。一般通过脚本方式实现。以为nginx为例。
[root@www_test keepalived]# cat nginx_check.sh
#!/bin/bash
/usr/bin/curl http://127.0.0.1/index.html -o /dev/null -s || /usr/sbin/nginx
if [ $? -ne 0];then
systemctl stop keepalived &> /dev/null
fi
[root@www_test keepalived]# chmod +x nginx_check.sh
[root@www_test keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
1456576084@qq.com
18672933592@163.com
}
notification_email_from wangweiwei_11@sina.cn
smtp_server stmp.sina.cn
smtp_connect_timeout 30
router_id LVS_2
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 200
advert_int 1
# Keepalived进入MASTER状态执行脚本
notify_master "/etc/keepalived/master_notify.sh master"
# Keepalived进入BACKUP状态执行脚本
notify_backup "/etc/keepalived/backup_notify.sh backup"
# Keepalived进入FAULT状态执行脚本
notify_fault "/etc/keepalived/fault_notify.sh fault"
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.19.180
}
track_script {
check_nginx
}
}
自此,完成了keepalived基本操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2019-08-22 Python常用基础模块报错处理
2019-08-22 ScureCRT基础用法