Keepalive 具体介绍

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云防火墙,500元 1000GB
简介: Keepalive 具体介绍

一    vrrp 介绍

(一) vrrp技术

1,VRRP 相关术语

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

2, VRRP相关技术

通告:心跳,优先级等;周期性

2.1工作方式

抢占式,非抢占式,延迟抢占模式,

2.2安全认证
  • 无认证
  • 简单字符认证:预共享密钥

常用 但是因为是明文 所以意义不大  可以通过改心跳线的组播地址达到保护隐私的作用

  • MD5
2.3 工作模式
  • 主/备:单虚拟路径器
  • 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
2.4 名词具体解释
#通告 是宣告自己的主权,不要妄想抢班夺权,不停的向外
#抢占式 主服务器宕机,过了一段时间修好了,再把主权抢过来
#非抢占式: 主服务器宕机,过了一段时间修好了,原来的主就作为备了
#延迟抢占: 主修好后,等待一定的时间(默认300s)后再次成为主
#安全认证 如没有安全认证,不在集群中的keeplive服务器设置超高的优先级,会造成事故
2.5   主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)    具体介绍

环境:

有两台服务器

虚拟出两台虚拟路由器

第一台虚拟路由器中服务器1为主,服务器2为备,那么虚拟IP1就飘在服务器1上,真正工作的只有服务器1

第二台虚拟路由器中服务器2为主,服务器1为备,那么虚拟IP2就飘在服务器2上,真正工作的只有服务器2

优点:

#提高了资源利用率:

这样主,备服务器同时干活,可以同时运行两个项目

#同样有备份功能:

如果服务器1坏了,服务器2 将同时拥有虚拟IP1和虚拟IP2

缺点:

虽然有备份冗余功能但是对机器的性能要求非常高,当其中一台出现故障,本来一台运行一个任务,现在所有的业务全部压在了一台上,有十分大的风险

二   keepalived介绍

官网:http://keepalived.org/

(一)  keepalived 功能

  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

(二)   Keepalived 架构

官方文档: https://keepalived.org/doc/

http://keepalived.org/documentation.html

  • 用户空间核心组件:
  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复用器:针对网络目的而优化的自己的线程抽象
  • 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

(三)  安装keepalive

yum install keepalived -y

wget 官网

(四)  Keepalived 相关文件

  • 软件包名: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

(五)  配置文件详细介绍

1, /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

2,全局配置介绍

#/etc/keepalived/keepalived.conf 
global_defs {
 notification_email {
 root@localhost
 #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
 root@localhost
  360601212@qq.com 
 }
 notification_email_from keepalived@localhost  
 #发邮件的地址
 smtp_server 127.0.0.1     
 #邮件服务器地址
 smtp_connect_timeout 30   
 #邮件服务器连接timeout
 router_id R1
 #每个keepalived主机唯一标识,建议使用当前主机名,但多节点重名不影响
 vrrp_skip_check_adv_addr  
 #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
vrrp_strict 
#严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置。
 vrrp_garp_interval 0 
 #gratuitous ARP messages 免费ARP报文发送延迟,0表示不延迟
 vrrp_gna_interval 0 
 #unsolicited NA messages (不请自来)消息发送延迟
 vrrp_mcast_group4 224.0.0.18 
 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18 
 vrrp_iptables        
 #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
}

新装的 keppalive 需要改动的地方

3, 配置虚拟路由器

vrrp_instance <STRING> {
#<String>为vrrp的实例名,一般为业务名称
 配置参数
 ......
 }
#配置参数:
state MASTER|BACKUP
#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP
interface IFACE_NAME 
#绑定为当前虚拟路由器使用的物理接口,如:eth0,bond0,br0,可以和VIP不在一个网卡
virtual_router_id VRID 
#每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一,否则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一
priority 100 
#当前物理节点在此虚拟路由器的优先级,范围:1-254,值越大优先级越高,每个keepalived主机节点此值不同
 
