HA高可用服务

网站架构演变

概述

高可用:HA HighAvailablity 👉 Keepalived
生成vip地址,dns解析到这个ip地址即可.

原理

keepalived是基于VRRP协议实现高可用;高可用就是给负载均衡加一个备用节点;也可以给堡垒机使用,keepalived和很多软件搭配实现高可用,之前是给lvs使用的
VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用 .目前keepalive实现vrrp协议,通过vrrp实现高可用.
分为主,备;一般是2个节点.主备之间通过vrrp协议发送数据包沟通.
主给备定期发送数据包 ,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.
vrrp协议使用组播的ip. 224.xx.xx.x

部署与使用

机器清单:

lb01+lb02,部署nginx + keepalived

两台节点配置一摸一样

部署服务

keepalived配置文件分类(分为3个部分)

#lb01 lb02

yum install -y keepalived

cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局定义部分
global_defs {
router_id lb01 #每一个keepalived的名字,当前网络中唯一.
}
#vrrp实例配置部分 用于配置VIP 设置主备 virtual_ipaddress
#vrrp设置名字.
vrrp_instance vip_3 { #vrrp实例名字 在同1对主备之间要一致. 在当前keepalived软件中唯一.
state MASTER #主/备 MASTER主 BACKUP备 (大写字母)
interface ens33 #指定网卡
virtual_router_id 51 # 同1对主备之间这个id要一致.
priority 100 #优先级 数字越大优先级越高 设置建议: 主>备 100 50 相差50
advert_int 1 #心跳间隔 多久发送一次vrrp数据包;advert_int=1单位是秒
authentication { #授权与认证,保持默认即可. 对数据包加密.
auth_type PASS #简单认证
auth_pass 1111 #1111
}
virtual_ipaddress { #设置vip※※※※
10.0.0.3 dev ens33 label ens33:0 #label 设置了别名
}
}

lb01配置

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}

抓包查看

如果wireshark无法使用可以使用tcpdump抓包并保存。然后通过wireshark查看。

tcpdump抓取 vrrp数据包指令 tcpdump -vvv -nnn vrrp -w ~/vrrp.pcap

问题

1) 脑裂故障 ⭐⭐⭐

脑裂/裂脑:主节点与备节点不能互通,都以为对方挂了,向vip发送自己是主节点的组播,这种现象叫脑裂

现象: 主备都有vip .

原因:

🅰 备认为主挂了,接管资源生成VIP.实际上主并没有挂,仍有VIP.
🅱 有很多原因可以导致脑裂,开启 防火墙 ,selinux,keepalived 配置 ,物理线路(网络介质).

解决:

🅰 监控(备节点监控),只要备节点有vip就告警. 🅱 找个第3方机器,在这个机器上执行ssh root@10.0.0.6 hostname -I 检查备节点是否存在vip.
🆎更狠一点监控备节点只要有vip,远程控制主节点,只要备节点认为主挂了,那就让他真的挂了(智能设备).

解决方案:监控脑裂或主备切换脚本.

在keepalived备节点执行监控脚本.

脚本流程步骤:

  1. 统计ip a |grep vip数量
  2. 判断如果等于1则发出告警邮件(使用echo替代).
#!/bin/bash
#author: linuxjk.cn
#desc:检查备节点是否有vip
# 1.vip漂移 ↓出现了
#故障2.脑裂故障
#1.vars
vip=10.0.0.3
#2.check
vip_cnt=`ip a | grep -w 10.0.0.3l wc -l`
#3.if
if [ $vip_cnt -gt 0 ];then
echo "keepalived 异常"
#sshpass -plinuxjk.cn666 ssh lb01 shutdown -h now
fi

2) 案例01-keepalived基于主机高可用软件⭐⭐⭐

问题:

keepalived 只会在主机挂了,网络断开后,才会进行主备切换.
默认情况下keepalived不会监控某个服务.
项目目标: 某个服务关闭了,keepalived就进行主备切换.

解决方案(项目步骤):

书写脚本,过滤服务进程数,端口数量,检查是否运行(curl/wget).
然后在脚本中进行判断如果服务没有运行,则关闭keepalived. ᲼
修改keepalived配置文件,通过keepalived调用这个脚本(监控nginx).

#书写脚本

#!/bin/bash
#author:linuxjk.cn
#desc:检查ngx端口的脚本

#1.vars
port=80
#2.检查

#ss -lntup | grep -wc “$port”
port_count=`ss -lntup | grep -w “$port” | wc -l`
#3.判断
if [ $port_count -eq 0 ];then
#异常
systemctl stop keepalived
fi

注意给脚本执行权限.

脚本名字中不要包含服务名字.

书写keepalived配置文件(调用脚本)

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
#定义监控脚本
vrrp_script keep_lb.sh { 
script /server/scripts/keep_lb.sh
interval 2
weight 1
user root
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
} 
#这个vrrp实例使用 keep_lb.sh 脚本.
track_script {
keep_lb.sh
}
}

写完配置文件后先启动nginx,后启动keepalived,否则keepalive起不来

小结

目标:keepalived监控指定的服务,给指定的服务做高可用.

流程:

书写脚本: 获取服务端口数/进程数,通过if进行判断,如果端口或进程数为0,则关闭keepalived.

修改keepalived配置:

定义脚本
vrrp_script 名字 { script 脚本路径与名字 ....}
调用脚本
vrrp_instance中通过track_script

᲼ 调试与检查

局限:适用于非存储数据的服务(访问量与数据量不大也可以用)

进阶用法

1) 非抢占模式

keepalived 主备默认是抢占式,主挂了,备接管.主恢复,不希望主重新抢回资源.

配置非抢占式模式即可.

这种模式的目的:切换流量时尽量少的变化,避免影响用户

使用流程:

  • 2个节点状态都是备 BACKUP
  • 2. 配置nopreempt选项
  • 配置文件如下:

在state BACKUP下加上一行nopreempt即可,主备配置文件的区别就是①router_id ,一个lb01一个lb02    ②priority权重一个100一个50

2) 双主模式

应对高并发的时候设置的双主模式. 也就是拆分域名.

备用节点分担主的压力
创建一个新的vip,主备关系相反
前提是其中一个机器能否扛住所有的请求

原理:设置两个组播ip,组播vip_3这一组里面lb01为主,vip_4里面lb02为主;我们需要做的就是让不同的域名解析到不同的组播ip上,可以一半一半或者按照访问量分配,尽量让两台机器分担请求,还需要注意避免雪崩现象,提前评估好如果一个挂了,另一个lb是否能承载所有请求

配置文件如图:

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部