高可用方案组件,Keepalived详解

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 高可用方案组件,Keepalived详解

    Keepalived是Linux下一个轻量级的高可用解决方案,它与HeartBeat、RoseHA实现的功能类似,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能

完善的高可用软件,它提供了HA软件所需的基本功能,比如心跳检测和资源接管,监测集群中的系统服务,在集群节点间转移共享IP地址的所有者等,HeartBeat功能强大,但是部署和使用相对比较麻烦;与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能

参考官网:Keepalived for Linux

Keepalived是什么:

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态。它根据TCP/IP参考模型的第三、第四和第五层交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或工作出现故障,Keepalived将检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,Keepalived又可以自动将此服务节点重新加入服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

Keepalived后来又加入了VRRP的功能,VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定的运行。因此,keepalived一方面具有服务器状态检测和故障隔离功能,另一方面也具有HA cluster功能。

工作原理

Keepalived通过VRRP(virtual router redundancy protocol)虚拟路由冗余协议来实现高可用。 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组会有1个master角色和N(N≥1)个backup角色。

Keepalived有三个模块:core、check、vrrp。
其中:

core模块为Keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;

check模块负责健康检查;

vrrp负责实现vrrp协议。

Keepalived的体系结构

Keepalived的体系结构从整体上分为两层,分别是用户空间层(User Space)和内核空间层(Kernel Space)。

内核空间层处于最底层,它包括IPVS和NETLINK两个模块。IPVS模块是Keepalived引入的一个第三方模块,通过IPVS可以实现基于IP的负载均衡集群。IPVS默认包含在LVS集群软件中。而对于LVS集群软件,相信做运维的读者并不陌生:在LVS集群中,IPVS安装在一台叫做Director Server的服务器上,同时在Director Server上虚拟出一个IP地址对外提供服务,而用户必须通过这个虚拟IP地址才能访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达Director Server,然后有Director Server从服务器集群节点中选取一个服务节点响应用户的请求。

Keepalived最初就是为LVS提供服务的,由于Keepalived可以实现对集群节点的状态检测,而IPVS可以实现负载均衡功能,因此,Keepalived借助于第三方模块IPVS就可以很方便地搭建一套负载均衡系统。在这里有个误区,由于Keepalived可以和IPVS一起很好地工作,因此很多学者都以为Keepalived就是一个负载均衡软件,这种理解是错误的。

在Keepalived中,IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时打开负载均衡功能,也可以通过配置编译参数关闭。

NETLINK模块主要用于实现一些高级路由框架和一些相关的网络功能,完成用户空间层Netlink Reflector 模块发来的各种网络请求。

用户空间层位于内核空间层之上,Keepalived的所有具体功能都在这里实现,下面介绍几个重要部分所实现的功能。

在用户空间层,Keepalived又分为4个部分,分别是Scheduler I/O Multiplexer、Memory Management、Control Plance和Core components。其中,Scheduler I/O Multiplexer是一个I/O复用分发调度器,他负责安排Keepalived所有内部的任务请求。Memory Management是一个内存管理机制,这个框架提供了访问内存的一些通用方法。Control Plane 是Keepalived的控制面板,可以实现对配置文件进行编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置。而是只有在用到某模块时才解析相应的配置。最后详细说一下Core components,这部分是Keepalived的核心组件,包含了一系列功能模块,主要有WatchDog、Checkers、VRRP Stack、IPVS wrapper 和Netlink Reflector,下面介绍每个模块所实现的功能如下:

1、WatchDog

WatchDog是计算机可靠性领域中一个极为简单又非常有效的检测工具,它的工作原理是针对被监视的目标设置一个计数器和一个阈值,WatchDog会自己增加此计数值,然后等待被监视的目标周期性地重置该计数值。一旦被监控目标发生错误,就无法重置此计数值,WatchDog就会检测到,于是采取对应的恢复措施,例如重启或关闭。

在linux中很早就引入了WatchDog功能,而Keepalived正是通过WatchDog的运行机制来监控Checkers和VRRP进程的。

