Keepalived 的高可用设置与使用

打印 上一主题 下一主题

主题 1009|帖子 1009|积分 3027

Keepalived 是一款专注于提升网络服务可靠性的开源软件,特点如下:

- 核心功能:提供负载均衡和高可用性服务,适用于基于 Linux的系统和网络架构。

- 编程语言:Keepalived 采用 C 语言编写,包管了其高性能和稳定性。

- 负载均衡:基于 Linux内核模块技术(IPVS, IP Virtual Server),实现第四层(传输层)的负载均衡,有效分配网络流量。

- 健康检查:内置多种健康检查机制,可以大概实时监控后端服务器的运行状态,通过预设的检查策略来确保服务的稳定性。

- 高可用性:通过实现假造路由冗余协议(VRRP),Keepalived 可以大概在主备服务器之间实现快速的故障转移,保障网络服务的连续性。

- 故障检测:集成了边界网关检测协议(BFD, Bidirectional Forwarding Detection),用于快速检测网络故障,并触发 VRRP 状态转换,以实现更快的故障恢复。

- 机动性:Keepalived 的架构计划模块化,各个功能模块可以独立使用,也可以组合使用,以适应不同的网络情况和需求。

- 扩展性:提供了钩子机制,允许用户自界说脚本和步伐,以扩展和定制 VRRP 的行为。

一、安装

Keepalived支持源码安装,同时也可以通过不同操作系统安装工具举行安装。
1.1 在线安装(yum安装)

此处以 CentOS 的 yum工具为例举行安装介绍。
  1. yum install -y keepalived
复制代码
1.2 离线安装(编译安装)


  • 下载安装包
    Keepalived 官网下载地址
  • 解压并安装
    1. #1. 解压:将安装包上传到服务器的 $HOME 目录,并解压
    2. tar -zxvf $HOME/keepalived-2.0.18.tar.gz
    3. #2. 安装配置:使用 configure命令配置"安装目录"与"核心配置文件"所在位置
    4. cd $HOME/keepalived-2.0.18/    #进入解压目录
    5. ./configure --prefix=/usr/local/keepalived --sysconf=/etc
    6. #--prefix:指定 keepalived 的安装位置
    7. #--sysconf:指定 keepalived 核心配置文件所在位置(固定位置,只能使用/etc)
    8. #如果出现安装 libnl/libnl-3 的警告,则安装 `yum -y install libnl libnl-devel`后,重新在 configure一下。
    9. #3. 编译并安装 keepalived
    10. make && make install
    11. #4. 系统服务配置:把 Keepalived 注册为系统服务
    12. #4.1 将 Keepalived 的系统配置文件,拷贝至系统 /etc 目录
    13. cp $HOME/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
    14. cp $HOME/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    15. #4.2 刷新系统服务,加载新添加的 Keepalived 服务
    16. sudo systemctl daemon-reload
    复制代码

二、设置

设置文件 /etc/keepalived/keepalived.conf 中紧张由全局段、VRRP实例段、脚本段组成
2.1 全局设置(global_defs)

允许用户设置全局相关信息,比方邮件关照信息、关键参数设置等,该段设置在Master节点和Backup节点上应当同等。
  1. ! Configuration File for keepalived
  2. global_defs {       #全局配置标识
  3.     notification_email {    #设置报警的邮件地址(依赖本机的 sendmail服务)
  4.         acassen@firewall.loc    #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
  5.         failover@firewall.loc
  6.         sysadmin@firewall.loc
  7.     }
  8.     notification_email_from Alexandre.Cassen@firewall.loc   #邮件的发送地址
  9.     smtp_server 192.168.200.1   #邮件SMTP服务器地址
  10.     smtp_connect_timeout 30     #连接超时时间(邮件SMTP服务器)
  11.     router_id LVS_DEVEL    #路由id:当前安装 keepalived的节点主机唯一标识,但多节点重名不影响(建议使用主机名)
  12.     vrrp_skip_check_adv_addr    #对所有通告报文都检查,会比较消耗性能(启用后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查)
  13.     vrrp_strict         #严格遵守VRRP协议,默认会导致 VIP 无法访问(建议注释此项配置)
  14.     vrrp_garp_interval 0    #报文发送延迟,0表示不延迟
  15.     vrrp_gna_interval 0     #消息发送延迟
  16. }
