Linux-HA高可用-keepalived
HA高可用-keepalived
一、概述
高可用: HA HighAvailablity
生成vip,dns解析到这个ip地址
选项 | 说明 |
---|---|
keepalived | 活着 高可用软件,负载使用,一些不涉及数据服务 |
heartbeat | 心跳 高可用软件,涉及数据库,存储数据相关可以用 |
高可用可用软件 | RoseHA |
二、原理
keepalived 是基于VRRP协议实现高可用
VRRP 虚拟路由器冗余协议,最开始是给网络设备实现高可用,目前keepalive实现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
2. keepalived配置文件分类
配置文件结构 | 说明 |
---|---|
global_defs | 全局定义部分 |
vrrp_instance | vrrp协议配置,vip,主备,网卡 |
virtual_server | 用于管理与配置lvs的部分 |
[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 ~]# 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 } virtual_ipaddress { 10.0.0.3 dev eth0 label eth0:0 } }
四、问题
1.脑裂故障
现象:主备都有vip
原因:
备认为主挂了,接管资源生成vip,实际上主并没有挂,仍有vip
有很多原因可以导致脑裂,开启防火墙,selinux,keepalived配置,物理线路
解决:
监控(备节点监控),只要备节点有vip就告警
或者监控备节点,只要备节点有vip就认为主挂了,就让他真的挂了
2. keepalived基于主机高可用
keepalived只会在主机挂了,网络断开后,才会进行主备切换
默认情况下keepalived不会监控某个服务
目标:某个服务关闭了,keepalived就进行主备切换
步骤:
书写脚本,过滤服务进程数,端口数量,检查是否运行
然后进行判断,如果服务没有运行,则关闭keepalived
修改keepalived配置文件,通过keepalived调用这个脚本
#书写脚本 [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.进行判断 if [ $count -eq 0 ];then systemctl stop keepalived fi #赋予脚本执行权限 [root@lb01 ~]# chmod +x /server/scripts/check_ngx.sh #修改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
五、进阶
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 [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. 双主模式
应对高并发的时候设置的双主模式,主备分别设置不同的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
本文作者:缘之世界
本文链接:https://www.cnblogs.com/world-of-yuan/p/17145954.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步