高可用集群
集群类型:
LB:Load Balance 负载均衡
LVS/HAProxy/nginx(http/upstream, stream/upstream)
HA:High Availability 高可用集群
数据库、Redis
SPoF: Single Point of Failure,解决单点故障
HPC:High Performance Computing 高性能集群
系统可用性
SLA:Service-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
VRRP:Virtual Router Redundancy Protocol
虚拟路由冗余协议,解决静态网关单点风险
物理层:路由器、三层交换机
软件层:keepalived

【
VRRP是把多台物理路由器虚拟成“一台永不掉线”的共享 IP 网关,主路由器挂了秒切备份,终端毫无感知。
】
VRRP 相关术语
虚拟路由器:Virtual Router
(虚拟路由器是由两个真实路由器组成的路由器)

虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器(虚拟路由的标识是独一无二的)
VIP:Virtual IP(虚拟路由IP)
VMAC:Virutal 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 服务的高可用性。
主要功能特性:
- 通过 VRRP 协议实现虚拟 IP 地址的自动漂移
- 自动为 VIP 所在节点生成预定义的 IPVS 规则
- 实时监控 IPVS 集群中各 RS(Real Server)的健康状态
- 提供脚本调用接口,支持通过自定义脚本实现 Nginx、Haproxy 等服务的集群管理功能
官网地址:http://keepalived.org/
Keepalived 架构
官方文档:
https://keepalived.org/doc/
http://keepalived.org/documentation.html

用户空间核心组件:
vrrp stack:VIP消息通告
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_id,vrrp配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s):
定义每个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):
LVS集群的VS和RS
配置语法说明
帮助:
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角色,
这样会使vip在KA主机中来回漂移,造成网络抖动,
建议设置为非抢占模式 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服务器并使用脚本绑定VIP至web服务器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:

企业示例: 双主分别实现httpd和mysql服务的调度:

在RS1和RS2中准备httpd和mysql环境:
在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高可用
在两个ka1和ka2先实现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
在两个ka1和ka2两个节点启用内核参数:
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