高可用集群KEEPALIVED

发布于:2025-07-31 ⋅ 阅读:(12) ⋅ 点赞:(0)
高可用集群
集群类型:
LBLoad Balance 负载均衡
LVS/HAProxy/nginxhttp/upstream, stream/upstream
HAHigh Availability 高可用集群
数据库、Redis
SPoF: Single Point of Failure,解决单点故障
HPCHigh Performance Computing 高性能集群
系统可用性
SLAService-Level Agreement 服务等级协议(提供服务的企业与客户之间就服务的品质、水准、性能
等方面所达成的双方共同认可的协议或契约)
A = MTBF / (MTBF+MTTR
指标 :99.9%, 99.99%, 99.999%,99.9999%
系统故障
硬件故障:设计缺陷、wear out(损耗)、非人为不可抗拒因素
软件故障:设计缺陷 bug
实现高可用
提升系统高用性的解决方案:降低MTTR- Mean Time To Repair(平均故障时间)
解决方案:建立冗余机制
active/passive /
active/active 双主【优于主备,减少服务器空闲】
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active
VRRPVirtual Router Redundancy Protocol
虚拟路由冗余协议,解决静态网关单点风险
物理层:路由器、三层交换机
软件层:keepalived
VRRP是把多台物理路由器虚拟成“一台永不掉线”的共享 IP 网关,主路由器挂了秒切备份,终端毫无感知。
VRRP 相关术语
虚拟路由器:Virtual Router
(虚拟路由器是由两个真实路由器组成的路由器)
虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器(虚拟路由的标识是独一无二的)
VIPVirtual IP(虚拟路由IP)
VMACVirutal MAC (00-00-5e-00-01-VRID)(虚拟路由MAC地址)
物理路由器:
master:主设备
backup:备用设备
priority:优先级
VRRP 相关技术
通告:
心跳(是系统里定时发出的“我还活着”信号给组播地址【连接即可覆盖 N 节点,一个区域内只有一个组播地址】,收不到即认为对方挂了,触发故障切换或告警。),
优先级(可以看出未出现故障时VIP在哪里)等;
周期性
工作方式:
抢占式(当优先级高的出现故障后,优先级低的拿到VIP开始工作,但当优先级高的恢复后会立刻抢回VIP和工作
非抢占式(当优先级高的出现故障后,优先级低的拿到VIP开始工作,优先级高的恢复后,依旧由优先级低的继续工作,直到优先级低的出现故障为止)
安全认证:
无认证
简单字符认证:预共享密钥
MD5
工作模式:
/备:单虚拟路由器
/主:主/备(虚拟路由器1),备/主(虚拟路由器2
Keepalived 部署
keepalived 简介

Keepalived 是基于 VRRP 协议实现的软件解决方案,主要用于保障 IPVS 服务的高可用性。

主要功能特性:

  1. 通过 VRRP 协议实现虚拟 IP 地址的自动漂移
  2. 自动为 VIP 所在节点生成预定义的 IPVS 规则
  3. 实时监控 IPVS 集群中各 RS(Real Server)的健康状态
  4. 提供脚本调用接口,支持通过自定义脚本实现 Nginx、Haproxy 等服务的集群管理功能

官网地址:http://keepalived.org/

Keepalived 架构
官方文档:
https://keepalived.org/doc/
http://keepalived.org/documentation.html
用户空间核心组件:
vrrp stackVIP消息通告
checkers:监测real server
system call:实现 vrrp 协议状态转换时调用脚本的功能
SMTP:邮件组件
IPVS wrapper:生成IPVS规则
Netlink Reflector:网络接口
WatchDog:监控进程
控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
IO复用器:针对网络目的而优化的自己的线程抽象
内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
Keepalived 环境准备
各节点时间必须同步:ntp, chrony
关闭防火墙及SELinux
各节点之间可通过主机名互相通信:非必须
建议使用/etc/hosts文件实现:非必须
各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
Keepalived 相关文件

软件信息:

  • 名称:keepalived
  • 主程序路径:/usr/sbin/keepalived
  • 主配置文件路径:/etc/keepalived/keepalived.conf
  • 示例配置目录:/usr/share/doc/keepalived/
  • 系统服务文件:/lib/systemd/system/keepalived.service
  • 环境配置文件:/etc/sysconfig/keepalive
Keepalived 安装
安装 keepalived
dnf install keepalived -y

开启:

systemctl start keepalived

关闭防火墙,以及SELinux:

systemctl stop firewalld
setenforce 0

查看进程:

ps axf | grep keepalived
KeepAlived 配置说明
配置文件组成部分
配置文件:/etc/keepalived/keepalived.conf
配置文件组成
GLOBAL CONFIGURATION
Global definitions: 定义邮件配置,route_idvrrp配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s)
定义每个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)
LVS集群的VSRS
配置语法说明
帮助:
man keepalived.conf

配置虚拟路由器:
配置master端:(ka1)
vim /etc/keepalived/keepalived.conf
配置slave端:(ka2)
vim /etc/keepalived/keepalived.conf

systemctl restart keepalived.service 

测试:

tcpdump -i ens160 -nn host 224.0.0.18

启用keepalived日志功能
ka1,ka2:
vim /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 6" #日志级别为0-7

#vim /etc/rsyslog.conf
local6.* /var/log/boot.log
systemctl restart keepalived.service rsyslog.service
tail -f /var/log/keepalived.log

实现独立子配置文件
当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理
将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件
在KA下:
mkdir /etc/keepalived/conf.d
vim /etc/keepalived/keepalived.conf

vim /etc/keepalived/conf.d/router.conf

测试:
systemctl restart keepalived.service 

Keepalived 企业应用示例
实现master/slave Keepalived 单主架构
MASTER配置(ka1)
vim /etc/keepalived/keepalived.conf

BACKUP配置(ka2):

抓包观察:
tcpdump -i ens160 -nn host 224.0.0.18
抢占模式和非抢占模式
非抢占模式 nopreempt
默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,
这样会使vipKA主机中来回漂移,造成网络抖动,
建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色
非抢占模块下,如果原主机down, VIP迁移至的新主机, 后续也发生down,仍会将VIP迁移回原主机
ka1的配置:
nopreempt   #非抢占

ka2的配置:
抢占延迟模式 preempt_delay
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回 VIP
ka1:
ka2:
VIP单播配置
默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
master 主机配置:(ka1)
unicast_src_ip 172.25.254.50 #本机IP
    unicast_peer {
        172.25.254.60 #指向对方主机IP
        #如果有多个keepalived,再加其它节点的IP
    }
slave主机中:(ka2)
抓包查看单播效果:
ka1:
tcpdump -i ens160 -nn src host 172.25.254.50 and dst 172.25.254.60

Keepalived 通知脚本配置

keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户
默认以用户keepalived_script身份执行脚本
如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份
脚本的调用方法:
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault
创建通知脚本:
vim /etc/keepalived/mail.sh

#!/bin/bash
mail_dest='  @qq.com'
mail_send()
{
mail_subj="$HOSTNAME to be $1 vip 转移"
mail_mess="`date +%F\ %T`: vrrp 转移,$HOSTNAME 变为 $1"
echo "$mail_mess" | mail -s "$mail_subj" $mail_dest
}
case $1 in
master)
mail_send master
;;
backup)
mail_send backup
;;
fault)
mail_send fault
;;
*)
exit 1
;;
esac

