Keepalived备忘录

(241230)

基础内容

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

keepalived体系架构中主要有三个模块,分别是core、check和vrrp。

  • core模块为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
  • vrrp模块是来实现VRRP协议的。
  • check负责健康检查,常见的方式有端口检查及URL检查。

Keepalived工作在TCP/IP模型的第三、四和五层,即网络层、传输层和应用层。

  • 网络层,Keepalived采用ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包,如果某个节点没有返回响应数据包,则认为此节点发生了故障,Keepalived将报告次节点失效,并从服务器集群中剔除故障节点。
  • 传输层,Keepalived利用TCP的端口连接和扫描技术来判断集群节点是否正常。如常见的web服务默认端口80,ssh默认端口22等。Keepalived一旦在传输层探测到相应端口没用响应数据返回,则认为此端口发生异常,从而将此端口对应的节点从服务器集群中剔除。
  • 应用层,可以运行FTP、telnet、smtp、dns等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式,来设定监测各种程序或服务是否正常,若监测结果与设定的正常结果不一致,将此服务对应的节点从服务器集群中剔除。

Keepalived配置文件

配置文件是etc/keepalived/keepalived.conf,该文件主要由global_defs、vrrp_instance和virtual_server三个模块构成。global_defs:全局配置;vrrp_instance:可配置虚拟路由,可以用来做高可用;virtual_server:虚拟服务器,可以用来做负载均衡

global_defs {
    router_id MyRouter
    log_file /var/log/keepalived.log
    log_detail
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1

    virtual_ipaddress {
        192.168.1.100/24
    }

    track_script {
        check_http
    }

    notify /usr/local/bin/notify_admin.sh  # 故障时执行通知脚本
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 90
    advert_int 1

    virtual_ipaddress {
        192.168.1.101/24
    }

    track_script {
        check_http
    }
}

global_defs 全局配置

  • router_id:指定 Keepalived 实例的唯一标识符,用于在 VRRP 协议中识别每个实例,通常设置为主机名或自定义字符串。
  • log_file:指定日志文件的路径,所有的 Keepalived 日志将记录到该文件。
  • log_detail:启用详细的日志记录,记录更多的调试信息,帮助在排查问题时使用。

vrrp_instance 配置路由

  • state:指定当前节点在 VRRP 实例中的状态,通常分为 MASTER(主节点)和 BACKUP(备份节点)。主节点持有虚拟 IP 地址。
  • interface:指定 VRRP 实例绑定的网络接口。通常是物理网卡的名称(如 eth0)。
  • virtual_router_id:为每个 VRRP 实例分配一个唯一的 ID,范围为 1 到 255。多个节点使用相同的 virtual_router_id 来共享虚拟 IP 地址。
  • priority:设置节点的优先级,默认值为 100。主节点的优先级通常设置为比备份节点更高的值(如 101)。
  • advert_int:设置 VRRP 广播间隔,单位为秒。这个值决定了 VRRP 广播的频率以及主备切换的响应速度。默认值为 1 秒,通常不需要修改,除非需要更快速的故障转移。
  • virtual_ipaddress:虚拟 IP 地址,主节点会将这个虚拟 IP 地址绑定到它的网络接口上。备份节点会在主节点失效时接管该 IP 地址。
  • track_script:用于指定需要健康检查的脚本,确保在主节点失败时进行故障转移。

track_script 健康检查

  • check_http:引用http健康检查

virtual_ipaddress 虚拟IP地址

notify 和 notify_script 全局监控配置

real_servers 真实服务器:用于配置与 LVS (Linux Virtual Server) 配合的虚拟服务器池。

高可用配置文件

