keepalived高可用集群
课程目标
-
集群高可用相关概述
-
keepalived+nginx高可用搭建
-
keepalived+lvs高可用搭建
课程实验
-
keepalived+nginx高可用搭建
-
keepalived+lvs高可用搭建
课堂引入
-
服务器的高可用性是衡量一个项目是否稳定的一个重要因素
授课进程
一、集群高可用概述
1、概述
高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外部不间断的提供服务,把因为软件,硬件,认为造成的故障对业务的影响降低到最小程度。总而言之就是保证公司业务7*24小时不宕机
高可用集群的出现是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性所带来的损失。如果某个节点失效,它的备援节点将在几秒钟的时间内接管它的职责。因此,对于用户而言,集群永远不会停机
高可用集群软件的主要作用就是实现故障检查和业务切换的自动化。只有两个节点的高可用集群又称为双机热备,即使用两台服务器互相备份。当一台服务器出现故障时,可由另一台服务器承担服务任务,从而在不需要人工干预的 情况下,自动保证系统能持续对外提供服务。双机热备只是高可用集群的一种,高可用集群系统更可以支持两个以上的节点,提供比双机热备更多、更高级的功能,更能满足用户不断出现的需求变化

2、衡量标准
HA(High Available), 高可用性群集是通过系统的可靠性(reliability)和可维护性(maintainability)来度量的。工程上,通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%
具体HA衡量标准:
-
99% 一年宕机时间不超过4天
-
99.9% 一年宕机时间不超过10小时
-
99.99% 一年宕机时间不超过1小时
-
99.999% 一年宕机时间不超过6分钟

3、技术方案
HA解决方案:keepalived heartbeat corosync cman
在高可用集群解决方案中,keepalived属于最为流行,轻量化的HA解决方案,需要经常辅助脚本进行运行工作
4、特点
-
故障检测和切换
如果在健康检查中发现某个节点或者其服务不可用,Keepalived 将其标记为故障状态。 故障节点的 VIP 将自动迁移到备用节点上,确保服务的可用性。 迁移过程通常包括通知网络设备,以确保流量被正确地重定向到新的活跃节点。
二、keepalived概述
1、概述
Keepalived 是一个基于 VRRP 协议来实现的 LVS 服务高可用方案,可以利用其来避免单点故障。一个 MySQL 或 lvs 或 nginx 服务会有 2 台服务器运行 Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟 IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟 IP,继续提供服务,从而保证了高可用性。
keepalived主要有三个模块,分别是core、check和vrrp。 core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。 check负责健康检查,包括常见的各种检查方式。 vrrp模块是来实现VRRP协议的。
keepalived起初是为lvs设计的,专门用来监控集群系统中各个服务节点的状态,它根据layer3,4 & 5交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或工作出现故障,keepaived将检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,keepalived又可以自动将此服务节点重新加入到集群中,这些工作全部自动完成,不需要人工干预,需要人工完成的只是修复故障节点。
keepalived后来又加入了VRRP 的功能,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,它出现的目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断的、稳定的运行,因此,keepalived一方面具有服务器状态监测和故障隔离功能,另一方面也具有HA Cluster功能
2、架构及核心组件

