高性能集群软件-Keepalived

keepalived 介绍

keepalived 是 Linux下一个轻量级的高可用解决方案
keepalived 主要通过虚拟路由冗余(VRRP)来实现高可用功能

优点:部署及使用简单,只需一个配置文件即可完成
功能:服务器状态检测和故障隔离功能;HA(High Available) cluster

keepalived 发展

keepalived起初是为LVS(Linux Virtual System)设计,专门监控集群系统中各个服务节点的状态
根据TCP/IP参考模型 第三、第四、第五层交换机制检测每个服务节点的状态
(详细见本页keepalived工作原理)

e.g: keepalived检测WEB服务器的状态;
如果一台WEB服务器死机/工作出现故障,keepalived检测到此状况后会将故障服务器从系统中剔除;
直至该服务器工作正常后keepalived自动将该服务器加入到服务器群中;
以上工作keepalived自动完成,无需人工干涉,人工干预仅是修复出现故障的服务节点;

keepalived 后续加入了VRRP功能
VRRP(Virtaul Router Redunadancy Protocol,虚拟路由器冗余协议)
目的:解决静态路由出现的单点故障问题,实现网络不间断稳定运行

VRRP 协议与工作原理 :

1111.png

局域网组网:
网络内的所有主机会设置一条默认网关(10.100.10.1),当主机发出的目的地址不在本网段(10.100.10.0/24)的报文;
通过默认网关发往路由器A,从而实现主机与外部网络的通信
该组网缺点:当路由器A坏掉时,本网段内通过以RA为默认网关下一跳的主机将断掉与外界的通信,产生单点故障

VRRP组网:
RA:Master 活动路由器 10.100.10.2
RB:Backup 备份路由器 10.100.10.3
VRIP : 虚拟路由器IP 10.100.10.1
VRRP将局域网中的一组路由器【 RA和RB】组成一个虚拟路由器------>>>备份组
虚拟路由器拥有自己的IP地址 10.100.10.1
局域网内的主机仅知道虚拟路由器IP地址为10.100.10.1,不知道具体的Master与Backup路由器IP
局域网内的主机将默认网关下一跳的地址设置为该虚拟路由器IP地址,通过该地址与其他网络进行通信
该组网优点:当备份组内的Master路由器DOWN掉,会进行选举策略选出一个新的Master路由器,继续往网络内的主机提供路由服务,从而实现网络内的主机不间断地与外部网络进行通信

VRRP 协议 ‍‍:
解决局域网中配置静态网关出现单点失效的路由协议
设计目标:网络发生故障时透明地进行设备切换而不影响主机间的数据通信

VRRP 工作原理:
VRRP协议将两台或多台路由器设备虚拟成一个虚拟路由器,对外提供虚拟路由器IP(一个或多个);
而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER, 或者是通 过算法选举产生;
MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;
其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外 的网络功能。
当主机失效时,BACKUP将接管原先MASTER的网络功能。

如何判定多个路由器在同一组虚拟路由器中?

VRID(virtual_router_id):每个虚拟路由器都有一个唯一标识(VRID是一个0~255的正整数)
配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值(priority),
使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组

BACKUP 为什么没有发生抢占?
VRRP通告:它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内
在一个虚拟路由器中,只有处于MASTER角色的路由器会一直发送VRRP通告信息;
处于BACKUP状态的路由器只接收MASTER发过来的报文信息,用来监控MASTER运行状态, 除非它的优先级比MASTER更高

什么时候发生选举?
当MASTER不可用时,BACKUP无法收到MASTER发过来的报文信息;
认定MASTER出现故障,然后多台BACKUP就开始进行选举;

Master选举:
虚拟路由器IP=路由器本身配置IP
该路由器始终将是MASTER;IP地址所有者自动具有最高优先级:255
优先级选举主控路由器(优先级范围是0—255)
优先级0一般用在IP地址所有者主动放弃主控者角色时使用。可配置的优先级范围为1—254
优先级相等,则比较路由器的实际IP,IP值较大的优先权高

Keepalived 工作原理

根据TCP/IP参考模型各层所能实现的功能,Keepalived运行机制如下:

网络层  
协议:
  IP(Internet Protocol网际协议)  
  ARP(Address Resolution Protoco 地址转换协议) 
  RARP(Reverse Address Resolution Protocol  反向地址转换协议 )
  ICMP(Internet Control Message Protocol 网络控制报文协议)  