2、 Checkers

这是Keepalived最基础的功能,也是最主要的功能,可实现对服务器运行状态检测和故障隔离。

3、 VRRP Stack

这是Keepalived后来引入的VRRP功能,可以实现HA集群中失败切换(Failover)功能。Keepalived通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群系统。

4、 IPVS wrapper

这是IPVS功能的一个实现。IPVS wrapper模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现IPVS模块的负载均衡功能。

5、 Netlink Reflector

用来实现高可用集群中Failover时虚拟IP(VIP)的设置和切换。Netlink Reflector的所有请求最后都发送到内核空间层的NETLINK模块来完成。

配置文件说明

keepalived配置文件按层级和模块划分的,每层由"{ }"来界定。 在主配置文件中可以通过include来涵盖多个子配置文件。 语法说明:

BOOL: on|off|true|false|yes|no

TIMER: 以秒为单位的时间值,包括小数秒,如3,2.71828。计时器的分辨率是微妙。

关于脚本引用:

双引号"字符串中嵌入其他双引号或空格,那么字符串将仅在带引号的字符串之后结束(如:"abcd" efg h jkl "mnop" 等同于 "abcd efg h jkl mnop";)。

对于使用参数指定脚本,不带引号的空格将分隔参数。如果参数需要包含空格,则应将其括在单引号(')中

配置文件结构

配置文件包括以下几个模块:

1.GLOBAL  CONFIGURATION

  包含配置文件中的global_defs、static_ipaddress、static_route区域,负责定义邮件的相关配置、route_id、vrrp配置、多播地址、节点的ip和路由信息等

global_defs 全局配置
vrrpd
    1. vrrp_script添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
    2. vrrp_sync_group将所有相关的VRRP实例定义在一起,作为一个VRRP Group,如果组内的任意一个实例出现问题,都可以实现Failover
    3. garp_group
    4. vrrp_instance
LVS配置
virtual_server
    real_server
real_server中的健康检查
HTTP_GET or SSL_GET
TCP_CHECK
TCP_CHECK
DNS_CHECK
DNS_CHECK

image.gif

全局配置模块

! Configuration File for keepalived
global_defs {                                     #全局定义部分
    notification_email {                          #设置报警邮件地址,可设置多个
        acassen@firewall.loc                      #接收通知的邮件地址
        failover@firewall.loc
    }                        
    notification_email_from test0@163.com         #设置 发送邮件通知的地址
    smtp_server smtp.163.com                      #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
    smtp_connect_timeout 30                       #设置 连接 smtp server的超时时间
    router_id LVS_DEVEL                           #主机标识,用于邮件通知
    vrrp_strict                                   #严格执行VRRP协议规范,此模式不支持节点单播
    script_user keepalived_script                 #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
    enable_script_security                        #如过路径为非root可写,不要配置脚本为root用户执行。
}

image.gif

2.BFD CONFIGURATION

  用于快速检测系统之间的通信故障,并在出现故障时通知上层应用。

  它具有两优点:

  对网络设备间任意类型的双向转发路径提供快速、轻负荷的故障检测

  用单一的机制对任何介质、任何协议层进行实时检测,并支持不同的检测时间与开销

3. VRRPD CONFIGURATION

包含配置文件中的vrrp_script、vrrp_instance、vrrp_sync_group、garp_group区域,负责定义每个vrrp虚拟路由器

vrrp_script配置

作用:添加一个周期性执行的脚本。脚本的退出状态码会被调用它的所有的VRRP Instance记录。
注意:至少有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-254.
vrrp_script <SCRIPT_NAME> {
          ...
    }
选项说明:
script "/path/to/somewhere":指定要执行的脚本的路径。
interval <INTEGER>:指定脚本执行的间隔。单位是秒。默认为1s。
timeout <INTEGER>:指定在多少秒后,脚本被认为执行失败。
weight <-254 --- 254>:调整优先级。默认为2.
rise <INTEGER>:执行成功多少次才认为是成功。
fall <INTEGER>:执行失败多少次才认为失败。
user <USERNAME> [GROUPNAME]:运行脚本的用户和组。
init_fail:假设脚本初始状态是失败状态。
解释:
weight: 
1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。
2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。
3. 其他情况下,priority不变

image.gif

vrrp_instance

命令说明:
state MASTER|BACKUP:指定该keepalived节点的初始状态。
interface eth0:vrrp实例绑定的接口,用于发送VRRP包。
use_vmac [<VMAC_INTERFACE>]:在指定的接口产生一个子接口,如vrrp.51,该接口的MAC地址为组播地址,通过该接口向外发送和接收VRRP包。
vmac_xmit_base:通过基本接口向外发送和接收VRRP数据包,而不是通过VMAC接口。
native_ipv6:强制VRRP实例使用IPV6.(当同时配置了IPV4和IPV6的时候)
dont_track_primary:忽略VRRP接口的错误,默认是没有配置的。
track_interface {
  eth0
  eth1 weight <-254-254>
  ...
}:如果track的接口有任何一个出现故障,都会进入FAULT状态。
track_script {
  <SCRIPT_NAME>
  <SCRIPT_NAME> weight <-254-254>
}:添加一个track脚本(vrrp_script配置的脚本。)
mcast_src_ip <IPADDR>:指定发送组播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
unicast_src_ip <IPADDR>:指定发送单薄数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
version 2|3:指定该实例所使用的VRRP版本。
unicast_peer {
   <IPADDR>
   ...
}:采用单播的方式发送VRRP通告,指定单播邻居的IP地址。
virtual_router_id 51:指定VRRP实例ID,范围是0-255.
priority 100:指定优先级,优先级高的将成为MASTER。
advert_int 1:指定发送VRRP通告的间隔。单位是秒。
authentication {
  auth_type PASS|AH:指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)。
  auth_pass 1234:指定认证所使用的密码。最多8位。
}
virtual_ipaddress {
   <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
   192.168.200.17/24 dev eth1
   192.168.200.18/24 dev eth2 label eth2:1
}:指定VIP地址。
nopreempt:设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级的机器已经上线。如果要使用这个功能,则初始化状态必须为BACKUP。
preempt_delay:设置抢占延迟。单位是秒,范围是0---1000,默认是0.发现低优先级的MASTER后多少秒开始抢占。
通知脚本:
notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
notify <STRING>|<QUOTED-STRING> [username [groupname]]
# 当停止VRRP时执行的脚本。
notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]
smtp_alert

