Linux keepalived高可用集群
高可用集群简介
最主要得功能是服务得可用性
脑裂
Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
解决脑裂的方案:
1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(指标不治本,只是提高了检测到的概率);
2、设置仲裁机制。两方都不可靠,那就依赖第三方。比如启用共享磁盘锁,ping网关等。(针对不同的手段还需具体分析);
3、算法保证,比如采用投票机制(keepalived没有实现);
其他高可用方案:
heartbeat、pacemaker、 piranha(web页面)
keepalived
keepalived简介:
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
keepalived工作原理:
1、keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
2、将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master
VRRP协议:
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由/网关为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块:
分别是core、check和vrrp。
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。
例子keepalived实现nginx得高可用
环境准备:
Server1:192.168.0.118
Server2:192.168.0.119
VIP:192.168.0.10
server1:
1、创建etc下的keepalived目录,编辑配置文件
2、yum -y install keepalived
3、vi /etc/keepalived/keepalived.conf
! 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_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
# }
}
# scp -r /etc/keepalived/keepalived.conf 192.168.0.119:/etc/keepalived/
systemctl enable keepalived.service 开机启动keepalived
4、安装Nginx
yum -y install nginx
systemctl enable nginx.service
systemctl start nginx.service
systemctl start keepalived.service #启动keepalived
server2:
1、BACKUP服务器的配置需要几处修改
yum -y install keepalived
2、vi /etc/keepalived/keepalived.conf
state MASTER改为 state BACKUP
mcast_src_ip 192.168.0.118改为backup服务器实际的IP mcast_src_ip 192.168.0.119
priority 100改为priority 99
systemctl enable keepalived.service
3、安装Nginx
yum -y install nginx
systemctl enable nginx.service
systemctl start nginx.service
systemctl start keepalived.service
实验完成,客户端开始测试
访问VIP http://192.168.0.10 成功访问
拔掉master的网线。
再次访问会发现还是成功访问得。实际上已经切换到备机。
关于keepalived对nginx状态未知的问题
1、恢复之前的实验。启动两台主机的keepalived和nginx。确保页面访问正常。
关闭master的nginx服务 。systemctl stop nginx
继续访问VIP,请问页面是否会切换到slave呢?
这样是不会得,因为keepalived没有监控到nginx得状态信息,所以keepalived不会进行备机得切换
2、服务的状态和keepalived的关系。
原因是keepalived监控的是接口IP状态。无法监控服务状态。使用脚本进行nginx得监控
编辑监控脚本。
server1:
添加Nginx监控脚本
vi /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
service keepalived stop
fi
fi
chmod +x /etc/keepalived/ck_ng.sh
server2:
添加Nginx监控脚本
vi /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
service keepalived stop
fi
fi
chmod +x /etc/keepalived/ck_ng.sh
启动监控脚本
将上述实验中注释得部分将注释取消掉
重启keepalived即可