常用:通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似ping实现)
如果某个节点没有返回响应数据包,那么认为此节点发生了故障,keepalived将报告该节点失效,
并从服务器集群中剔除故障节点

传输层
协议:
  TCP (传输控制协议)(三次握手、安全可靠)
  UDP (用户数据协议)

------------------------------------------------------------------------------------
TCP提供可靠的数据传输服务、IP地址和端口,代表TCP的一个连接端
获取TCP服务,需要在发送机的一个端口上和接收机上一个端口上建立连接
-------------------------------------------------------------------------------------

常用:利用TCP协议的端口连接和扫描技术来判断集群节点是否正常

e.g: SSH服务默认22端口,WEB服务器80端口····Keepalived在传输层探测某端口没有响应数据
判定端口异常,强制将此端口对应的节点从服务器及群组中移除
        
应用层
协议:FTP、TELNET、SMTP、DNS ····
-----------------------------------------------------------------------
用户可以通过自定义Keepalived的工作方式
-----------------------------------------------------------------------
e.g:用户编辑程序运行Keepalived,而Keepalived 根据用户设定检测各种程序或服务是否允许正常
keepalived 结构体系
11111.png

Keepalived采用是模块化设计,不同模块实现不同的功能,keepalived主要有三个模块,分别是core、check和vrrp。

core: 是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等 
check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;可基于脚本检查对IPVS后端服务器健康状况进行检查。 
vrrp: VRRPD子进程,VRRPD子进程就是来实现VRRP协议的

Keepalived启动后会有三个进程:
父进程:内存管理,子进程管理等等
子进程:vrrpd子进程
子进程:healthchecker子进程

keepalived 配置

keepalived-1:

! Configuration File for keepalived

global_defs {                 #全局配置标识,表面这个 区域{} 是全局配置
   router_id lms-ngx-ha-91     #机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
}

vrrp_script health-check {   #VRRP脚本,在vrrp_script区域定义脚本名字
   script   "/root/tools/health_check.sh 192.168.0.92"   #脚本存放路径及参数
   interval 5   #脚本执行的间隔时间
   fall     3      #转换为KO状态,所需的成功数量
   rise     5    # 转换为OK状态,所需的成功数量
}

vrrp_instance NGX-HA-1 {  # VRRP实例,定义对外提供服务的VIP区域及其相关属性
    state BACKUP  #state指定instance(Initial)的初始状态 MASTER/BACKUP
    interface eth0   #实例绑定的网卡(非VIP网卡),用来发VRRP包
    virtual_router_id 93   #设置VRID,取值在0~255之间,用来区分多个instance的VRRP组播,相同的VRID为一组,该值将决定多播的MAC地址
    priority 100   #设置本节点的优先级,优先级高的为master,取值为1~255
    advert_int 3  #检查间隔,默认为1秒
    nopreempt  #设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须特别的高
    garp_master_delay 30  #在切换到master状态后,延迟进行免费的ARP

    authentication {   #这里设置认证
        auth_type PASS   #认证方式,可以是PASS或AH两种认证方式
        auth_pass 51w162hy   #认证密码(pass方式密码只识别前8位) 
    }

    track_interface {  #监控以下网卡,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态
        eth0
    }  

    virtual_ipaddress {   #设置VIP,也就是虚拟IP地址(可设置多个VIP)
        192.168.0.93/24 dev eth0
    }

    track_script {   #实例(vrrp_instance)里面引用
        health-check
    }
}

keepalived-2:

! Configuration File for keepalived

global_defs {                 #全局配置标识,表面这个 区域{} 是全局配置
   router_id lms-ngx-ha-92     #机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
}

vrrp_script health-check {   #VRRP脚本,在vrrp_script区域定义脚本名字
   script   "/root/tools/health_check.sh 192.168.0.91"   #脚本存放路径及参数
   interval 5   #脚本执行的间隔时间
   fall     3      #转换为KO状态,所需的成功数量
   rise     5    # 转换为OK状态,所需的成功数量
}