image.gif

vrrp_sync_group

作用:将所有相关的VRRP实例定义在一起,作为一个VRRP Group,如果组内的任意一个实例出现问题,都可以实现Failover。
 vrrp_sync_group VG_1 {
    group {
     inside_network     # vrrp instance name
     outside_network    # vrrp instance name
     ...
    }
    ...
}
说明:
如果username和groupname没有指定,则以默认的script_user所指定的用户和组。
1. notify_master /path/to_master.sh [username [groupname]]
    作用:当成为MASTER时,以指定的用户和组执行脚本。
2. notify_backup /path/to_backup.sh [username [groupname]]
    作用:当成为BACKUP时,以指定的用户和组执行脚本。
3. notify_fault "/path/fault.sh VG_1" [username [groupname]]
    作用:当该同步组Fault时,以指定的用户和组执行脚本。
4. notify /path/notify.sh [username [groupname]]
    作用:在任何状态都会以指定的用户和组执行脚本。
    说明:该脚本会在notify_*脚本后执行。
    notify可以使用3个参数,如下:
    $1:可以是GROUP或INTANCE,表明后面是组还是实例。
    $2:组名或实例名。
    $3:转换后的目标状态。有:MASTER、BACKUP、FAULT。
5. smtp_alert:当状态发生改变时,发送邮件。
6. global_tracking:所有的VRRP实例共享相同的tracking配置。
注意:脚本文件要加上x权限,同时指令最好写绝对路径。

