高可用 - 06 Keepalived基础功能应用实例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 高可用 - 06 Keepalived基础功能应用实例


0bc7b7bcd1fc4752b429566093397057.png

概述


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


Keepalived基础HA功能演示


在默认情况下,Keepalived可以实现对系统死机、网络异常及Keepalived本身进行监控。也就是说,当系统出现死机、网络出现故障或Keepalived进程异常时,Keepalived会进行主备节点的切换。


但这些还是不够的,因为集群中运行的服务也随时可能出现问题,所以,还需要对集群中运行服务的状态进行监控,当服务出现问题时也进行主备切换。作为一个优秀的高可用集群软件,Keepalived提供了一个vrrp_script模块专门用来对集群中服务资源进行监控。


配置Keepalived


5e66d8f609fe4824836a62ef8c4213b4.png


这里我们要部署一套基于HTTPD的高可用集群系统。


keepalived-master节点的keepalived.conf文件

# 全局配置
global_defs {
  # 邮件通知信息
  notification_email {
   acassen@firewall.loc
   failover@firewall.loc
   sysadmin@firewall.loc
  }
  # 定义发件人
  notification_email_from Alexandre.Cassen@firewall.loc
  # SMTP服务器地址
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
  router_id LVS_DEVEL
  # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
}
# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换  名称自定义
vrrp_script check_httpd {
  script "killall -0 httpd"
  interval 2
  }
# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance HA_1 {
   # 定义初始状态,可以是MASTER或者BACKUP
  state MASTER
  # 工作接口,通告选举使用哪个接口进行
  interface eth0
  # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
  virtual_router_id 80
  # 使用哪个虚拟MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
    track_interface {
        eth0
        ens33
    }
   # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
  priority 100
  # 通告频率,单位为秒
  advert_int 2
  # 通信认证机制,这里是明文认证还有一种是加密认证
  authentication {
    auth_type PASS
    auth_pass qwaszx
  }
  # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
  virtual_ipaddress {
    # IP/掩码 dev 配置在哪个网卡
        192.168.66.80/24 dev eth0 
  }
  # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    nopreempt|preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
    preempt delay 300
    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
  track_script {
   check_httpd
  }
  # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
  notify_master "/etc/keepalived/master.sh "
  notify_backup "/etc/keepalived/backup.sh"
  notify_fault "/etc/keepalived/fault.sh"
  
}


其中,master.sh文件的内容如下。

#!/bin/bash
LOGFILE=/var/log/keepalived-mysql-state.log
echo "[Master]" >> $LOGFILE


backup.sh文件的内容如下。

#!/bin/bash
LOGFILE=/var/log/keepalived-mysql-state.log
echo "[Backup]" >> $LOGFILE


fault.sh文件的内容如下。

#!/bin/bash
LOGFILE=/var/log/keepalived-mysql-state.log
echo "[Fault]" >> $LOGFILE


这三个脚本的作用是监控Keepalived角色的切换过程,进一步理解notify参数的执行过程。


keepalived-backup节点的keepalived.conf文件


keepalived-backup节点上的keepalived.conf配置文件内容与keepalived-master节点上的基本相同,需要修改的地方有两个。


  • 将“state MASTER”更改为“state BACKUP”。
  • priority 100更改为一个较小的值,这里改为“priority 80”。


Keepalived启动过程分析


将配置好的keepalived.conf文件及master.sh、backup.sh、fault.sh三个文件一起复制到keepalived-backup备用节点对应的路径下,然后在两个节点启动http服务,最后启动Keepalived服务。


Master节点

首先在keepalived-master节点启动keepalived服务,执行如下操作。

[root@keepalived-master keepalived]# chkconfig --level 35 httpd on
[root@keepalived-master keepalived]# /etc/init.d/httpd start
[root@keepalived-master keepalived]# /etc/init.d/keepalived start


Keepalived正常运行后共启动了3个进程,其中一个进程是父进程,它负责监控其余两个子进程(分别是vrrp子进程和healthcheckers子进程)。然后观察keepalived-master上Keepalived的运行日志


83c417f86b414041a7ac6c2193e9f804.png


【keepalived-master上Keepalived的启动日志】


从日志可以看出


在keepalived-master主节点启动后,VRRP_Script模块首先运行了check_httpd的检查,发现httpd服务运行正常,

然后进入Master角色,如果检查httpd服务异常,将进入Fault状态,

最后将虚拟IP地址添加到系统中,完成Keepalived在主节点的启动。此时在主节点通过命令“ip add”就能查看到已经添加到系统中的虚拟IP地址。


再查看/var/log/keepalived-mysql-state.log日志文件

tail -f /var/log/keepalived-mysql-state.log
[Master]


通过上面给出的三个脚本的内容可知,Keepalived在切换到Master角色后,执行了/etc/keepalived/master.sh这个脚本,从这里也可以看出notify_master的作用。


backup节点


接着在备用节点keepalived-backup上也启动keepalived服务,执行如下操作。

[root@keepalived-backup keepalived]# chkconfig --level 35 httpd on
[root@keepalived-backup keepalived]# /etc/init.d/httpd start
[root@keepalived-backup keepalived]# /etc/init.d/keepalived start


然后观察keepalived-backup上Keepalived的运行日志。


5258c5d4ba9747d9a95139bf43eba614.png

