Day-45 keepalived

keepalived

高可用

概念:当一台服务器宕机,另一台能快速接管。

工具:keepalived

原理:通过vrrp协议,虚拟路由冗余协议;在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

VRRP

原理:

master在工作状态会不断群发一个广播包

backup与 master进行优先级对比

由虚拟IP进行连接选举出的master

keeplived 应用

#1.安装
[root@lb01 ~]# yum install -y keeplived
#2.配置
#(1)lb1配置
[root@lb01 ~]# vim /etc/keeplived/keeplived.conf
globoal_defs {
    router_id lb1
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}
#(2)lb2配置
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
globog_defs {
    router_id lb2
}
vrrp_instance VI 1 {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}
#3.启动测试
[root@lb02 ~]# systemctl start keepalived
[root@lb02 ~]# systemctl enable keepalived

抢占式与非抢占式

#master故障--->backup顶上--->master恢复--->backup  抢占式   
#master故障--->backup顶上--->master恢复--->backup工作 非抢占式

#两个节点的state都必须配置为BACKUP(官方建议)
#两个节点都在vrrp_instance中添加nopreempt参数
#其中一个节点的优先级必须要高于另外一个节点的优先级。
#两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。

1.抢占:   硬件配置不一
2.非抢占: 硬件配置一致,业务不允许多次切

#[keepalived vip漂移基本原理及选举算法]
keepalived可以将多个无状态的单点通过虚拟IP(以下称为VIP)漂移的方式搭建成一个高可用服务,常用组合比如 keepalived+nginx,lvs,haproxy和memcached等。它的实现基础是VRRP协议,包括核心的MASTER竞选机制都是在[VRRP协议](http://tools.ietf.org/html/rfc3768)所约定的。

一、配置说明:
keepalived的配置位于/etc/keepalived/keepalived.conf,配置文件格式包含多个必填/可选的配置段,部分重要配置含义如下:
global_defs: 全局定义块,定义主从切换时通知邮件的SMTP配置。
vrrp_instance: vrrp实例配置。
vrrp_script: 健康检查脚本配置。

细分下去,vrrp_instance配置段包括:
state: 实例角色。分为一个MASTER和一(多)个BACKUP。
virtual_router_id: 标识该虚拟路由器的ID,有效范围为0-255。
priority: 优先级初始值,竞选MASTER用到,有效范围为0-255。
advert_int: VRRP协议通告间隔。
interface: VIP所绑定的网卡,指定处理VRRP多播协议包的网卡。
mcast_src_ip: 指定发送VRRP协议通告的本机IP地址。
authentication: 认证方式。
virtual_ipaddress: VIP。
track_script: 健康检查脚本。

vrrp_script配置段包括:
script: 一句指令或者一个脚本文件,需返回0(成功)或非0(失败),keepalived以此为依据判断其监控的服务状态。
interval: 健康检查周期。
weight: 优先级变化幅度。
fall: 判定服务异常的检查次数。
rise: 判定服务正常的检查次数。

这里有[MASTER](https://gist.github.com/fengchj/66f5c6e5afc4603942aa#file-master)和[BACKUP](https://gist.github.com/fengchj/66f5c6e5afc4603942aa#file-backup)的参考配置。

二、选举算法
keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其 他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责 处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状 态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。

MASTER和BACKUP节点的优先级如何调整?
首先,每个节点有一个初始优先级,由配置文件中的priority配置项指定,MASTER节点的priority应比BAKCUP高。运行过程中keepalived根据vrrp_script的weight设定,增加或减小节点优先级。规则如下:

1. 当weight > 0时,vrrp_script script脚本执行返回0(成功)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
2. 当weight < 0时,vrrp_script script脚本执行返回非0(失败)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。 
3. 当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。 以上文中的配置为例: 
HOST1: 10.15.8.100, priority=91, MASTER(default) 
HOST2: 10.15.8.101, priority=90, BACKUP VIP: 10.15.8.102 weight = 2 
抓包命令: tcpdump -nn vrrp 
示例一:HOST1和HOST2上keepalived和nginx均正常。

事故模拟

如果nginx宕机,keepalived并不会进行切换,会导致用户请求失败,如何解决

思路:如果nginx宕机,如果keepalived启动,通过写脚本使二者相依相存。

第一种:当nginx停止,keepalived也立即停止,进行切换

缺点:停止切换需要一定的时间

第二种:当nginx,keepalived其中一个启动,就拉起另一个服务;

缺点:当nginx配置有误,怎样都起不来该怎么办

第三种:结合第一第二种;当nginx起不来时在去kill 掉keepalived

判断nginx存活的方法

1.判断nginx进程是否存在         ps aux|grep nginx|grep -v grep
2.判断nginx的端口是否存在        netstat -lntp|grep :80|wc -l
3.通过curl来模拟访问,判断访问结果是否ok   curl -H Host:url.oldxu.com http://10.0.0.3
#1.编写脚本
[root@lb01 ~]# vim /script/check.sh
#!/usr/bin/bash
nginx_prot=$(netstat -lntp |grep :80|wc -l)
if [ $nginx_prot -ne 1 ];then
    systemctl start nginx
    rc=$?
    sleep 3
    if [ $rc -ne 0 ];then
        systemctl stop keepalived
    fi
fi
#2.调用脚本
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
globog_defs {
    router_id lb1
}
vrrp_script check_web {
    script "/script/check.sh"
    interval 5
}
vrrp_instance VI 1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}
track_script {
    check_web
}

脑裂

#1.概念
指在一个高可用系统,当联系着的两个节点断开联系时,本来一个整体的系统,分裂为两个独立的节点,此时节点会互抢共享资源,对无状态的无影响
#2.解决方法
通过能ping通主并且备节点还有VIP的话则认为产生了脑列
#3.方案
[root@lb02 ~]# vim /scripts/check_spilt.sh 
#!/usr/bin/bash
vip=10.0.0.3
master=10.0.0.5
ping -c2 $master_ip &>/dev/null
if [ $? -eq 0]; then
    ip_check=$(ip addr|grep "$vip" |wc -l)
    if [ $ip_check -eq 1 ]; then
        echo "naolie"
        systemctl stop keepalived
    fi
fi
#4.调用脚本
[root@lb02 conf.d]# vim /etc/keepalived/keepalived.conf 
globog_defs {
    router_id lb2
}
vrrp_script check_spilt {
    script "/scripts/check_spilt.sh"
    interval 3
}
vrrp_instance VI 1 {
    state BACKUP
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.3
    }
}
track_script {
    check_spilt
}



你可能感兴趣的:(Day-45 keepalived)