高可用介绍
简单理解:出现故障,自动恢复,对于用户而言无感知。
专业理解:减少不能对外提供服务的时间。可用性达到9999乃至99999。
高可用实现手段
硬件(使用较少)
软件:使用keepalived,基于VRRP协议来实现,VRRP虚拟路由冗余协议,主要用来解决单点故障问题。
keepalived高可用核心概念总结
- keepalived只要是通过优先级来确认谁是主节点谁是备节点的。
- 主节点故障后恢复情况分为两种,一种是抢占式,另一种是非抢占式,抢占式是指主节点恢复后立刻恢复该节点的使用,非抢占式是指主节点恢复后会变成备用节点,直到备用节点出现故障后再由主节点顶上。
keepalived地址飘逸技术配置
keepalived的配置文件中各行的意思:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01 # 标识身份
}
vrrp_instance VI_1 {
state MASTER # 表示这台主机的身份MASTER/BACKUP
interface eth0 # 指定vip绑定的网卡
virtual_router_id 50 # 定义组名称(必须一致)
priority 150 # 优先级(数值越大越高)
advert_int 1 # 检查间隔时间
authentication {
auth_type PASS # 密码明文认证
auth_pass 1111 # 密码(必须二者保持一致)
}
virtual_ipaddress {
10.0.0.3 # 虚拟ip地址
}
}
具体配置方法:
# 安装keepalived
yum install keepalived -y
修改负载均衡器上的keepalived配置文件如下:
master (优先级) lb01 100
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
backup (优先级) lb02 90
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
systemctl start keepalived
systemctl enable keepalived
使用ip addr查看是否配置虚拟ip成功。
keepalived高可用抢占式与非抢占式
抢占:会发生两次切换,默认是抢占式,对于并发访问非常高的站点,不建议配置抢占式,因为至少会发生两次VIP地址漂移。在master和backup的配置不对等的时候,尤其是master性能高而backup性能低时,建议使用抢占式。
非抢占:
配置步骤建议如下:
- 两个节点的state都必须都配置为backup
- 两个节点都在vrrp_instance中添加nopreempt参数。
- 其中一个节点的优先级高于另一个节点的优先级。
两台服务器都设置为backup后,那么哪个节点为主节点就完全由优先级来决定了。
配置方法:
#Master
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
#Backup
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
keepalived高可用与nginx集成
keepalived和nginx的关系:
nginx仅仅是借助了keepalived的地址漂移机制来实现高可用,别的并没有关系。
配置一组负载均衡
准备环境:
10.0.0.5 已经配置好的负载均衡 ( blog、zh )
10.0.0.6
安装Nginx
拉取10.0.0.5 的配置
目的:确保10.0.0.5 与 10.0.0.6 配置一致,无论通过5 或者 6 都能正常访问 blog 和 zh
[root@lb02 ~]# scp root@172.16.1.5:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
[root@lb02 ~]# yum install nginx -y
[root@lb02 ~]# scp -rp 172.16.1.5:/etc/nginx /etc/
[root@lb02 ~]# nginx -t
[root@lb02 ~]# systemctl enable nginx
[root@lb02 ~]# systemctl start nginx
高可用实现方法为写一个脚本:
内容如下:
[root@lb01 ~]# mkdir /server/scripts -p
[root@lb01 ~]# vim /server/scripts/check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
#给脚本增加执行权限
[root@lb01 ~]# chmod +x /server/scripts/check_web.sh
--------------------------------------------------------------------------------------------
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
#定义脚本路径,定义脚本多久执行一次,定义名称check_web
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
#调用脚本,并运行该脚本
track_script {
check_web
}
}
}
keepalived脑裂
- 什么是脑裂?
当两个节点同时认为自己是唯一处于活动状态的时候,从而出现了资源抢占,双方都在抢占资源的情况下,即为脑裂。 - 脑裂的产生
产生的原因是因为网线松动,或者某一台设备开启了防火墙。 - 脑裂影响的范围
对于无状态的服务,比如nginx,脑裂没有任何影响。
对于有状态的服务,比如mysql,就必须严格防止脑裂的现象出现。脑裂会导致有状态的服务无法正常访问,或者得不到正常的返回结果。