【keepalived-backup上Keepalived的启动日志】


从日志输出可以看出,


keepalived-backup备用节点在启动Keepalived服务后,因为自身角色为Backup,所以会首先进入Backup状态,

接着也会运行VRRP_Script模块检查httpd服务的运行状态,如果httpd服务正常,将输出“succeeded”。


在备用节点查看/var/log/keepalived-mysql-state.log日志文件

tail -f /var/log/keepalived-mysql-state.log
[Backup]


由此可知,备用节点在切换到Backup状态后,执行了/etc/keepalived/backup.sh这个脚本。


Keepalived的故障切换过程分析

下面开始测试Keepalived的故障切换(failover)功能。


  • 首先在keepalived-master节点关闭httpd服务,然后看看Keepalived是如何实现故障切换的。
  • 在keepalived-master节点关闭httpd服务后,紧接着查看Keepalived的运行日志

333bfd85f2dc4f739599519e8a0bb004.png

【keepalived-master节点在httpd服务故障后的日志状态】


从日志可以看出,


在keepalived-master节点的httpd服务被关闭后,VRRP_Script模块很快就能检测到

然后进入Fault状态,最后将虚拟IP地址从eth0上移除。

紧接着查看keepalived-backup节点上Keepalived的运行日志


ad58ece190454a5e9f2e108a4f35c4d4.png


从日志可以看出,

  • 在keepalived-master节点出现故障后,备用节点keepalived-backup立刻检测到,此时备用机变为Master角色,并且接管了keepalived-master主机的虚拟IP资源,
  • 最后将虚拟IP绑定在eth0设备上。

Keepalived在发生故障时进行切换的速度是非常快的,只有几秒钟的时间,如果在切换过程中,持续ping虚拟IP地址,几乎没有延时等待时间。


故障恢复切换分析


由于设置了集群中的主、备节点角色,因此,主节点在恢复正常后会自动再次从备用节点夺取集群资源,这是常见高可用集群系统的运行原理。

下面继续演示故障恢复后Keepalived的切换过程。


首先在keepalived-master节点上启动httpd服务。

[root@keepalived-master ~]# /etc/init.d/httpd start


紧接着查看Keepalived运行日志

163009779ccc49a3898b16fbe0249ebc.png


【keepalived-master节点httpd服务恢复后Keepalived的运行日志】


从日志可知,


keepalived-master节点通过vrrp_script模块检测到httpd服务已经恢复正常,

然后自动切换到Master状态,同时也夺回了集群资源,将虚拟IP地址再次绑定在eth0设备上。


继续查看keepalived-backup节点Keepalived的运行日志信息


8d2b2bc0d89e43adabfd1668748fcadd.png


【keepalived-backup节点在keepalived-master节点故障恢复后的日志信息】


可以看出,


keepalived-backup节点在发现主节点恢复正常后,释放了集群资源,重新进入了Backup状态,于是整个集群系统恢复了正常的主、备运行状态。

Keepalived的整个运行过程和切换过程,看似合理,但事实上并非如此。在一个高负载、高并发、追求稳定的业务系统中,执行一次主、备切换对业务系统的影响很大,因此,不到万不得已,尽量不要进行主、备角色的切换。


也就是说,在主节点发生故障后,必须要切换到备用节点,而在主节点恢复后,不希望再次切回主节点,直到备用节点发生故障时才进行切换,这就是不抢占功能,可以通过Keepalived的“nopreempt”选项来实现。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
算法 应用服务中间件 Linux
【keepalived】高可用神器,实现应用的自动主备切换
【keepalived】高可用神器,实现应用的自动主备切换
591 1
|
负载均衡 前端开发 应用服务中间件
企业实战(22)基于Haproxy负载均衡+Keepalived高可用集群实战详解
企业实战(22)基于Haproxy负载均衡+Keepalived高可用集群实战详解
107 0
|
负载均衡 测试技术
LVS+KeepAlived构建高可用集群
LVS+KeepAlived构建高可用集群
104 0
|
运维 应用服务中间件 网络安全
【运维知识进阶篇】集群架构-Nginx高可用Keepalived(二)
【运维知识进阶篇】集群架构-Nginx高可用Keepalived(二)
145 0
|
缓存 运维 网络协议
【运维知识进阶篇】集群架构-Nginx高可用Keepalived
【运维知识进阶篇】集群架构-Nginx高可用Keepalived
158 0
|
机器学习/深度学习 编解码 运维
高可用方案组件,Keepalived详解
高可用方案组件,Keepalived详解
1038 0
|
监控 网络协议 关系型数据库
高可用 - 07 Keepalived 通过 vrrp_script实现对集群资源的监控的几种方式
高可用 - 07 Keepalived 通过 vrrp_script实现对集群资源的监控的几种方式
288 0
|
负载均衡 前端开发 中间件
MyCat - 集群 - keepalived 作用及流程介绍 | 学习笔记
快速学习 MyCat - 集群 - keepalived 作用及流程介绍
MyCat - 集群 - keepalived 作用及流程介绍  | 学习笔记
|
负载均衡 安全 网络安全
构建Keepalived高可用集群
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器.
349 0
|
监控 负载均衡 应用服务中间件
用keepalived搭建企业级nginx高可用方案
用keepalived搭建企业级nginx高可用方案
276 0
用keepalived搭建企业级nginx高可用方案