# 全局配置
global_defs {
   # 接收邮件
   notification_email {
        example@mail.com    # 修改为目标邮件地址
   }
   # 发送的邮箱
   notification_email_from example@mail.com   # 修改为目标邮件地址
   # 邮件服务器
   smtp_server 127.0.0.1
   # 邮件服务器超时时间
   smtp_connect_timeout 30
   # 路由id,唯一的
!   router_id LVS_DEVEL
!   vrrp_skip_check_adv_addr
   # 开启了此项后没有设置vrrp_iptables则会自动开启iptables防火墙规则,导致VIP地址无法访问,建议不加此项
!   vrrp_strict
   # 与vrrp_strict同时设置时可禁止iptables规则的生成,注释或者无vrrp_strict时可不加此项
!   vrrp_iptables
   # 设置ARP接口之间发送报文的延迟时间,可以精确到毫秒,默认是0
!   vrrp_garp_interval 0
   # 设置非请求消息的发送延迟时间,默认为0
!   vrrp_gna_interval 0
   # 指定要在其下运行脚本的默认用户名/组名,如果未指定此选项,则如果该用户存在,则用户默认为keepalived_script,否则为root,如果未指定groupname,则默认为用户的组。
   script_user root
}

# 配置虚拟路由器
vrrp_instance VIP_1 {
    # 设置此虚拟路由器的初始状态,可选择MASTER或者BACKUP
    state MASTER
    # 绑定当前虚拟路由器所使用的物理接口,如eth0、lo等
    interface eth0
    # 设置虚拟路由器的唯一标识,取值范围为0-255,每个虚拟路由器的该项值必须是唯一的,否则无法启动服务,并且同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一
    virtual_router_id 51
    # 设置当前物理节点在此虚拟路由器中的优先级,优先级取值范围为1-254,值越大优先级越高,每个keepalived节点取值不同
    priority 100
    # 设置VRRP通告的时间间隔,默认为1秒
    advert_int 1
    # 设置认证机制
    authentication {
        # 认证类型,可选择AH和PASS两种,AH为IPSC互联网安全协议认证,PASS为简单密码认证,推荐PASS认证
        auth_type PASS
        # 预共享秘钥设置,仅前8位有效,同一虚拟路由器的多个keepalived节点auth_pass值必须保持一致
        auth_pass 1111
    }
    # 添加虚拟路由器的IP,并可设置IP对应的子网掩码、网卡和标签等,生产中可能会在同一个虚拟路由器上添加上百个IP,不同的IP分行隔开,不指定网卡时默认添加在eth0上,不设置子网掩码时默认为32位。在添加IP地址时,需确保将要使用的IP不存在
    virtual_ipaddress {
        10.211.55.11
    }
    #指定当切换到master时,执行的脚本
    notify_master /opt/keepalived/etc/script/notify_fifo.sh
    #指定当切换到backup时,执行的脚本
    notify_backup /opt/keepalived/etc/script/notify_fifo.sh
    #故障时执行的脚本
    notify_fault /opt/keepalived/etc/script/notify_fifo.sh
    # 通知
    notify /opt/keepalived/etc/script/notify_fifo.sh
    #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知 
    smtp_alert
}

配置邮箱服务器

# 卸载 sendmail(如果已经安装)
# 首先检查是否有 sendmail 安装,如果安装了就卸载它
dpkg -l | grep -i sendmail
if [ $? -eq 0 ]; then
    echo "Sendmail 已安装,准备卸载"
    sudo apt-get remove -y sendmail
else
    echo "Sendmail 未安装,跳过卸载"
fi

# 如果系统中安装了 mail 或 mailx,也卸载它,避免抢占邮件服务器端口
dpkg -l | grep -i mailx
if [ $? -eq 0 ]; then
    echo "mailx 已安装,准备卸载"
    sudo apt-get remove -y mailx
else
    echo "mailx 未安装,跳过卸载"
fi

# 安装 mailx(作为邮件发送工具)
sudo apt-get install -y mailutils  # mailx 的安装包为 mailutils
# 安装 sendmail
sudo apt-get install -y sendmail

# 查看 sendmail 服务状态,确认其是否已启动
systemctl status sendmail

# 如果 sendmail 服务没有启动,则启动它
sudo systemctl start sendmail

