Linux服务器教程之八高可用KeepAlivled
课程目标
-
HA概念
-
脑裂问题
-
非抢占模式和双主模式
-
HTTPS
一、HA概述
官方文档:
https://keepalived.org/doc/
http://keepalived.org/documentation.html
高可用: HA HighAvailablity
生成vip,dns解析到这个ip地址
选项 | 说明 |
---|---|
keepalived | 活着 高可用软件,负载使用,一些不涉及数据服务 |
heartbeat | 心跳 高可用软件,涉及数据库,存储数据相关可以用 |
高可用可用软件 | RoseHA |
系统可用性指标 可用时间与可用时间和故障时间的和的比就是,系统可用性 A=MTBF/(MTBT+MTTR) 指标 : 99.9%, 99.99%, 99.999%,99.9999% SLA : Service-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约) 实现高可用 提升系统高用性的解决方案:降低 MTTR- Mean Time To Repair( 平均故障时间 ) 解决方案:建立冗余机制 active/passive 主 / 备 active/active 双主 active --> HEARTBEAT --> passive active <--> HEARTBEAT <--> active ————————————————
二、原理
结合图
-
keepalived 是基于VRRP协议实现高可用
-
VRRP 虚拟路由器冗余协议,最开始是给网络设备实现高可用,目前keepalived实现vrrp协议,通过vrrp实现高可用
-
分为主,备.一般是2个节点,主备之间通过vrrp协议发送数据包沟通
-
主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备转正了,接管用户请求流量
vrrp协议使用组播的ip,224.xx.xx.xx
三、极速上手指南
环境准备 ip地址 需要安装的服务 lb01 10.0.0.5/172.16.1.5 nginx+keepalived lb02 10.0.0.6/172.16.1.6 nginx+keepalived 1.部署服务
yum -y install keepalived
-
keepalived配置文件分类
配置文件结构 说明 global_defs 全局定义部分 vrrp_instance vrrp协议配置,vip,主备,网卡 virtual_server 用于管理与配置lvs的部分
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf |wc -c
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
#全局定义
global_defs {
router_id lb01 #每一个keepalived的名字,当前网络中唯一
}
#vrrp实例配置部分,用于配置VIP
vrrp_instance vip_3 { #vrrp实例名字 #设置在1对主备之间使用的名字,注意在同一对主备之间的这个名字要一致
state MASTER #主/备 MASTER 主 BACKUP 备
interface eth0 #指定网卡
virtual_router_id 51 #1对主备之间id号统一即可
priority 100 #优先级,数字越大优先级越高,设置建议。主>备
advert_int 1 #心跳间隔,多久发送一次vrrp数据包
authentication { #授权与认证,保持默认即可,对数据包加密
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置vip
10.0.0.3 dev eth0 label eth0:0 #label 设置了别名
}
}
###-------------------------------------------
[root@lb01 ~]#cp cat /etc/keepalived/keepalived.conf{,.bak}
#主
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01 #修改这里
}
vrrp_instance vip_3 {
state MASTER #修改这里
interface eth0
virtual_router_id 51
priority 100 #修改这里
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
#---------------------------------
#备
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02 #修改这里
}
vrrp_instance vip_3 {
state BACKUP #修改这里
interface eth0
virtual_router_id 51
priority 50 #修改这里
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
虚拟ip
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
四、问题
1.脑裂故障⭐⭐⭐⭐⭐
现象:主备都有vip
[root@lb02 ~]# systemctl start firewalld
[root@lb02 ~]# ip a | grep 192.168.3.3
inet 192.168.3.3/32 scope global eth0:0
原因:
备认为主挂了,接管资源生成vip,实际上主并没有挂,仍有vip
有很多原因可以导致脑裂,开启防火墙,selinux,keepalived配置,物理线路
解决:
监控(备节点监控),只要备节点有vip就告警
或者监控备节点,只要备节点有vip就认为主挂了,就让他真的挂了
2. keepalived基于主机高可用
keepalived只会在主机挂了,网络断开后,才会进行主备切换
默认情况下keepalived不会监控某个服务
目标:某个服务关闭了,keepalived就进行主备切换
步骤:
1)书写脚本,过滤服务进程数,端口数量,检查是否运行
2)然后进行判断,如果服务没有运行,则关闭keepalived
3)修改keepalived配置文件,通过keepalived调用这个脚本
#书写脚本 /server/scripts/
[root@lb01 ~]# cat /server/scripts/check_ngx.sh
#!/bin/bash
#author: wh
#desc: keepalived 检查nginx进程的脚本
#1.取出nginx端口的数粮
count=`ss -lntup |grep nginx |wc -l`
#2.进行判断,注意由不一样的地方;shell脚本!!!equals:相等
if [ $count -eq 0 ];then
systemctl stop keepalived
fi
#赋予脚本执行权限
[root@lb01 ~]# chmod +x /server/scripts/check_ngx.sh
# 测试执行....
/server/script> sh check_ngx.sh
///--------------------------上面的是检查nginx的脚本---------------------
#修改keepalived配置文件
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
#增加这一块
vrrp_script check_ngx {
script /server/scripts/check_ngx.sh
interval 2 #几秒执行一次脚本
weight 1 #执行脚本的权重
user root
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
#增加这一块
track_script {
check_ngx
}
}
注意事项:
给脚本执行权限
脚本名字中不要包含服务名,这样的话过滤的时候就不会发生问题
调用脚本的时候,注意脚本的位置
配置文件里修改的时候要注意{}前面的空格,模块名字与{之间有空格
keepalived 日志 /var/log/message
多学一招:
sh命令有一些常见的选项,可以用来控制脚本的执行方式。以下是一些常用的选项: – -e:如果脚本中出现了错误的命令,sh命令将立即退出。 – -n:仅检查脚本中的语法错误,而不执行脚本。 – -x:在执行脚本时,显示每个命令的执行过程。
五、进阶
1. 非抢占模式
keepalived 主备默认是抢占式,主挂了,备接管,主恢复,备恢复
要是希望主恢复,不希望主重新抢回资源的话,就需要配置非抢占模式
#1.设置2个节点状态是备
#2.配置nopreempt选项
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance vip_3 {
state BACKUP #修改这一行
nopreempt #增加这一行
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
------------------------------------
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance vip_3 {
state BACKUP
nopreempt #增加这一行,因为本身它就是备份机!
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
#现在lb01 keepalived启动
[root@lb01 ~]# ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0:0
[root@lb02 ~]# ip a |grep 10.0.0.3
#现在lb01 keepalived关闭,vip漂移到lb02
#查看服务是否存活systemctl is-active keepalived.service
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip a |grep 10.0.0.3
[root@lb02 ~]# ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0:0
#现在lb02 keepalived开启,vip没有漂移回来
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ps -ef|grep keepalived
root 14203 1 0 19:53 ? 00:00:00 /usr/sbin/keepalived -D
root 14204 14203 0 19:53 ? 00:00:00 /usr/sbin/keepalived -D
root 14205 14203 0 19:53 ? 00:00:00 /usr/sbin/keepalived -D
[root@lb01 ~]# ip a |grep 10.0.0.3
[root@lb02 ~]# ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0:0
2. 双主模式
HA,高可用;
应对高并发的时候设置的双主模式,主备分别设置不同的vip
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
#增加这一块
vrrp_instance vip_4 { #设置这一行,名字不能和上边的一样
state BACKUP #设置这一行
interface eth0
virtual_router_id 52 #设置这一行,id不能和上边的一样
priority 50 #设置这一行
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4 dev eth0 label eth0:0 #设置这一行
}
}
[root@lb01 ~]# systemctl restart keepalived.service
[root@lb01 ~]# ip a |grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0:0
-----------------------------------------------------
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance vip_3 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
#增加这一块
vrrp_instance vip_4 { #设置一行,名字不能重复,需要和lb01的一样
state MASTER #设置一行
interface eth0
virtual_router_id 52 #设置这一行
priority 100 #设置这一行
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4 dev eth0 label eth0:0 #设置这一行
}
}
[root@lb02 ~]# systemctl restart keepalived.service
[root@lb02 ~]# ip a |grep 10.0.0.4
inet 10.0.0.4/32 scope global eth0:0
总结
在生产环境中,监控Keepalived的运行状态是必不可少的。可以结合Zabbix、Prometheus等监控工具,实时监控服务器的运行情况。一旦发现异常,应及时处理,确保系统的高可用性。
通过以上步骤,我们成功搭建了一个基于Keepalived的服务器集群架构。在实际应用中,Keepalived不仅可以用于负载均衡,还能够对故障迅速恢复,从而保证服务的高可用性。随着云计算技术的不断发展,掌握Keepalived的使用将为运维管理提供极大的便利。
- 点赞
- 收藏
- 关注作者
评论(0)