云计算系列教程之搭建高可用技术Keepalived

举报
tea_year 发表于 2024/08/17 20:15:40 2024/08/17
【摘要】 HA高可用-keepalived一、概述高可用: HA HighAvailablity生成vip,dns解析到这个ip地址选项说明keepalived活着 高可用软件,负载使用,一些不涉及数据服务heartbeat心跳 高可用软件,涉及数据库,存储数据相关可以用高可用可用软件RoseHA二、原理结合图???keepalived 是基于VRRP协议实现高可用VRRP 虚拟路由器冗余协议,最开始...

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
  1. 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
     }
     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调用这个脚本

 #书写脚本
 [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
     }
 }
  
  

注意事项:

  1. 给脚本执行权限

  2. 脚本名字中不要包含服务名,这样的话过滤的时候就不会发生问题

  3. 调用脚本的时候,注意脚本的位置

  4. 配置文件里修改的时候要注意{}前面的空格,模块名字与{之间有空格

  5. 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
 #插卡服务是否存活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. 双主模式

应对高并发的时候设置的双主模式,主备分别设置不同的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
  
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。