# 重启 sendmail 服务
sudo systemctl restart sendmail

# 停止 sendmail 服务
sudo systemctl stop sendmail

# 查看 25 端口是否被占用,确认 sendmail 是否绑定在 25 端口
sudo netstat -tunlp | grep :25

keepalived日志文件

默认的日志位置在/var/log/message,修改日志文件etc/default/keepalived里的KEEPALIVED_OPTIONS可以自定义路径。

etc/default/keepalived

# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-D"

(Debian12.8版本)

# 编辑启动参数,加入-S 0,使用0用户输出日志信息
vim /etc/default/keepalived
KEEPALIVED_OPTIONS="-D -S 0"
# 编辑rsyslog配置文件,定制rsyslog的用户自定义日志功能
vim /etc/rsyslog.conf
local0.*       /var/log/keepalived.log
# 重启rsyslog服务
systemctl restart rsyslog
# 重启keepalived服务
systemctl restart keepalived
# 查看日志
tail -f /var/log/keepalived.log

notify通知

示例

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100
    }

    # 通用通知配置
    notify /etc/keepalived/notify_generic.sh
    # VRRP 特定通知配置
    vrrp_notify_fifo /var/log/vrrp_notify_fifo
    vrrp_notify_fifo_script /etc/keepalived/vrrp_notify_script.sh

    # 当节点变为主节点时执行的脚本
    notify_master /etc/keepalived/notify_master.sh
    # 当节点变为备份节点时执行的脚本
    notify_backup /etc/keepalived/notify_backup.sh
    # 当节点发生故障时执行的脚本
    notify_fault /etc/keepalived/notify_fault.sh

    # 通知 FIFO 文件
    notify_fifo /var/log/keepalived_notify_fifo
    # 通知 FIFO 文件脚本
    notify_fifo_script /etc/keepalived/notify_event.sh
}
  • notify_fifo 是一个 FIFO(First In, First Out) 文件,用于在 Keepalived 进程之间传递通知事件。当 Keepalived 实例接收到通知事件时,它会将事件写入该 FIFO 文件中。其他程序或脚本可以读取该文件,从中获取通知事件。
    用途:用于跨进程或跨服务传递事件信息。
  • notify_fifo_script 是一个脚本路径,当 Keepalived 实例接收到通知事件时,它会执行这个脚本。脚本的输出会被写入到 notify_fifo 文件中,格式通常是:INSTANCE "VI_x" MASTER yyyy,其中 x 是虚拟路由器的 ID,yyyy 是当前虚拟路由器的优先级值。
    用途:通过执行指定脚本处理通知事件。
  • vrrp_notify_fifo:指定用于 VRRP 通知的 FIFO 文件。
  • vrrp_notify_fifo_script:指定用于 VRRP 通知的脚本路径。
  • notify_master 配置项用于指定当 Keepalived 实例从备份节点切换到主节点时执行的脚本或通知操作。当某个节点变为主节点时,系统会触发该配置项指定的脚本或动作。
    用途:当 Keepalived 变为 MASTER 状态时触发通知。
  • notify_backup 配置项用于指定当 Keepalived 实例从主节点切换到备份节点时执行的脚本或通知操作。通常,这在故障转移时触发,即当原主节点不可用时,备份节点接管为主节点。
    用途:当 Keepalived 变为 BACKUP 状态时触发通知。
  • notify_fault 配置项用于指定当 Keepalived 实例出现故障时执行的脚本或通知操作。当一个节点(如主节点或备份节点)故障时,系统会触发该配置项指定的脚本或动作。
    用途:当节点出现故障时,触发通知。
  • notify 是一个通用的通知配置项,用于指定 Keepalived 实例状态发生变化时需要执行的脚本或操作。与 notify_master、notify_backup 和 notify_fault 类似,notify 用于处理任意的状态变化通知。
    用途:处理所有状态变化的通知。
posted @   Mugetsukun  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示