3、原理
Keepalived是一个基于VRRP协议的软件实现,它的工作原理如下:
1. Keepalived运行在每台服务器上,通过网络监听来自其他服务器的VRRP广播消息。 2. 当一台服务器出现故障或网络异常时,其他服务器会检测到这个变化,并根据VRRP优先级规则,选举出新的主服务器。 3. 新的主服务器会接管故障服务器的IP地址,成为新的虚拟IP(VIP)的拥有者。 4. 虚拟IP(VIP)会被路由器配置为默认网关,从而实现了负载均衡和故障切换。 5. 当故障服务器恢复正常时,它会重新参与选举过程,并根据VRRP优先级规则决定是否成为新的主服务器。
VRRP协议是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换不影响主机间的数据通信,这其中涉及两个概念:物理路由器和虚拟路由器
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,二在虚拟路由器内部,是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称之为主路由器(处于master状态角色)。它拥有对外提供的虚拟ip,提供各种网络功能,比如arp请、icmp、数据转发等,二其他物理路由器不拥有对外提供的虚拟ip,也不提供对外网络功能,仅仅接收master的vrrp状态通告信息,这些路由器被统称为备份路由器(处于backup角色)。当主路由器失效时,处于backup角色的备份路由器将重新进行选举,产生一个新的主路由器进入master角色继续对外服务,整个切换过程对于用户来说完全同名
在一个虚拟路由器中,只有处于master角色的路由器会一直发送vrrp数据包,处于backup角色的路由器只接受master发过来的报文信息,用来监控master运行状态,因此,不会发生master抢占的现象,除非它的优先级更高,而当master不可用时,backup也就无法收到master发过来的报文信息,于是就认定master出现故障,接着多台backup就会进行选举,优先级最高的backup将成为新的master,这种选举并进行角色的过程非常快,因此也就保证了服务的持续可用性
4、安装
yum -y install keepalived systemctl enable keepalived --now
5、配置文件说明
vim /etc/keepalived/keepalived.conf
keepalived 有三类配置区域, 注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域,全局配置(Global Configuration)、VRRPD 配置、LVS 配置
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
#vrrp_script chk_nginx { #健康检查
# script "/etc/keepalived/ck_ng.sh" #检查脚本
# interval 2 #检查频率.秒
# weight -5 #priority减5
# fall 3 #失败三次
# }
# VRRP配置
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。同学们要注意区分。
state MASTER #主或者从状态
interface ens32 #监控网卡
mcast_src_ip 192.168.0.118 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致。同学们注意区分
priority 100 #优先级
advert_int 1 #心跳间隔
authentication { #秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.0.10/24
}
# track_script { #引用脚本
# chk_nginx
# }
#LVS配置
virtual_server 192.168.254.250 80 {
delay_loop 3 #健康检查时间间隔
lb_algo rr #负载均衡调度算法
lb_kind DR #负载均衡转发规则
protocol TCP #协议
real_server 192.168.254.18 80 { #要监控的real_server的ip和端口号
weight 1 #权重
TCP_CHECK { #基于tcp协议的检查
connect_timeout 3 #连接时间超时
retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
}
}
real_server 192.168.254.19 80 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
6、问题
1)脑裂概述
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。
2)原因
因心跳线坏了(包括断了,老化)。 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。 因心跳线间连接的设备故障(网卡及交换机)。 因仲裁的机器出问题(采用仲裁的方案)。 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
3)解决方案
添加冗余的心跳线
例如:双线条线(心跳线也HA),尽量减少“裂脑”发生几率;
设置仲裁机制
例如设置参考IP(如网关IP或某一个服务器),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅“心跳”、还兼对外“服务”的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
裂脑的监控报警
如邮件及手机短信等或值班,在问题发生时人为第一时间介入仲裁,降低损失。
三、keepalived+nginx
1、拓扑图
2、环境要求
本次实验总共需要三台机器,一台作为nginx代理服务器,2台作为后端的web服务器
| IP地址 | 主机名称 | 网络配置 | 配置要求 | 服务器角色 |
|---|---|---|---|---|
| 192.168.217.143 192.168.229.130 | nginx-master | VMnet0,VMNet8(nat) | 1CPU、1GB内存、20G磁盘 | nginx负载均衡master |
| 192.168.217.144 192.168.229.129 | nginx-backup | VMnet0,VMNet8(nat) | 1CPU、1GB内存、20G磁盘 | nginx负载均衡backup |
| 192.168.229.131 | tomcat-user | VMNet0 | 1CPU、1GB内存、20G磁盘 | web服务器-user |
| 192.168.229.132 | tomcat-admin | VMNet0 | 1CPU、1GB内存、20G磁盘 | web服务器-admin |
VMNet0为内网环境,无法访问外网(hostonly)
VMNet8可以访问外网,提供了统一的入口(net)
注意:搭建环境时,先全部用外网,等环境搭建好了之后,配置网络
3、master
1. 安装keepalived
yum -y install keepalived
2. 修改配置文件
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。同学们要注意区分。
state MASTER #主或者从状态
interface ens33 #监控网卡
mcast_src_ip 192.168.217.143 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致。同学们注意区分
priority 100 #优先级
advert_int 1 #心跳间隔
authentication { #秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.217.121/24
}
}
3. 设置keepalived开机启动并立即启动
systemctl enable keepalived --now

