目录
频道首页
📚 keepalive
收藏
0
xy20118 最近修改于 2024-06-30 16:48:06

前言

Vrrp技术

  • 虚拟路由器:Virtual Router 不是真实存在 ,虚构出来的
  • 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器 (标记组 是否为同一组)
  • VIP:Virtual IP 比如: 192.168.64.99 路由1 路由2
  • VMAC:Virutal MAC (00-00-5e-00-01-VRID)
  • 物理路由器:
  • master:主设备
  • backup:备用设备
  • priority:优先级
虚拟路由器的主备 是由priority:优先级决定的

keepalived架构

  • 用户空间核心组件:
  1. vrrp stack:VIP消息通告 虚拟ip
  2. checkers:监测real server(简单来说 就是监控后端真实服务器的服务)是否存活
  3. system call:实现 vrrp 协议状态转换时调用脚本的功能
  4. SMTP:邮件组件(报警邮件)
  5. IPVS wrapper:生成IPVS规则(直接生成ipvsadm)
  6. Netlink Reflector:网络接口(将虚拟地址ip(vip)地址飘动)

WatchDog:监控进程(整个架构是否有问题)

  • 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
  • IO复用器:针对网络目的而优化的自己的线程抽象
  • 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

keepalived工作原理

keepalived 通过选举(按照服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,外部程序可通过该 ip 访问这台服务器,如果这台服务器出现故障(断网,重启等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。

选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举

  1. keepalived 启动的时候
  2. master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)
  3. 有新的备份服务器加入且权重最大

编译安装keepalive

[root@localhost keepalived-2.2.0]# yum install gcc curl openssl-devel libnl3-devel net-snmp-devel  -y #安装依赖环境 
wget https://keepalived.org/software/keepalived-2.2.0.tar.gz
#或者从本地上传至对应文件夹(按需上传对应文件夹就可以)
tar xf keepalived-2.2.0.tar.gz 
cd  keepalived-2.2.0 
.\configure --prefix=/usr/local/keepalived 
make -j2  && make install  #后自动生成service文件 
#编译安装完成后  是没有配置文件的在etc目录下 
mkdir /etc/keepalived 
cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf  #配置文件模板复制到对应配置文件目录下面 

#配置文件虚拟网卡需要修改下接口 按照网卡接口名称 否则无法启动

image image image

相关文件: (已知文件名 可以查看官方文档或者使用
find / -name "keepalived.conf" 2>/dev/null #查看配置文件 2>/dev/nul 错误信息输出到黑洞文件 )

  • 软件包名:keepalived
  • 主程序文件:/usr/sbin/keepalived
  • 主配置文件:/etc/keepalived/keepalived.conf
  • 配置文件示例:/usr/share/doc/keepalived/
  • Unit File:/lib/systemd/system/keepalived.service
  • Unit File的环境配置文件:
  • /etc/sysconfig/keepalived CentOS

配置组成: /etc/keepalived/keepalived.conf 配置组成

  • GLOBAL CONFIGURATION

Global definitions(全局配置):定义邮件配置,route_id,vrrp配置,组播地址 等

  • VRRP CONFIGURATION

VRRP instance(s):定义vrrp协议中的每个vrrp虚拟路由器的规则,基本信息

  • LVS CONFIGURATION(lvs调度服务器的规则设置)

Virtual server group(s) Virtual server(s):LVS集群的VS和RS

LVS(Nginx)+keepalived高可用集群 image

实验思路:

客户机:64.16
VIP:64.99
主:64.11
备:64.10
真实服务器:64.17   64.18   

以Nginx举例子 首先 11 10 两台机器上需要安装Nginx 编译 yum 都可以 配置文件更改:

[root@localhost ~]# vim /etc/nginx/nginx.conf 
建立负载均衡群组 以及指定location 

image

keepalived安装 上面已经安装完成 修改配置文件 主服务64.11:

   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS06
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

   vrrp_script check_down {
   script "/etc/keepalived/ng.sh"  #指定检查脚本位置
   niterval 1  #执行时间间隔1s
   weight -30  #默认0  负数表示 检测出异常是 权重-30 
   fall 3      #连续执行3次失败 转为备
   rise 2      #连续几次成功 从失败重新为主
   timeout 2   #超时时间

}


vrrp_instance VI_1 {
    state MASTER  #指定为主
    interface ens33  #网卡名称
    virtual_router_id 66 #群组标识  主备需要一致 。
    priority 100 #优先级
    advert_int 1  
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.64.99  #vip 地址
      }

   track_script{
   check_down
    }


[root@xyy-7 nginx]# systemctl restart keepalived.service #重启keepalived 
[root@xyy-7 nginx]# systemctl status keepalived #查看是否启动成功
cd /etc/keepalived
vim ng.sh 
#!/bin/bash #指明解释器
killall -0 nginx  #检测信号 非0 异常
chmod +x  /etc/keepalived/ng.sh  #添加脚本的执行权限 
vrrp_script <SCRIPT_NAME> {                 #定义一个检测脚本,在global_defs 之外配置
 &nbsp; &nbsp; script <STRING>|<QUOTED-STRING>         #shell命令或脚本路径(注意执行权限)
 &nbsp; &nbsp; interval <INTEGER>                     #间隔时间,单位为秒,默认1秒
 &nbsp; &nbsp; timeout <INTEGER>                         #超时时间
 &nbsp; &nbsp; weight  <INTEGER:-254..254>             #默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重,即表示 rise.通常使用负值
 &nbsp; &nbsp; fall <INTEGER> &nbsp; &nbsp; &nbsp;                     #执行脚本连续几次都失败,则转换为失败,建议设为2以上
 &nbsp; &nbsp; rise <INTEGER> &nbsp; &nbsp; &nbsp;                     #执行脚本连续几次都成功,把服务器从失败标记为成功
 &nbsp; &nbsp; user USERNAME [GROUPNAME]                 #执行监测脚本的用户或组 &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; init_fail &nbsp; &nbsp; &nbsp; &nbsp;                         #设置默认标记为失败状态,监测成功之后再转换为成功状态
}

image

重启keepalived后 注意状态显示 异常报错 这个位置会有提示 image

备机器64.10

[root@localhost ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS06  #  id一致和主
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_down {
   script "/etc/keepalived/ng.sh"
   interval 1
   weight -30
   fall 3
   rise 2
   timeout 3
}

vrrp_instance VI_1 {
    state BACKUP  #修改为备服务器
    interface ens33
    virtual_router_id 66 #标识需要和主一致
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.64.99
    }

   track_script {
   check_down
   }

}

也需要写一个和主一样的脚本  
chmod +x  /etc/keepalived/ng.sh #需要添加执行全向

客户端: 可以准备两个httpd 或者nginx web即可

根据对应路径选择建立页面的地方

echo "17  17  17  17 17 17"  > /apps/nginx/html/index.html
echo "18 18 18 18 18 18 18" > /var/www/html/index.html 
[root@xyy1 ~]# curl 192.168.64.99
17 17 17 17 17 17
[root@xyy1 ~]# curl 192.168.64.99
18 18 18 18 18 18
#手动关闭主服务器的nginx   确认是否影响请求服务

[root@xyy-7 nginx]# systemctl stop nginx
[root@xyy1 ~]# curl 192.168.64.99
18 18 18 18 18 18
[root@xyy1 ~]# curl 192.168.64.99
17 17 17 17 17 17
[root@xyy1 ~]# curl 192.168.64.99
17 17 17 17 17 17
[root@xyy1 ~]# curl 192.168.64.99
18 18 18 18 18 18
[root@xyy1 ~]# curl 192.168.64.99

image image

脑裂

[root@localhost keepalived]#iptables -A INPUT -s 192.168.64.11 -j REJECT 
#在备份主机中加入此项
[root@localhost keepalived]#ip a
#可以在主备上都发现vip地址

什么是脑裂?

什么是脑裂?
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,
就分裂成为2个独立的个体。
由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享
资源”、争起“应用服务”,就会发生严重后果。共享资源被瓜分、两边“服务”都起不来了;或者两边
“服务”都起来了,但同时读写“共享存储”,导致数据损坏


都有哪些原因导致脑裂?
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
因心跳线坏了(包括断了,老化)。
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
因心跳线间连接的设备故障(网卡及交换机)
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
多组keepalive服务器造成   组播冲突    1.换组播地址   2.改成单播          
默认: 
单播:
组播: 
广播:
A   1 -127
B   128-191
C   192-223
D   224-239          224.0.0.18    


20. 如何解决keepalived脑裂问题?
在实际生产环境中,我们从以下方面防止脑裂:
#同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
#当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源

rsyslog   分割日志

#做好对脑裂的监控报警解决常见方案:
如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
开发检测程序通过监控软件检测脑裂
内容大纲
批注笔记
📚 keepalive
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
云文档
看板