邮件配置:
下载软件:
dnf install s-nail sendmail -y
QQ邮箱配置:
vim /etc/mail.rc
#######mail set##########
set smtp=smtp.qq.com
set smtp-auth=login
set smtp-auth-user=      @qq.com
set smtp-auth-password=hbwdrujbagjqdfji
set from=      @qq.com
set ssl-verify=ignore

添加权限:
chmod +x /etc/keepalived/mail.sh
发送测试邮件:
systemctl enable --now sendmail.service
echo test message |mail -s test     @qq.com

[root@KA1 +K2 ~]#vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
timinglee_zln@163.com
}
notification_email_from timinglee@timinglee.org
测试:在浏览器中观察邮件即可
3.5 实现 master/master 的 Keepalived 双主架构
master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却
很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
master/master 的双主架构:
即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高
服务器资源利用率
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id KA1.timinglee.org
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 1
vrrp_gna_interval 1
enable_script_security #开启keepalived执行脚本功能
script_user root #指定脚本执行用户身份
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 20
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
unicast_src_ip 172.25.254.20
unicast_peer {
172.25.254.30
}
notify_master "/etc/keepalived/mail.sh master"
notify_backup "/etc/keepalived/mail.sh backup"
notify_fault "/etc/keepalived/mail.sh fault"
}

测试:

killall keepalived

实现IPVS的高可用性
实战案例:实现单主的 LVS-DR 模式
准备web服务器并使用脚本绑定VIPweb服务器lo网卡
准备两台后端RS主机:(rs1,rs2)
安装阿帕奇:
yum install httpd -y

写入内容:

echo RS1 - 172.25.254.10 > /var/www/html/index.html

echo RS2 - 172.25.254.20 > /var/www/html/index.html
ip addr add 172.25.254.100/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
vim /etc/sysctl.d
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

配置keepalived:
ka1节点的配置:
virtual_server 172.25.254.100 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP

        real_server 172.25.254.10 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                retry 3
                delay_before_retry 3
                connect_port 80
        }
}
        real_server 172.25.254.20 80 {
        weight 1
        HTTP_GET {
        url {
        path /
        status_code 200
        }
        connect_timeout 1
        retry 3
        delay_before_retry 1
                }
        }
}

