高可用 HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指通过设计,减少系统服务不可用的时间。假设系统一直能够提供服务,我们说系统的可用性是 100%。如果系统每运行 100 个时间单位,会有 1 个时间单位无法提供服务,我们说系统的可用性是 99%。很多公司的高可用目标是 4 个 9,也就是 99.99%,这就意味着,系统的年停机时间为 0.876 个小时。
实现高可用的核心点:
- 冷备:服务器不启用(域名不解析),使用的时候再开启,需要手动切换。 *** 作费力耗时。
- 热备:服务器在等待状态(监控主服务器状态),一旦主宕机,备就接管,自动切换。
实现热备,引入 VIP(Virtual IP)的切换
通过 VIP 的方式,切换主备服务器
-
默认 VIP 绑定在主服务器(master)
-
master 不可用,就切换 VIP 到备份服务器(backup)
-
用户可以使用到连续性更好的服务,通过 VIP 访问服务器
Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived 除了能够管理 LVS 软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件
3、keepalived 组成和原理Keepalived 软件主要是通过 VRRP 协议实现高可用功能的。
VRRP 是 Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将 N 台提供相同功能的路由器组成一个路由器组,这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 vip(该路由器所在局域网内其他机器的默认路由为该vip),master 会发组播,当 backup 收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当master。这样的话就可以保证路由器的高可用了。
Keepalived 的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。
内核空间:
主要包括 IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和 NETlink(提供高级路由及其他相关的网络功能)两个部份。
用户空间:
WatchDog:负载监控 checkers 和 VRRP 进程的状况
VRRP Stack:负载均衡器之间的失败切换 FailOver,如果只用一个负载均衡器,则 VRRP 不是必须的。
Checkers:负责真实服务器的健康检查 healthchecking,是 keepalived 最主要的功能。换言之,可以没有 VRRP Stack,但健康检查 healthchecking 是一定要有的。
IPVS wrapper:用户发送设定的规则到内核 ipvs 代码
Netlink Reflector:用来设定 vrrp 的 vip 地址等。
keepalived 主要使用三个模块,分别是 core、check 和 vrrp。
-
core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
-
check 负责健康检查,包括常见的各种检查方式。
-
vrrp 模块是来实现 VRRP 协议的。
master 和 backup 主机都需要进行安装
yum -y install keepalived
keepalived 需要使用的目录和文件:
vim /etc/keepalived/keepalived.conf
示例配置文件说明
! Configuration File for keepalived # 发送邮件的配置 global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } # vrrp 协议的配置 vrrp_instance VI_1 { # 工作模式 state MASTER # 监听的网卡 interface eth0 # 虚拟路由 id 需要和备服务器一致 virtual_router_id 51 # 权重 优先级 priority 100 # vrrp 包的发送周期 1s advert_int 1 # 权限验证 authentication { auth_type PASS auth_pass 1111 } # 需要绑定切换的 VIP virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } } ····二、实现主机 HA
- 主服务器配置
! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER # 改为本机的网卡名称 interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # master 默认只需要修改使用 VIP 即可 virtual_ipaddress { 192.168.17.200 } }
- 备服务器配置
! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { # 修改工作模式为备 state BACKUP # 改为本机的网卡名称 interface ens33 virtual_router_id 51 # 优先级要低于 master priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 注意修改 VIP virtual_ipaddress { 192.168.17.200 } }2、启动
分别按照顺序启动主、备服务器的 keepalived
systemctl start keepalived.service && systemctl enable keepalived.service
查看主备服务器的网卡信息
# 需要通过 ip a 命令查看 分别在 server01 和 server02 查看 shell > ip a3、模拟服务器不可用 VIP 切换
服务器整机不可用,常见于服务器断网,或者断电关机等。
方法一:模拟主服务器断电关闭
# 关闭主服务器,VIP 所在服务器 shell > poweroff
方法二:模拟主服务器断网
# 关闭 VIP 所在服务器的网卡,使其不能够联网 shell > service network stop
通过以上实验检测,发现当主服务器整机不可用时,VIP 会自动切换到备用服务器
三、实现服务 HA通过 keepalived 可以直接实现主服务器整机不可用,实现 VIP 的切换。保证用户可以通过 VIP 进行访问服务。
但是实际情况下,往往并不是服务器整机不可用,只是对应的服务或者软件不可用。
比如说:nginx 提供的 web 服务,nginx 进程关闭,服务就不可用了,所以就需要检测当 nginx 不可用时,就切换 VIP。
实现过程分析:
-
VIP 实际是由 keepalived 进行绑定的,所以当 nginx 服务不可用时,就关闭当前机器的 keepalived 即可,释放 VIP。进而绑定到其他备用服务器。
-
编写服务检测脚本,实现检测 nginx 是否可用,不可用则关闭当前所在主机的 keepalived。
-
在 keepalived 配置中调用检测服务脚本。
主备服务器都要添加此脚本
touch /etc/keepalived/check_nginx.sh chmod +x /etc/keepalived/check_nginx.sh
脚本内容:
#!/bin/bash nginx_status=`ps -C nginx --no-header | wc -l` if [ $nginx_status -eq 0 ];then systemctl stop keepalived.service fi2、修改配置
在多台服务器中配置 keepalived 定时触发检测 nginx 的脚本模块
# 在 vrrp_instance 外上面定义 vrrp_script check_nginx { # 调用脚本地址 script /etc/keepalived/check_nginx.sh #检测间隔时间 interval 3 } # 在 vrrp_instance 里调用 track_script { # 上面定义的名称 check_nginx }3、模拟宕机实现服务切换
以上案例已经实现了当服务不可用时,VIP 自动切换到可用服务器。
- 将域名解析到 vip 上
- 用户访问域名
- 关闭主服务器的 nginx,master 的 keepalived自动关闭
- vip 漂移到备用服务器上
- 用户使用无影响
1、非抢占模式脑裂(裂脑):vip 出现在了多台机器上。网络不通畅,禁用了数据包,主备服务器没法通讯,造成备服务器认为主服务器不可用,绑定VIP,主服务器VIP不会释放。
解决方案:
①双备或者多备模式 BACKUP 通过 priority 权重来区分谁的优先级更高
②单播(定向广播)的方式 (一些特定环境禁用了组播方式)
③时间不同步 服务器时间校时
①nopreempt
在主备服务器的配置文件,vrrp_instance段中
②设置state工作模式为BACKUP
两个 keepalived 节点都启动后,默认都是 BACKUP 状态,双方在发送组播信息后,会根据优先级来选举一个 MASTER 出来。由于两者都配置了 nopreempt,所以 MASTER 从故障中恢复后,不会抢占vip。这样会避免 VIP 切换可能造成的服务延迟。
2、单播模式一些特定环境下不允许发送组播,造成备服务器无法收到 vrrp 包,可能会造成脑裂现象。可以通过单播的方式解决。
单播示例配置:注意此语法在 keepalived1.2.11 版本以上支持
unicast_src_ip 192.168.1.21 ##(本地IP地址)
unicast_peer {
192.168.1.22 ##(对端IP地址)此地址一定不能忘记
}
主服务器server01配置
#在vrrp_instace段中加入 #本地IP unicast_src_ip 192.168.17.102 unicast_peer { #对象IP 发送vrrp包给备服务器 192.168.17.101 }
备服务器server02配置
#在vrrp_instace段中加入 #本地IP unicast_src_ip 192.168.17.101 unicast_peer { #对象IP 发送vrrp包给备服务器 192.168.17.102 }
tcpdump抓vrrp包的方式:
shell > tcpdump vrrp -n
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)