复制代码
vrrp_strict (建议不加此项设置):严格遵守VRRP协议,启用此项后以下状况,将无法启动服务:

  • 无 VIP 地址
  • 设置了单播邻居
  • 在VRRP版本2中有IPv6地址,开启动此项而且没有设置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问
2.2 假造路由设置(vrrp_instance)

此部门紧张用来界说具体服务的实例设置,包括 Keepalived主备状态、接口、优先级、认证方式和 VIP信息等

1. 每个 VRRP实例可以认为是 Keepalived服务的一个实例, 或作为一个业务服务,在一组 Keepalived服务设置中,VRRP实例可以有多个。

2. 存在于 Master节点中的 VRRP实例设置在 Backup节点中也要有同等的设置(除了节点角色、优先级不同),这样才能实现故障切换转移
  1. vrrp_instance VI_1 {    #VRRP实例名并设定实例名称(一般为业务名称)
  2.     state MASTER    #设定初始VRRP实例角色,表示主机初始状态名称是MASTER(自由定义,体现主从关系即可,如:MASTER/BACKUP,MASTER/SLAVE)
  3.     interface eth0    #该实例绑定的网卡名称
  4.     virtual_router_id 51    #虚拟路由ID标识,范围 0-255;同一VRRP实例中主备设置必须一致,否则将出现脑裂问题;
  5.     priority 100    #优先级设定,权重值范围 1-254,数字越大,表示实例优先级越高;同一个VRRP实例中,Master节点优先级要高于Backup节点;
  6.     advert_int 1    #主备之间同步检查时间间隔,单位秒
  7.     authentication {    #认证机制,防止非法节点进入(同一个VRRP实例的MASTER和BACKUP使用相同的密码才能正常通信)
  8.         auth_type PASS    #认证类型有PASS(Simple Passwd)和AH(IPSEC),官方推荐PASS,验证密码为明文方式,最多8位
  9.         auth_pass 1111
  10.     }
  11.     virtual_ipaddress {    #虚拟IP,可以有多个(vip),VIP将绑定至interface参数配置的网络接口上
  12.         192.168.200.16    #指定VIP,不指定网卡,默认eth0;不指定/prefix, 默认/32
  13.         192.168.200.17/24 dev eth1      #指定VIP,网卡
  14.         192.168.200.18/24 dev eth2 label eth2:1     #指定VIP,网卡,label
  15.         #<IPADDR>/<PREFIX> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
  16.     }
  17.     track_script {    #根据 vrrp_script 的结果,去调整资源优先级
  18.         check_haproxy     #调用脚本
  19.     }
  20.     nopreempt    #非抢占模式(默认为抢占模式),同一VRRP实例中主备设置必须一致。
  21.     preempt_delay 2    #抢占模式的延迟时间,单位秒,范围0~1000;发现低优先级MASTER后,多少秒开始抢占。
  22.     notify_master <script>    #当前节点成为"主节点"时,触发脚本script(脚本需要自定义)
  23.     notify_backup <script>    #当前节点转为"备节点"时,触发脚本script(脚本需要自定义)
  24.     notify_fault <script>    #当前节点出现故障时,触发脚本script(脚本需要自定义)
  25.     notify_stop <script>     #当前VRRP实例停止时,触发脚本script(脚本需要自定义)
  26. }
复制代码
脑裂现象(通常发生在 VRRP(假造路由冗余协议)情况中):当两个或多个路由器同时声明自己是假造路由器的主实例时,它们会争取假造IP 地址的控制权,导致网络通讯停止或数据包丢失。

  • 设置错误:假如 Keepalived 实例的设置不正确,比方使用了相同的假造路由器ID(vartul_router_id)或优先级(priority),它们大概会争取假造 IP 地址的控制权。
  • 通讯故障:当Keepalived 实例之间的通讯停止时(网络或硬件故障),每个实例都大概认为自己是主实例,由于没有收到其他实例的心跳信号。
  • 软件故障:Keepalived 或 VRRP 协议的软件故障也大概导致脑裂现象。
主备的切换模式:抢占式和非抢占式

  • 抢占模式(默认):当高优先级节点恢复后,会抢占低优先级节点成为MASTER;
  • 非抢占模式:允许低优先级节点继续担当MASTER。
2.3 自界说服务检测脚本(vrrp_script)

默认情况下,Keepalived仅仅在节点宕机,或 Keepalived进程停掉的时间,才会启动切换机制。

但在实际工作中,有业务服务停止,而 Keepalived服务还存在的情况,这就会导致用户访问的 VIP无法找到对应的服务。

