负载均衡层详解part 4

keepaviled高可用

 一、keepaviled简介

负载均衡由七层负载均衡衍生出多级负载均衡,多出来四层负载均衡,再往前分就是DNS轮询,各种简单的、复杂的场景搭配用就可以了,有一个问题始终没有解决,整个集群架构中有的点是有单点故障问题的,怎么解决这个单点故障问题呢?就用到keepaviled技术。

keepaviled是什么?

​   是一个开源软件,用来解决集群中的单点故障问题,实现高可用。

工作原理:

​   单点故障意味着只有一台机器,这一台我们称之为主,上面部了一个程序keepaviled,我们再准备一台从机器保持和主机器一模一样的配置,在从机上野部一个keepaviled软件,组成机器组,从机不停地检测主机,分配一个VIP,一旦主机出问题就踢出机器组,VIP从主机移到从机上,代替主机工作,主机修复好后,重新启动keepaviled,回到机器组,从机并不停地检测主机的keepaviled。

vip:虚拟ip,只要不是固定死某台机器的ip。都可以叫vip。但是vip是配置在机器之上的IP地址。

使用场景:

​   看具体的架构,可以是lvs 负载均衡+keepaviled,可以是nginx负载均衡+keepaviled,也可以是haproxy负载均衡+keepaviled

为何要用keepaviled

​   解决点单故障问题(vip漂移)

二、keepaviled工作原理及云平台havip与eip

keepaviled工作原理:

  keepaviled是底层基于vrrp协议(虚拟路由冗余协议)工作的,vrrp协议管理服务器,便会把多个服务器组成一个组,同一个组内维护的vip只能有一个,在一个主机组里有两大类角色,master和backup,master节点会朝着自己所在组发送vrrp协议通告(广播包),该组内的多个backup如果收到该vrrp包就认为master活着呢,就不会篡位。如果没有收到,keepaviled就会认为master死掉了,就会从多个backup里找出一个作为新主(篡位),篡位的同时,vip会漂移到新主上。

补充:

  抢占式(preempt):主挂掉后,vip漂到新主上,当旧主重新修复后会重新抢回vip----两次切换

  非抢占式(nopreempt):主挂掉后,vip漂到新主上,当旧主重新修复后不重新抢回vip,指挥做一个从----1次切换。一般推荐这个。

注意点:

  1、vrrp协议依赖局域网发送lan多播或广播包,所以要求被keepaviled管理的机器必须处于同一个lan内才行。

  2、vrrp通告的消息是直接封装在网络层的IP包中发送,不需要专门的网络设备来解析

  3、不需要有专门的物理心跳线,在主、从之间相当于有一根虚拟的心跳线

keepaviled的组成主要有三个模块,分别是core、check和vrrp

  1、core 模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

  2、check 负责健康检查,包括常见的各种检查方式。

  3、vrrp 模块是来实现 VRRP 协议的。

 

keepalived一主多从-环境准备-配置详解

主机规划:

三台web服务器

nginx服务+应用

三台七层负载均衡器

keepalived

初始化环境:

关selinux

关firewalld

配置静态ip

配置时间同步

准备web:

yum install nginx -y

修改配置文件

vim /etc/nginx/nginx.conf

准备七层负载均衡:

安装nginx

yum install nginx -y

配置nginx

events {
worker_connections 1024;
}
http {
upstream web_app_servers {
server 192.168.71.112:8080 weight=1;
server 192.168.71.113:8080 weight=1;
server 192.168.71.114:8080 weight=1;
}
server {
listen 8081;
location / {
proxy_pass http://web_app_servers;
}
}
}

重启nginx

systemctl restart nginx

在七层负载均衡上安装keepalived

yum安装:

 yum install keepalived -y

源码安装:

1、下载地址:
https://www.keepalived.org/download.html

2、解压
tar -zxvf keepalived-2.2.8.tar.gz
cd keepalived-2.2.8
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install

# 3、解释:
--sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错。

如果报错:the build will not support IPVS with IPv6.Please install libnl/libnl-3 dev xxxxxxxxxx
解决方案:
安装 libnl/libnl-3 依赖 yum -y install libnl libnl-devel libnl3* libnl3-devel*,重新configure一下就好了

配置注意容易出错的点:

1、关于优先级的配置,谁会成为主,每个机器要设置的不一样的priority

2、基于现有的网络发包,网卡一定要对应的上,interface

补充:

主挂掉的两种情况:

1、整个机器宕机:keepalived必然死掉了,必然不可能发出crrp通告

2、机器没挂但是工作的软件(nginx或者haproxy)挂掉了:此时应该停掉keepalived,主动禁止发送vrrp通告

 

配置如下:

cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
#全局定义
global_defs {
  script_user root
  enable_script_security
}

vrrp_script chk_nginx {
  # 1、定时检测被高可用的服务的存活状态
  script "/etc/keepalived/check_port.sh"
  # 2、每隔3s运行一次上面的脚本
  interval 3
  # 3、如果脚本运行失败,则降低权重-20,配置下面的设置的priority值基础上减
  # 一旦priority发生变化,基于下述advert_int的设置1s内vrrp就能检测到然后完成主备切换
  weight -20
}