vrrp_instance NGX-HA-1 {  # VRRP实例,定义对外提供服务的VIP区域及其相关属性
    state BACKUP  #state指定instance(Initial)的初始状态 MASTER/BACKUP
    interface eth0   #实例绑定的网卡(非VIP网卡),用来发VRRP包
    virtual_router_id 93   #设置VRID,取值在0~255之间,用来区分多个instance的VRRP组播,相同的VRID为一组,该值将决定多播的MAC地址
    priority 95   #设置本节点的优先级,优先级高的为master,取值为1~255
    advert_int 3  #检查间隔,默认为1秒
    nopreempt  #设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须特别的高
    garp_master_delay 30  #在切换到master状态后,延迟进行免费的ARP

    authentication {   #这里设置认证
        auth_type PASS   #认证方式,可以是PASS或AH两种认证方式
        auth_pass 51w162hy   #认证密码(pass方式密码只识别前8位) 
    }

    track_interface {  #监控以下网卡,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态
        eth0
    }  

    virtual_ipaddress {   #设置VIP,也就是虚拟IP地址(可设置多个VIP)
        192.168.0.93/24 dev eth0
    }

    track_script {   #实例(vrrp_instance)里面引用
        health-check
    }
}

说明:keepalived-1和keepalived-2的配置有两处不同
①、vrrp_script health-check中的检测对象IP
②、vrrp_instance中的 priority 权重不同

/root/tools/health_check.sh 脚本:

#!/bin/bash

# -------------------------------------------------------
# $Name:         ha_check_health.sh
# $Version:      v1.0
# $Function:     keepalved检测逻辑
# $Author:       Dengwei
# $Create Date:  2017-6-29 10:20:42
# $Description:  判断在什么情况下VIP在A/B二台主机上漂移
#                100 master
#                 95 slave 
# -------------------------------------------------------


health_check()
{
    local datetime=$(date "+%F %T")
    local logfile='/var/log/keepalived-check.log'
    local keep_conf="/usr/local/services/keepalived-1.2.19/etc/keepalived/keepalived.conf"
    local role=$(grep 'priority' $keep_conf |grep -v '#' |awk '{print $2}')
    local ha_proc_nums=$(pidof haproxy |wc -l)
    local vip=$(cat $keep_conf |grep 'dev eth0' |sed -r 's!\s+([^/]+)/.*!\1!')
    local local_has_vip=$(ip addr show eth0 |grep -c "$vip")
    local gateways=$(ip r l |awk '/^def|via/ {print $3}' |egrep '^(10|192|172)\.'|sort |uniq)
    local another_keep_ip=$1

    # 根据权重定义本地keepalived角色
    if [ "$role" == "100" ]; then
        role="master"
    elif [ "$role" == "95" ]; then
        role="slave"
    fi
    
    # 检查Nginx进程是否存活
    ha_msg="$datetime Haproxy is shutdown"
    if [ $ha_proc_nums -eq 0 ]; then
        echo -e "${ha_msg}. $local_has_vip" >>$logfile
        exit 1
    fi

    # 检查本地网络是否异常
    network_msg="$datetime Gateway is unreachable"
    for gateway in $gateways $another_keep_ip; do
        ping -W 1 -c 1 $gateway >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "${network_msg}, ${gateway}. $local_has_vip" >>$logfile
            stats="${stats}1"
        fi
    done
    if [ "$stats" == "11" ]; then
        exit 2
    fi

    # 若没提供IP则退回
#    if [ -z $another_keep_ip ]; then
#        return 0
#    fi
#
#    # A/B主机之间网络不通仲裁逻辑
#    keep_msg="$datetime Network is unreachable"
#    ping -w 1 -c 1 $another_keep_ip >/dev/null 2>&1
#    if [ $? -ne 0 -a "$role" == 'slave' ]; then
#       echo "$keep_msg, $another_keep_ip $local_has_vip" >>$logfile
#       exit 3
#    fi

    return 0
}

health_check $1

实验常见问题:
1、Keepalived 设置master故障恢复后不重新抢回VIP(解决nopreempt无效)
问题现象:
master服务器在恢复正常后抢占VIP,配置文件配置的非抢占VIP无效(nopreempt无效)
master机器


image.png

backup机器


image.png

分析:
通过日志分析可以看到组播IPv4为:
VRRP IPv4 mcast group = 224.0.0.18
VRRP IPv6 mcast group = ff02::12
抢占VIP应该是两台keepalived 节点通信有问题,此时检查iptables是否开发224.0.0.18,
如果没开发,则在两台keepalived 节点开启iptables,允许组播:

iptables -A INPUT -d 224.0.0.18 -j ACCEPT
或修改:vim /etc/sysconfig/iptables
适当位置添加行:
-A INPUT -d 224.0.0.18 -j ACCEPT

你可能感兴趣的:(高性能集群软件-Keepalived)