4、backup
1. 安装keepalived
yum -y install keepalived
2. 修改配置文件
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。同学们要注意区分。
state BACKUP #主或者从状态
interface ens33 #监控网卡
mcast_src_ip 192.168.217.148 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致。同学们注意区分
priority 97 #优先级
advert_int 1 #心跳间隔
authentication { #秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.217.121/24
}
}
3. 设置keepalived开机启动并立即启动
systemctl enable keepalived --now

5、演示
1)正常访问
访问地址:http://192.168.217.121/

2)关闭master访问
nginx-master: systemctl stop network


3)重启master访问
nginx-master: systemctl start network


4)关闭master的nginx访问
nginx-master: systemctl stop nginx

6、nginx状态监控
keepalive只能相互检查对方的进程是否还存活,所以对nginx没有任何一点监控作用,当nginx宕机后,keepalived进程还存活着就会导致web项目无法访问,所以后续需要编写一个shell脚本来完成对nginx进程的判断
1. 编写nginx状态监控的shell脚本 2. 修改keepalived的配置文件,启动nginx状态监控的shell脚本 3. 重启keepalived服务 4. 关闭nginx-master中的nginx服务,查看效果
注意:以上1-3步骤,master跟backup上都要执行
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
systemctl start nginx
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
systemctl stop keepalived
fi
fi
注意,需要给check_nginx.sh添加可执行的权限
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
router_id 1 #设备在组中的标识,设置不一样即可
}
vrrp_script chk_nginx { #健康检查
script "/etc/keepalived/check_nginx.sh" #检查脚本
interval 2 #检查频率.秒
weight -5 #priority减5
fall 3 #失败三次
}
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。同学们要注意区分。
state BACKUP #主或者从状态
interface ens33 #监控网卡
mcast_src_ip 192.168.217.148 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致。同学们注意区分
priority 97 #优先级
advert_int 1 #心跳间隔
authentication { #秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.217.121/24
}
track_script { #引用脚本
chk_nginx
}
}
如果不生效,查看日志:tail -f /var/log/messages
WARNING - default user 'keepalived_script' for script execution does not exist - please create
在配置文件中添加运行健康检查脚本的用户或者组:
global_defs { script_user root enable_script_security }
7、邮件发送
1. 安装软件 yum install mailx -y 2. 获取邮箱的授权码 qloimkptbjsvcbbg 3.创建一个SSL证书 mkdir -p /root/.certs #创建证书目录 bash -c "echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/qq.crt" #获取邮件服务器证书 chmod +x /root/.certs/qq.crt #qq.crt 添加执行权限 bash -c 'certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/qq.crt' #添加global证书到数据库 bash -c 'certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/qq.crt' #添加SSL证书到数据库 bash -c 'certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d /root/.certs -i /root/.certs/qq.crt' #指定受信任证书,防报错 4. 配置邮箱信息 vim /etc/mail.rc set from=575913717@qq.com #设置邮件发送方 set smtp=smtps://smtp.qq.com:465 #邮件服务器,我这里是qq set smtp-auth-user=575913717@qq.com #smtp验证用户邮箱 set smtp-auth-password=acrtppbgewrlbfgd #邮箱授权码 set smtp-auth=login #认证方式 set ssl-verify=ignore #忽略SSL验证 set nss-config-dir=/root/.certs #证书目录 测试发送邮件:echo ceshi | mail -s test 575913717@qq.com 5. 编写发邮件的脚本 vim /etc/keepalived/mail.sh #!/bin/bash mail_dst=357504721@qq.com mail_sub="负载均衡服务器发生了切换" mail_msg="date: 切换的动作为:$1" echo $mail_msg | mail -s "$mail_sub" $mail_dst chmod 755 /etc/keepalived/mail.sh 6. 修改keepalived配置文件 vim /etc/keepalived/keepalived.conf notify_master "/etc/keepalived/mail.sh master" notify_backup "/etc/keepalived/mail.sh backup" notify_fault "/etc/keepalived/mail.sh fault"