vrrp_instance VI_1 {
  # 1、表示状态是MASTER主机还是备用机BACKUP,初始都设置为BACKUP,然后通过priority来高低来决定谁是主
  state BACKUP
  # 2、一定要与你的网卡对应上,否则错误
  interface ens33
  # 3、所有主备节点保持一致,代表在一个路由组里
  virtual_router_id 251
  # 4、当前节点的优先级,数字越大,优先级越高,节点优先级,值范围0~254,MASTER>BACKUP
  priority 100
  # 5、设定VRRP设备发送广播消息的时间间隔为1s一次,以确定VRRP群组成员的状态同步,确保主挂掉后能够快速进行主备切换
  advert_int 1
  # 6、非抢占式,详解在下面
  nopreempt

  # 7、认证权限密码,防止非法节点进入
  authentication {
      auth_type PASS
      auth_pass 11111111
  }
  # 8、健康检查脚本,在这个脚本里写检测逻辑,某个服务挂掉了,就停掉keepalived重新选出主,vip会飘过去
  track_script {
        chk_nginx
  }
  # 9、虚拟出来的ip,可以有多个(vip)
  virtual_ipaddress {
      192.168.71.200
  }
}

EOF

创建检测脚本:

touch /etc/keepalived/check_port.sh
chmod +x /etc/keepalived/check_port.sh

# 强调
# 强调
# 强调:你脚本的运行时间超过了配置文件中的interval时间,就会被kill -15杀掉
vim /etc/keepalived/check_port.sh

#!/bin/bash
count=$(ps -C nginx --no-header|wc -l)
#1.判断 Nginx 是否存活,如果不存活则尝试启动 Nginx
if [ $count -eq 0 ];then
  systemctl start nginx &>/dev/null & # 放后台运行防止超时
  sleep 1 # 不要sleep太久,超过了keepalived.conf中配置的interval时间就麻烦了
  #2.等待 1 秒后再次获取一次 haproxy 状态#
  count=$(ps -C nginx --no-header|wc -l)
  #3.再次进行判断, 如nginx 还不存活则停止 Keepalived,让地址进行漂移,并退出脚本
  if [ $count -eq 0 ];then
      systemctl stop keepalived
  fi
fi

启动keepalived:

systemctl enable keepalived
systemctl start keepalived
systemctl status keepalived
 
 
 

keepalived维护多个vip

keepalived一个主跟着多个从这种方案的问题:主的在工作,从的一直在闲置着,有点浪费,怎么利用起来?---->变成双主模式。

dns轮询功能,将域名解析为ip地址---->A记录。

负载均衡01配置:

vim /etc/keepalived/keepalived.conf 
global_defs {
  script_user root
  enable_script_security
}

vrrp_script chk_nginx {
  script "/etc/keepalived/check_port.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state MASTER
  interface ens224
  virtual_router_id 51
  priority 100
  advert_int 1
  nopreempt
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  track_script {
        chk_nginx
  }
  virtual_ipaddress {
      192.168.71.200
  }
}

vrrp_instance VI_2 {
  state BACKUP
  interface ens224
  virtual_router_id 52
  priority 80
  advert_int 1
  nopreempt
  track_script {
        chk_nginx
  }
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
      192.168.71.250
  }
}

负载均衡02配置:

vim /etc/keepalived/keepalived.conf 
global_defs {
  script_user root
  enable_script_security
}

vrrp_script chk_nginx {
  script "/etc/keepalived/check_port.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state BACKUP
  interface ens160
  virtual_router_id 51
  priority 80
  advert_int 1
  nopreempt
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  track_script {
        chk_nginx
  }
  virtual_ipaddress {
      192.168.71.200
  }
}

vrrp_instance VI_2 {
  state MASTER
  interface ens160
  virtual_router_id 52
  priority 100
  advert_int 1
  nopreempt
  track_script {
        chk_nginx
  }
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
      192.168.71.250
  }
}

 

加上DNS轮询实现负载均衡:

在dns里添加A记录,让同一个域名解析成多个ip地址(公网)。

dns轮询会配合一整套的负载均衡方案一起使用。

 

#### keepalived脑裂问题

任何vip都有可能因为网络通信问题或防火墙而出现脑裂问题,即同一个vip同时出现在多台负载均衡机器上。

脑裂会带来哪些影响:

​ 会导致网络冲突

怎么处理脑裂问题:

​ 1、当下已经遇到了脑裂,应急处理,恢复业务摆在第一位,先kill一台,保证集群正常

​ 停掉keepalived,停掉服务组件---->nginx或者haproxy,摘掉ip地址

​ 2、预防脑裂
​ (1)做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,最大程度降低损失
​ 例如将报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.
​ 让服务器根据指令自动处理相应故障,这样解决故障的时间更短.
​ (2)一种更彻底的方法是使用第三方检测机制,例如 STONITH(Shoot The Other Node In The Head),也称为"击败"。STONITH 方法需要硬件支持,通过 硬件来关闭或重启认为自己是主节点的其他节点,确保任何时候都只有一个节点在运行。
​ 最后,这是一个复杂的主题,需要根据你的特定环境和需求来决定最佳的策略。一般来说,建议通过专门的网络管理和监视工具来监控你的网络状态,及时发 现并解决任何可能导致脑裂的问题。
​ (3)引入分布式协调服务如ZooKeeper等服务器,用于节点间的健康检查和领导选举。

​ (4)自己写脚本,运行于脑裂之外的机器上,作为第三方检测。基于arping 命令,判断是否出现脑裂,然后停掉keepalived,停掉服务组件---->nginx或者haproxy,摘掉ip地址。

 

### 集群扩容方案

负载均衡层方案,有七层的有四层的,四层代理七层的多级代理方案,还有四层前面多一个dns解析,为了防止单点故障还可以在四层做keepalived,还可以提供双主模式。

集群构建好了之后,不是固定死了就这些节点,每一层都有可能加机器去抗压力。

 

posted @ 2025-09-18 13:55  张仁国  阅读(11)  评论(0)    收藏  举报
目录代码