高性能集群软件-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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态。它根据TCP/IP参考模型的第...
    wangfs阅读 246评论 0 0
  • 转载自:http://blog.csdn.net/u010391029/article/details/48311...
    Chris_Zheng阅读 1,394评论 0 2
  • 一、高可用集群 (一)提升系统高可用性的解决方案:冗余(redundant) 工作模式active/passive...
    哈喽别样阅读 1,722评论 2 5
  • 闲着没事刚逛了一下中华田园犬吧 ,看到了以下这些狗 ,没有一只是国外货或者串串 ,地地道道的中华田园犬 。那只黑狗...
    风围尘阅读 1,413评论 0 1
  • 十月怀胎 一朝分娩 嘈杂的医院里混杂着我大哭的声音 还有您喜极而泣未来得及擦干的泪水 初为人母的您 把全世界捧在了...
    L小镜子阅读 147评论 0 0