HA Cluster是指高可用性集群,是保证业务连续性的有效解决方案,一般
有两个或两个以上的节点,且分为活动节点及备用节点。
故障自动切换,MASTER/BACKUP,MASTER宕机了,BACKUP
充当主机使用。主要时解决web服务的单点故障
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS
集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功
能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务
(例如:Nginx、HAproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的(故障切换方
式)。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协
议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它
能够保证当个别节点宕机时,整个网络可以不间断地运行。
(FailOver+VIP漂移)
使用Keepalived进行VIP(虚拟的IP地址),所有服务器共享一个虚拟的
VIP的实现。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将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协议的。
1集群规划
master端和slave端安装同版本的nginx和php(建议直接克隆)
master和slave端
安装keepalived
# yum -y install keepalived -
keepalivedd 配置文件:/etc/keepalived/keepalived.conf
日志文件:/var/log/messages
master和slave端
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { #VI_1vrrp实例组组名(master和slave保持一致)
state BACKUP #角色名称(MASTER/BACKUP)
interface ens33 #网卡名称
virtual_router_id 51 #51:vrrp组的编号(master和slave保持一致)
priority 100 #100:权重(选举时,权重高当选vip的几率大)
advert_int 1
authentication {
auth_type PASS #授权类型(pass
密码)
auth_pass 1111 #组密码(组件集群时,密码必须一致)
}
virtual_ipaddress {
192.168.156.200 #VIP,虚拟的IP地址,需要与集群中的网段保持一致
}
}
启动keepalived
master和slave端
systemctl start keepalived systemctl status keepalived
查看是否挂载VIP
让VIP可以ping通
master和slave端
systemctl restart keepalived
1.3以后版本要注释vrrp_strict,否则虚拟IP无法ping通。可以通过vip访问nginx服务
重启keepaliver: systemctl restart keepalived
master端: systemctl stop network
在slave端查看VIP是否漂移
此时通过访问vip,Nginx还是可以正常提供服务
当手工停止Nginx时,vip并不会发送漂移。因为keepalived服务主要检查keepalived服务状态和网络情况。
编写nginx.sh脚本,自动监控Nginx的运行状态
master和slave端
# mkdir /scripts # vim /scripts/nginx.sh #!/bin/bash nginx_status=`ps -C nginx --no-header |wc -l` if [ $nginx_status -eq 0 ]; then systemctl stop keepalived fi
给nginx.sh添加执行权限
# chmod +x /scripts/nginx.sh
设置keepalived配置nginx.sh脚本
重启keepalived
systemctl restart keepalivedKeepalived配置补充
什么是“抢占模式”
当master发送故障时。vip会自动从master漂移到slave,但是master修复完后,会从新抢占vip
怎么配置"抢占模式"
- 在 /etc/keepalived/keepalived.conf配置MASTER/SLAVE的权重,权重越高,vip选择漂移到哪
- 如果权重一样,则ip地址越大的,VIP选择漂移到哪
什么是“非抢占模式”
当master发送故障时。vip会自动从master漂移到slave,但是master修复完后,vip并不会漂移
怎么配置"非抢占模式"
master和slave端
# vim /etc/keepalived/keepalived.conf
重启keepalived服务:systemctl restart keepalived
VIP脑裂脑裂:指在一个高可用系统中,当联系着的两个节
点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个
节点开始争抢共享资源,结果会导致系统混乱,数据损坏。(简言之:MASTER-SLAVE,两台机器上同时拥有VIP)
MASTER服务器 => 224.0.0.18(组播地址)发送数据包 <= BACKUP服务器(防火墙)
当有一天,BACKUP接受不到组播地址传输过来的数据包了,系统就会认
为MASTER已经宕机。开始选举生成新的MASTER。VIP脑裂最大的产生原因:就是防火墙未关闭或没有把vrrp协议添加到防火墙中。
安装tcpdump抓包服务
# yum install tcpdump -y
查看数据包是怎么发送的
tcpdump -i ens33 vrrp -n
模拟脑裂
slave端
# systemctl start firewalld
查看VIP与抓取vrrp协议的数据包
# ip a # tcpdump -i ens33 vrrp -n
除MASTER机器以外,关闭所有的slave中的keepalived服务
systemctl stop keepalived
检查所有slave服务器端,防火墙是否未关闭或者没有把vrrp协议添加到防火墙规则中
# systemctl stop firewalld
或者添加到防火墙规则
# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 -- protocol vrrp -j ACCEPT # firewall-cmd --reload
这个时候集群就出现了两个vip,即脑裂。可以使用:tcpdump -i ens33 vrrp -n 查看数据包的来源
重新启动BACKUP机器上的keepalived
# systemctl start keepalived单播模式
keepalived在组播模式下所有的信息都会向224.0.0.18的组播地
址发送,产生众多的无用信息,并且会产生干扰和冲突。另一方面,在某些特定环境(云服务器)禁止了组播方式,造成没办法获取到MASTER的数据包信息。
所以需要将其组播的模式改为单播。这是一种安全的方法,避免局域网内有大量的keepalived造成虚拟路由id的冲突(VIP脑裂)。 单播模式需要关闭vrrp_strict这个选项。单播需要在VIP实例配置段加入单播的源地址和目标地址
组播 : MASTER => 224.0.0.18 <= SLAVE
单播 : MASTER => SLAVE1,SLAVE2,SLAVE3
组播改单播
master端
slave端
重启keepalived服务
# systemctl restart keepalived
查看是否改为单播
# tcpdump -i ens33 vrrp -n
已经从组播变为单播