ka2的配置:
virtual_server 172.25.254.100 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP


        real_server 172.25.254.10 80 {
                weight 1
                TCP_CHECK {
                        connect_timeout 5
                        retry 3
                        delay_before_retry 3
                        connect_port 80
                }
        }
        real_server 172.25.254.20 80 {
                weight 1
                HTTP_GET {
                        url {
                                path /
                                status_code 200
                        }
                        connect_timeout 1
                        retry 3
                        delay_before_retry 1
                }
        }

}

客户端测试:
for i in {1..6}; do curl 172.25.254.100; done

第一台RS1故障,自动切换至RS2:
企业示例: 双主分别实现httpdmysql服务的调度:
RS1RS2中准备httpdmysql环境:
RS1中:
ip addr add 172.25.254.200/32 dev lo
yum install mariadb-server -y
systemctl enable --now mariadb
mysql -e "grant ALL on *.* to lee@'%' identified by 'lee'"
mysql -ulee -plee -h172.25.254.10 -e 'select @@server_id

RS2中:
ip addr add 172.25.254.200/32 dev lo
yum install mariadb-server -y
vim /etc/my.cnf
server-id=2
systemctl enable --now mariadb
mysql -e "grant ALL on *.* to lee@'%' identified by 'lee'"
mysql -ulee -plee -h172.25.254.102 -e 'select @@server_id'

配置双主模式:
ka1:
vrrp_instance sql {
        state BACKUP
        interface ens160
        virtual_router_id 200
        priority 80
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
        }
        virtual_ipaddress {
                172.25.254.200 dev ens160 label ens160:161
        }
}


virtual_server 172.25.254.200 3306 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        protocol TCP
        real_server 172.25.254.10 3306 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                retry 3
                delay_before_retry 3
                connect_port 3306
        }
}
        real_server 172.25.254.20 3306 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                nb_get_retry 3
                delay_before_retry 3
                connect_port 3306
                }
        }
}

ka2:

vrrp_instance sql {
        state MASTER #主机
        interface ens160
        virtual_router_id 60
        priority 100
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
        }
        virtual_ipaddress {
                172.25.254.200 dev ens160 label ens160:161
        }
}

virtual_server 172.25.254.200 3306 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        protocol TCP
        real_server 172.25.254.10 3306 {
        weight 1
                TCP_CHECK {
                        connect_timeout 5
                        nb_get_retry 3
                        delay_before_retry 3
                        connect_port 3306
                }
        }
        real_server 172.25.254.20 3306 {
        weight 1
                TCP_CHECK {
                        connect_timeout 5
                        nb_get_retry 3
                        delay_before_retry 3
                        connect_port 3306
                }
        }
}
ipvsadm -Ln

客户端测试:
mysql -ulee -plee -h172.25.254.200 -e 'select @@server_id'

mysql -ulee -plee -h172.25.254.200 -e 'select @@server_id'

实现其它应用的高可用性 VRRP Script

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先
动态调整,从而实现其它应用的高可用性功能
参考配置文件:/usr/share/doc/keepalived/keepalived.conf.vrrp.localcheck
实战案例:利用脚本实现主从角色切换
ka1:
vim /mnt/check_lee.sh
#!/bin/bash
[ ! -f "/mnt/lee" ]
chmod +x /mnt/check_lee.sh
vrrp_script check_lee {
        script "/mnt/check_lee.sh"
        interval 1
        weight -30
        fall 2
        rise 2
        timeout 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev ens160 label ens160:160
    }
    unicast_src_ip 172.25.254.50 #本机IP
    unicast_peer {
        172.25.254.60 #指向对方主机IP
        #如果有多个keepalived,再加其它节点的IP
    }chmod +x /mnt/check_lee.sh
    notify_master "/etc/keepalived/mail.sh master"
    notify_backup "/etc/keepalived/mail.sh backup"
    notify_fault "/etc/keepalived/mail.sh fault"
    track_script {
        check_lee
        }
}
touch /mnt/lee
tail -f /var/log/messages

实战案例:实现HAProxy高可用
在两个ka1ka2先实现haproxy的配置:
安装:
yum install haproxy
vim /etc/haproxy/haproxy.cfg
listen webserver
bind 172.25.254.100:80
server web1 172.25.254.10:80 check
server web2 172.25.254.20:80 check
在两个ka1ka2两个节点启用内核参数:
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p

ka1中编写检测脚本:
 mkdir /etc/keepalived/scripts/
vim /etc/keepalived/scripts/haproxy.sh
#!/bin/bash
/usr/bin/killall -0 haproxy
chmod +X /etc/keepalived/scripts/haproxy.sh
ka1中配置keepalived:
vrrp_script check_haproxy {
script "/etc/keepalived/scripts/haproxy.sh"
interval 1
weight -30
fall 2
rise 2
timeout 2
}
vrrp_instance web {
state MASTER
interface ens160
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100 dev ens160 label ens160:160
}
track_script {
check_haproxy
}
}

测试:

systemctl stop haproxy.service

可检测文档:
keepalived -t -f /etc/keepalived/keepalived.conf 


网站公告

今日签到

点亮在社区的每一天
去签到