四、keepalived+lvs
1、拓扑图
2、环境要求
本次实验总共需要三台机器,一台作为LVS代理服务器,2台作为后端的web服务器
| IP地址 | 主机名称 | 网络配置 | 配置要求 | 服务器角色 |
|---|---|---|---|---|
| 192.168.217.143 192.168.229.130 | lvs-master | VMnet0,VMNet8(nat) | 1CPU、1GB内存、20G磁盘 | lvs负载均衡master |
| 192.168.217.144 192.168.229.129 | lvs-backup | VMnet0,VMNet8(nat) | 1CPU、1GB内存、20G磁盘 | lvs负载均衡backup |
| 192.168.229.131 | tomcat-user | VMNet0 | 1CPU、1GB内存、20G磁盘 | web服务器-user |
| 192.168.229.132 | tomcat-admin | VMNet0 | 1CPU、1GB内存、20G磁盘 | web服务器-admin |
VMNet0为内网环境,无法访问外网(hostonly)
VMNet8可以访问外网,提供了统一的入口(net)
注意:搭建环境时,先全部用外网,等环境搭建好了之后,配置网络
3、master
1. 安装配置Keepalived和ipvsadm
yum install keepalived ipvsadm -y
2. 修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Director1 #两边不一样。
}
vrrp_instance VI_1 {
state MASTER #另外一台机器是BACKUP
interface ens32 #心跳网卡
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 150 #优先级
advert_int 1 #检查间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.217.20/24 dev ens33 #VIP和工作接口
}
}
virtual_server 192.168.217.20 80 { #LVS 配置,VIP
delay_loop 3 #服务论询的时间间隔,#每隔3秒检查一次real_server状态
lb_algo rr #LVS 调度算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.229.118 80 {
weight 1
TCP_CHECK {
connect_timeout 3 #健康检查方式,连接超时时间
}
}
real_server 192.168.229.119 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
3. 设置keepalived开机自启及立即启动
systemctl enable keepalived --now
4. 重启服务器
reboot
4、backup
1. 安装配置Keepalived和ipvsadm
yum install keepalived ipvsadm -y
2. 修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Director2 #两边不一样。
}
vrrp_instance VI_1 {
state BACKUP #另外一台机器是BACKUP
interface ens33 #心跳网卡
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #优先级
advert_int 1 #检查间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.217.20/24 dev ens33 #VIP和工作接口
}
}
virtual_server 192.168.217.20 80 { #LVS 配置,VIP
delay_loop 3 #服务论询的时间间隔,#每隔3秒检查一次real_server状态
lb_algo rr #LVS 调度算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.229.118 80 {
weight 1
TCP_CHECK {
connect_timeout 3 #健康检查方式,连接超时时间
}
}
real_server 192.168.229.119 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
3. 设置keepalived开机自启及立即启动
systemctl enable keepalived --now
4. 重启服务器
reboot
5、web
1. tomcat服务器的lo网卡设置子网掩码为32位vip user: ifconfig lo:0 192.168.217.20/32 admin: ifconfig lo:0 192.168.217.20/32 2. tomcat服务器设置内核参数 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # 忽略arp响应 ,不允许收 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # 为了让vip发包出去 3. 修改tomcat的端口号为80 修改server.xml中的8080为80端口
课堂小结
课后作业
-
完成课堂的案例及练习
-
将今天的内容整理为思维导图的形式
-
完成以下的面试题
1、keepalived的工作原理?
2、如何解决keepalived脑裂问题?
3、项目中的负载均衡高可用是如何实现的?
扩展内容
无
1万+

被折叠的 条评论
为什么被折叠?