image.gif

4.LVS CONFIGURATION

包含配置文件中的virtual_server_group、virtual_server区域,负责lvs集群配置

LVS模块结构:
virtual_server{
  … ...
  real_server{
    … ...
  }
}

image.gif

virtual_server

virtual_server IP Port | virtual_server fwmark int | virtual_server group string {
  delay_loop <INT>:健康检查的时间间隔。
  lb_argo rr|wrr|lc|wlc|lblc|sh|dh:LVS调度算法。
  lb_kind NAT|DR|TUN:LVS模式。
  persistence_timeout 360:持久化超时时间,单位是秒。默认是6分钟。
  persistence_granularity:持久化连接的颗粒度。
  protocol TCP|UDP|SCTP:4层协议。
  ha_suspend:如果virtual server的IP地址没有设置,则不进行后端服务器的健康检查。
  virtualhost <STRING>:为HTTP_GET和SSL_GET执行要检查的虚拟主机。如virtualhost www.felix.com
  sorry_server <IPADDR> <PORT>:添加一个备用服务器。当所有的RS都故障时。
  sorry_server_inhibit:将inhibit_on_failure指令应用于sorry_server指令。
  alpha:在keepalived启动时,假设所有的RS都是down,以及健康检查是失败的。有助于防止启动时的误报。默认是禁用的。
  omega:在keepalived终止时,会执行quorum_down指令所定义的脚本。
  quorum <INT>:默认值1. 所有的存活的服务器的总的最小权重。
  quorum_up <STRING>:当quorum增长到满足quorum所定义的值时,执行该脚本。
  quorum_down <STRING>:当quorum减少到不满足quorum所定义的值时,执行该脚本。
}

image.gif

real_server

real_server IP Port {
  weight <INT>:给服务器指定权重。默认是1.
  inhibit_on_failure:当服务器健康检查失败时,将其weight设置为0,而不是从Virtual Server中移除。
  notify_up <STRING>:当服务器健康检查成功时,执行的脚本。
  notify_down <STRING>:当服务器健康检查失败时,执行的脚本。
  uthreshold <INT>:到这台服务器的最大连接数。
  lthreshold <INT>:到这台服务器的最小连接数。
}

image.gif

📢文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群💪💪💪

📢创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒

📢你的支持和鼓励是我创作的动力❗❗❗

大家好,欢迎来到Doker品牌,我们专注3C产品。欢迎点赞和评论,您的鼓励是我们持续更新的动力!需要完整资料欢迎加微信进入技术群聊,请前往官网:

Doker 多克

官方旗舰店

Doker 官方旗舰店

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
6月前
【优化篇】使用Keepalived实现简单的GrayLog高可用
【优化篇】使用Keepalived实现简单的GrayLog高可用
70 0
|
负载均衡 测试技术
LVS+KeepAlived构建高可用集群
LVS+KeepAlived构建高可用集群
104 0
|
监控
高可用 - 06 Keepalived基础功能应用实例
高可用 - 06 Keepalived基础功能应用实例
137 0
|
监控 网络协议 数据安全/隐私保护
高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)
高可用 - 05 Keepalived配置(全局配置、VRRPD、LVS)
601 0
|
负载均衡 安全 网络安全
构建Keepalived高可用集群
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器.
349 0
|
负载均衡 网络协议 算法
keepalived 保证集群的高可用
keepalived 保证集群的高可用
keepalived 保证集群的高可用
|
Shell Docker 容器
KeepAlived集群高可用搭建
你的系统是否存在单点故障呢?那么这里我们基于Docker演示下基于KeepAlive的高可用配置。 简介 KeepAlived是一个用C语言编写的路由软件,它的主要目的是为了提供基于Linux服务器的负载均衡和高可用功能。
|
网络架构
Keepalived 介绍、安装、配置(高可用)
1、keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。 2、VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。
1218 0
|
负载均衡 应用服务中间件 nginx
|
Web App开发 测试技术 网络安全