advert_int 1
#vrrp通告的时间间隔,默认1s
 
 
authentication { 
#认证机制
 auth_type AH|PASS   
 #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
 auth_pass <PASSWORD> 
 #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
include    /etc/keealived/conf.d/*.conf
virtual_ipaddress { 
#虚拟IP,生产环境可能指定上百个IP地址
 <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
 192.168.200.100 
 #指定VIP,不指定网卡,默认为,注意:不指定/prefix,默认为/32
 192.168.200.101/24 dev eth1   
 #指定VIP的网卡,建议和interface指令指定的岗卡不在一个网卡
 192.168.200.102/24 dev eth2 label eth2:1 
 #指定VIP的网卡label 
}
track_interface { 
#配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
 eth0
 eth1
}

三     实验 LVS + Keepalived 高可用群集

(一) 架构图

简述架构:  66和77 都是代理服务器   提供反向代理服务 指向后端真实服务器

                   且负载均衡

                   因为代理服务器流量最多,容易单点故障,所以在两个代理服务器上都装上keepalive(高可用)  即备胎技术   ,万一66服务器挂了   77备胎也能顶上来

(二)步骤

66 代理服务器  做主人

1,安装keepalive  和lvs  的软件

2,手写配置文件  配置文件只有一份  写之前建议备份

代码配置如下:

[root@localhost keepalived]#vim keepalived.conf
global_defs {
   router_id HA_TEST_R2                  ####本路由器的服务器名称 HA_TEST_R2
}
vrrp_instance VI_1 {                     ####定义VRRP热备实列
   state BACKUP                          ####热备状态,backup表示辅服务器
   interface ens33                       ####表示承载VIP地址的物理接口
   virtual_router_id 1                   ####虚拟路由器的ID号,每个热备组保持一致
   priority 99                           ####优先级,优先级越大优先级越高
   advert_int 1                          ####通告间隔秒数(心跳频率)
   authentication {                      ####认证信息,每个热备组保持一致
      auth_type PASS                     ####认证类型
      auth_pass 123456                   ####认证密码
   }
   virtual_ipaddress {                   ####漂移地址(VIP),可以是多个
      192.168.100.10
   }
}
 
 
 
 
#需要修改项
 
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
   #修改邮箱指向自己(10行)
   smtp_connect_timeout 30
   router_id LVS_01
   #指定服务器名称主备需要不一样(12行)
   vrrp_skip_check_adv_addr
   #vrrp_strict
   #14行需要注释否则服务启动有问题
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
 
vrrp_instance VI_1 {
    state MASTER
    #指定服务器类型MASTER为主 BACKUP为备(20行)
    interface ens33
    #修改网卡名称为ens33(21)
    virtual_router_id 10
    #指定虚拟路由器的ID号主备需要一致
    #nopreempt 
    #非抢占模式两个节点都需要配置去掉注释
    priority 100
    #设定优先级数字越大优先级越高,准备需要不一样
    advert_int 1
    #通告间隔(查看是否存活)
    authentication {
        auth_type PASS
        #认证类型
        auth_pass 123456
        #修改验证密码,主备需要一样(27行)
    }
    virtual_ipaddress {
        192.168.91.188
        #指定群集vip地址
    }
}
virtual_server 192.168.91.188 80 {
    delay_loop 6
    #健康间隔时间6秒
    lb_algo rr
    #调度算法轮询
    lb_kind DR
    #lvs模式为DR 
    persistence_timeout 0
    #连接保持时间改为0 否则 无法体现效果
    protocol TCP
    #采用协议
    
 real_server 192.168.91.103 80 {
 #43行修改地址为真实主机地址
        weight 1
        #45行删除
        #节点权重
        TCP_CHECK{
            connect_port 80
            #检查目标端口
            connect_timeout 3
            #连接超时 
            nb_get_retry 3
            #重试次数
            delay_before_retry 3
            #重试间隔时间
        }
    }
 real_server 192.168.91.105 80 {
 #第二个
        weight 1
        TCP_CHECK{
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
3, 启动 keepalive

4, 导入ipvsadm 文件   启动ipvsadm

5, hostname -I   可以看到  虚拟ip 目前飘在  lvs 主  代理服务器上

6, 把 配置文件拷贝给  77 代理服务器

77  备   lvs代理服务器

1,  接受66 的配置文件  覆盖原来的配置文件

2, 改配置文件

只有三处需要改

3, 启动keepalive  和ipvsadm

88  99 真实服务器

1,下载 http

2,  做页面

3,给两个真实服务器  在回环网卡上  加上虚拟ip

4, 避免地址冲突  写忽略arp 广播

5, 为实验效果 关闭httpd 自带的长连接

vi  /etc/httpd/conf/httpd.conf

6 ,重启httpd

实验结果

客户机访问188 虚拟ip  可以做到看到真实服务器的页面

四   keepalive 高可用

1,把主  lvs 代理服务器关了

2,备用机顶上来了

3,客户机不影响访问  呢

五    非抢占模式 抢占模式 延迟抢占模式

(一)抢占模式

默认模式 使用的 抢占式

(二)非抢占模式

1,解释

即当  主人挂了  备用机会顶上去  变成主人

如果主人又好了  不会抢主人 会乖乖变成备用机

2,主备改配置文件

3,各自重启 让配置文件生效

4,关掉主  的服务  再开启主的服务  可以发现虚拟ip 一直在77服务器上(原来的备)

不会抢占

(三)  延迟抢占模式

1,解释

生产模式常用  

如果抢占模式 就怕主 服务器是回光返照 又坏了

如果不抢占模式  一般主 服务器的性能都好一点   不用主 服务器浪费

2,主 服务器配置文件

3  , 从服务器 配置文件

4 实验结果

关闭主  服务器    再开启主   服务器

可以看到主  服务器 过了 30秒 才抢回的主权

六  修改心跳线ip

(一)  修改原来默认的多播地址

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞

1,抓包心跳线

2, 改主  备   服务器的配置文件

主改

备也要改

3, 再次抓包   已经改变

(二) 修改原来默认的多播地址 为 单播地址

默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量

1,写主   配置文件

2,写备  配置文件

3, 各自重启  抓包

可以发现  心跳线已经由组播改为单播  地址

七    通知脚本

(一) 语法

当前节点成为主节点时触发的脚本 notify_master <STRING>|<QUOTED-STRING>
当前节点转为备节点时触发的脚本 notify_backup <STRING>|<QUOTED-STRING>
当前节点转为“失败”状态时触发的脚本 notify_fault <STRING>|<QUOTED-STRING>
通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知 notify <STRING>|<QUOTED-STRING>
当停止VRRP时触发的脚本 notify_stop <STRING>|<QUOTED-STRING>

(二) 实验

1, 写通知脚本

#!/bin/bash
#
contact='940132245@qq.com'
notify() {
 mailsubject="$(hostname) to be $1, vip floating"
 mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
 echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
 notify master
 ;;
backup)
 notify backup
 ;;
fault)
 notify fault
 ;;
*)
 echo "Usage: $(basename $0) {master|backup|fault}"
 exit 1
 ;;
esac

2,  给脚本加执行权限

3, 改主  服务器的配置文件

4,重启 主  服务器    可以看到有新的邮件

八  把日志独立出来

keepalive  比较重要  把日志独立出来方便查看

1,  /etc/sysconfig/keepalived  这是keepalive 环境变量配置文件

2,写 rsyslog 日志管理工具

3, 重启两个服务

4  可以看到自动生成 .log 文件 我们查看他

九    脑裂

(一)脑裂定义

什么是脑裂?

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,

就分裂成为2个独立的个体。

由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享

资源”、争起“应用服务”,就会发生严重后果。共享资源被瓜分、两边“服务”都起不来了;或者两边

“服务”都起来了,但同时读写“共享存储”,导致数据损坏

(二) 导致脑裂的原因

高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

因心跳线坏了(包括断了,老化)。

因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)

因心跳线间连接的设备故障(网卡及交换机)

高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。

高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败

其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

(三)如何解决keepalived脑裂问题

在实际生产环境中,我们从以下方面防止脑裂:

 

1,加一条心跳线

同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息

2,特殊设备支持

当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源

(四) 做好对脑裂的监控报警解决常见方案

1,rsyslog   分割日志

2,如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决

3,可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余

4,开发检测程序通过监控软件检测脑裂

(五)模拟脑裂

1, 模拟脑裂

备用机丢弃 心跳线

2,主  备都以为自己是   主人

备:

主:

相关文章
|
5月前
|
虚拟化
深入了解Libvirt中的Keepalive配置
深入了解Libvirt中的Keepalive配置
|
缓存 网络协议 应用服务中间件
Nginx之keepalive配置解读
Nginx之keepalive配置解读
|
负载均衡 算法 应用服务中间件
Keepalive-Haproxy高可用介绍
假设我们现在开发了一个应用应用的端口号为 8080,这个应用我们想让它去实现一个负载均衡的访问,就是说我们有两台服务器都部署了我们的 8080 应用,我们想让它一会访问 ip 为: 192.168.0.1 的,一会访问 192.168.0.2 的,我们之前的做法是不是在这两台服务器之上部署一台 Nginx 来进行实现的,如下图:
106 1
keepalive
好好学习
66 0
keepalive
|
Web App开发 缓存 网络协议
|
Web App开发 应用服务中间件 nginx
|
负载均衡 测试技术 开发工具