这时可以使用 Keepalived 触发预制的监测脚本,实现 VIP漂移来继续提供服务。
  1. vrrp_script check_haproxy {    #自定义脚本并设定脚本名称,脚本可被多个实例调用。
  2.     script "/usr/bin/killall -0 haproxy"    #自定义服务监控脚本,通过监控脚本返回的状态码,来识别集群服务是否正常;如果返回状态码是0,则服务正常,反之亦然。
  3.     #script "/usr/bin/nc -nvz -w 2 127.0.0.1 5000"    #使用 netcat (nc) 命令来检查本地主机上的端口 5000 是否处于监听状态。
  4.     interval 3    #脚本检查的间隔时间(监控间隔,单位为秒)。
  5.     fall 3    #失败次数:设置判定 script结果为"失败"时的次数。
  6.     rise 2    #成功次数:设置判定 script结果为"成功"的次数。
  7.     timeout 1    #可选,脚本执行的超时时间,单位为秒。如果脚本在指定的时间内没有完成,它将被视为失败。
  8.     weight -10    #可选,设置当监控脚本执行结果为失败时,触发 priority值调整(|weight值| > 主 - 备),正数为增加优先级,负数为降低优先级,范围-255~255。
  9. }
复制代码
nc 命令参数介绍:

  • n: 不举行 DNS 解析。
  • v: 显示详细信息。
  • z: 扫描但不发送数据。
  • w 2: 设置超时时间为 2 秒。
2.4  设置独立日记文件(使用rsyslog服务)

默认日记存放在系统日记:/var/log/messages

假如ubuntu 没有 /var/log/messages 文件,则将 /etc/rsyslog.d/50-default.conf 中 -/var/log/messages 项放开

  • 设置日记选项
    1. #将 /etc/sysconfig/keepalived 文件中的文件中的 KEEPALIVED_OPTIONS 行,改为 KEEPALIVED_OPTIONS="-D -S 0"
    2. sudo sed -i '/KEEPALIVED_OPTIONS/c\KEEPALIVED_OPTIONS="-D -S 0"' /etc/sysconfig/keepalived
    3. ## KEEPALIVED_OPTIONS 参数介绍:
    4. # --log-detail         -D     详细日志信息。
    5. # --log-facility       -S     设置本地系统日志设备0-7,即 -S 0 为 local0(默认值:LOG_DAEMON)
    复制代码
  • 设置日记规则
    1. #在 /etc/rsyslog.conf 文件的“RULES”下面,添加 keepalived 服务日志配置
    2. #添加内容:“local0.*    /var/log/keepalived.log”
    3. sudo sed -i '/RULES/a\\n\local0.*    /var/log/keepalived.log' /etc/rsyslog.conf
    复制代码
  • 重启生效
    1. #重启 keepalived 和 rsyslog 服务
    2. sudo systemctl restart keepalived rsyslog
    3. #后续 keepalived 活动后,检查日志:
    4. tail -f /var/log/keepalived.log
    复制代码
2.5  实现独立设置文件(include)

当生产情况复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理,可以将不同集群的设置

比如:不同集群的VIP设置放在独立的子设置文件中,使用include 指令可以实现包含子设置文件,格式如下:

include /path/file
<ol>添加子文件设置
vim /etc/keepalived/keepalived.conf
  1. global_defs {   #此处将不需要的全局配置都删除了
  2.     router_id LVS_DEVEL
  3. }
  4. vrrp_script check_haproxy {
  5.     script "/usr/bin/killall -0 haproxy"
  6.     interval 5
  7.     fall 3
  8.     rise 1
  9. }
  10. vrrp_instance VI_1 {
  11.     state MASTER
  12.     interface eth0
  13.     virtual_router_id 51
  14.     priority 100
  15.     advert_int 1
  16.     authentication {
  17.         auth_type PASS
  18.         auth_pass 1111
  19.     }
  20.     virtual_ipaddress {
  21.         192.168.200.16
  22.     }
  23.     track_script {
  24.         check_haproxy
  25.     }
  26. }
  27. include /etc/keepalived/conf.d/*.conf   #引入相关子配置文件
复制代码
新建子设置目次与文件
  1. # 创建子配置目录
  2. mkdir /etc/keepalived/conf.d
  3. # 创建子配置文件
  4. touch /etc/keepalived/conf.d/192.168.200.18.conf
复制代码
添加子设置内容
[code]tee /etc/keepalived/conf.d/192.168.200.18.conf
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表