简介

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。

但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作;当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

安装部署

wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
#解压
tar -zxvf keepalived-1.2..tar.gz
cd keepalived-1.2.
#安装
./configure --prefix=/usr/local/keepalived #prefix指定安装目录
make
make install

#配置启动
cp keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived
chmod +x /etc/init.d/keepalived
cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived
cp keepalived/etc/keepalived/keepalived.conf /etc

配置详解

keepalived.conf

global_defs {
notification_email { #指定keepalived在发生事情的时候,发送邮件告知,可以有多个地址,每行一个。
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from root@firewall.loc     #指定发件人
smtp_server 127.0.0.1         #发送email的smtp地址
smtp_connect_timeout       #超时时间
router_id LVS_DEVEL         #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state MASTER         #指定当前节点为主节点 备用节点上设置为BACKUP即可
interface eth0       #绑定虚拟IP的网络接口
virtual_router_id     #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority         #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int
authentication {       #设置验证信息,两个节点必须一致
  auth_type PASS
  auth_pass
}
virtual_ipaddress {       #指定虚拟IP, 两个节点设置必须一样
  192.168.1.21/
}
}

启动

service keepalived start|stop|restart
chkconfig keepalived on

验证虚拟ip 可使用 ip addr 验证

应用

两种模式:

  • 主-备

master服务器 keepalived.conf

global_defs {
notification_email {       #指定keepalived在发生事情的时候,发送邮件告知,可以有多个地址,每行一个。
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
smtp_server 127.0.0.1       #发送email的smtp地址
smtp_connect_timeout         #超时时间
router_id LVS_DEVEL           #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state MASTER         #指定当前节点为主节点 备用节点上设置为BACKUP即可
interface eth0         #绑定虚拟IP的网络接口
virtual_router_id     #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority           #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int
authentication {         #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass
}
virtual_ipaddress {         #指定虚拟IP, 两个节点设置必须一样
192.168.1.21/
}
}

Backup服务器 keepalived.conf

global_defs {
notification_email {     #指定keepalived在发生事情的时候,发送邮件告知,可以有多个地址,每行一个。
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
smtp_server 127.0.0.1     #发送email的smtp地址
smtp_connect_timeout     #超时时间
router_id LVS_DEVEL       #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state BACKUP         #指定当前节点为主节点 备用节点上设置为BACKUP即可
interface eth0       #绑定虚拟IP的网络接口
virtual_router_id     #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority           #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int
authentication {       #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass
}
virtual_ipaddress {       #指定虚拟IP, 两个节点设置必须一样
192.168.1.21/
}
}
  • 主-主

主备模式的缺点就是始终只有一台机器位于工作状态,另外一台机器永远是备用状态,存在资源浪费之问题。

双主模式允许两台机器均处于工作状态并互相作为备份。搭建keepalived双主模式的要素:

  • 必须有两个虚拟IP, 分别绑定至两个节点上
  • 每个节点作为某个虚拟IP的主节点,并同时作为另外一个虚拟IP的备用节点。
  • 当某个节点产生故障时,两个虚拟IP自动绑定至正常节点上
  • 也就是说,两个节点的配置应该是交叉的,对同个虚拟IP,交叉互为主备。

master1配置文件keepalived.conf

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
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id   #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
priority       #对应备用节点值应该比此值小
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.1.21/
}
} vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id     #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
priority           #主节点的值应该比此值大
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.1.22/
}
}

master2节点keepalived.conf

global_defs {
   notification_email {       #指定keepalived在发生事情的时候,发送邮件告知,可以有多个地址,每行一个。
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
}
  notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
  smtp_server 127.0.0.1       #发送email的smtp地址
  smtp_connect_timeout     #超时时间
  router_id LVS_DEVEL       #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
  vrrp_skip_check_adv_addr
  vrrp_strict
  vrrp_garp_interval
  vrrp_gna_interval
} vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id     #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
  priority         #对应主节点值应该比此值大
  advert_int
  authentication {
    auth_type PASS
    auth_pass
  }
  virtual_ipaddress {
    192.168.1.21/
  }
} vrrp_instance VI_2 {
  state MASTER
  interface eth0
  virtual_router_id       #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
  priority             #对应备用节点的值应该比此值小
  advert_int
  authentication {
    auth_type PASS
    auth_pass
  }
  virtual_ipaddress {
    192.168.1.22/
  }
}

脑裂问题

两个节点实际都处于正常工作状态,但是无法接收到彼此的组播通知,这时两个节点均强行绑定虚拟IP,导致不可预料的后果。

这时就需要设置仲裁,即每个节点必须判断自身的状态(应用服务状态及自身网络状态),要实现这两点可使用自定义shell脚本实现,通过周期性地检查自身应用服务状态,并不断ping网关(或其它可靠的参考IP)均可。当自身服务异常、或无法ping通网关,则认为自身出现故障,就应该移除掉虚拟IP(停止keepalived服务即可)。

主要借助keepalived提供的vrrp_script及track_script实现:

在keepalived的配置文件最前面加入以下代码,定义一个跟踪脚本:

vrrp_script check_local {     #定义一个名称为check_local的检查脚本
  script "/usr/local/keepalived/bin/check_local.sh"       #shell脚本的路径
  interval   #运行间隔
}

再在vrrp_instance配置中加入以下代码使用上面定义的检测脚本:

track_script {
  check_local
}

我们在/usr/local/keepalived/bin/check_local.sh定义的检测规则是:

  • 自身web服务故障(超时,http返回状态不是200)
  • 无法ping通网关
  • 产生以上任何一个问题,均应该移除本机的虚拟IP(停止keepalived实例即可)

但这里有个小问题,如果本机或是网关偶尔出现一次故障,那么我们不能认为是服务故障。更好的做法是如果连续N次检测本机服务不正常或连接N次无法ping通网关,才认为是故障产生,才需要进行故障转移。

但这么做的缺点是,如果脚本检测到故障产生,并停止掉了keepalived服务,那么当故障恢复后,keepalived是无法自动恢复的。

还可以利用独立的脚本以秒级的间隔检查自身服务及网关连接性,再根据故障情况控制keepalived的运行或是停止。

在每个节点运行shell脚本(check_service.sh)检测本机的服务是否正常,一旦检测到服务异常时,停止掉本机的keepalived, 如此虚拟IP自动转移到备用机器之上,如每隔3秒检测一次本机服务状态,如果连接3次检测失败,则停止掉keepalived实例。同时如果本机服务是正常的,但是keepalived没有启动(故障恢复之后),则启动keepalived,以达到故障恢复之目的。

check_service.sh文件的内容

#!/bin/bash

pidfile=/var/lock/subsys/`basename $`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
  exit
fi trap "rm -fr $pidfile ; exit 0"
echo $$ > $pidfile maxfails=
fails=
success= while [ ]
do
  /usr/bin/wget --timeout= --tries= http://127.0.0.1/ -q -O /dev/null
  if [ $? -ne ] ; then
    let fails=$[$fails+]
    success=
  else
    fails=
    let success=$[$success+]
  fi   if [ $fails -ge $maxfails ] ; then
    fails=
    success=     #check keepalived is running ? try to stop it
    service keepalived status | grep running
    if [ $? -eq ] ; then
      logger -is "local service fails $maxfails times ... try to stop keepalived."
      service keepalived stop >& | logger
    fi
  fi   if [ $success -gt $maxfails ] ; then
    #check keepalived is stopped ? try to start it
    service keepalived status | grep stopped
    if [ $? -eq ] ; then
      logger -is "service changes normal, try to start keepalived ."
      service keepalived start
    fi
    success=
  fi
  sleep
done

两个节点上均应运行此脚本,请将此脚本加入到cron任务中(此程序已经作了单实例运行机制,加入计划任务的作用就是防止脚本意外中断后检测功能失效),可实现的功能:

  • 如果本地服务连续三次检测失败,就尝试停止keepalived服务(如果keepalived处于运行状态)
  • 如果本地服务连接三次检测成功,但keepalived没有启动,则启动之
  • 关键的执行点,均已经记录到系统日志中(/var/log/messages)

执行crontab -e , 加入以下内容:

*/ * * * * /root/check_service.sh

测试

  • 停止掉本机的keepalived, 稍过一会,就会keepalived服务被自动启动了(这是因为本地服务检测正常)
  • 停止掉本机的nginx, 稍过一会,就会发现keepalived服务也被停止掉了
  • 再启动nginx, 稍过一会,发现keepalived也被正常启动,并绑定了正确的虚拟IP

keepalived 安装及配置的更多相关文章

  1. Linux下Keepalived 安装与配置

    Keepalived 安装与配置 一.环境说明 1.操作系统内核版本:2.6.9-78.ELsmp 2.Keepalived软件版本:keepalived-1.1.20.tar.gz 二.环境配置 1 ...

  2. Keepalived详解(二):Keepalived安装与配置【转】

    一.Keepalived安装与配置: 1.Keepalived的安装过程: Keepalived的安装非常简单,本实例以源码安装讲解: Keepalived的官方网址:http://www.keepa ...

  3. keepalived 安装和配置

    第一步:安装 yum -y install keepalived 第二步:配置 /etc/keepalived/keepalived.conf ! Configuration File for kee ...

  4. Keepalived + HAProxy 搭建【第二篇】Keepalived 安装与配置

    第一步:准备 1. 简介 本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异 ...

  5. keepalived安装与配置,组建高可用服务器

    一.准备环境 linux系统:CentOS7 keepalived版本:keepalived-1.3.5.tar.gz keepalived下载地址:http://www.keepalived.org ...

  6. Linux下Keepalived安装与配置

    一.简介 负载平衡是一种在真实服务器集群中分配IP流量的方法,可提供一个或多个高度可用的虚拟服务.在设计负载均衡拓扑时,重要的是要考虑负载均衡器本身的可用性以及它背后的真实服务器.用C编写的类似于la ...

  7. 【检测工具】keepalived安装及配置

    一.keepalived安装 keepalived是一个检测服务器状态的脚本,在高可用机制上经常可以看到它的身影. 在Linux中安装keepalived: 1.在网上直接下载相应的压缩包,推荐链接 ...

  8. Keepalived 安装与配置

    下载:http://www.keepalived.org/ what is keepalived? Keepalived is a routing software written in C. The ...

  9. Keepalived安装与配置

      下载并解压Keepalived安装包到两台nginx所在的服务器   192.168.200.1   192.168.200.2     执行编译安装(安装目录设置为 /usr/local/kee ...

随机推荐

  1. Android项目实战欢迎界面

    欢迎界面 首先同理把欢迎界面的图片导入到drawable目录下,在导入时 Android Studio 会提示如下 drawable 具体本人尚未弄明白,待理解后会重新补全本部分内容,在此本人选了第一 ...

  2. 业务与IT技术

    最近听一个同事又再次提问关于业务比技术重要,是真的吗? 今天我们再来看一下.      一,什么是业务? 业务意指某种有目的的工作或工作项目.技术可以指人类对机器.硬件或人造器皿的运用,但它也可以包含 ...

  3. 工具资源系列之给虚拟机装个ubantu

    前文我们已经讲解了如何在 mac 系统上安装虚拟机软件,这节我们接着讲解如何利用虚拟机安装 Ubuntu 镜像. 安装镜像的大致步骤基本相同,只不过是配置项略显不同而已,如果需要安装其他系统镜像,请参 ...

  4. 关于写作那些事之github告诉我构建失败,然后呢?

    The page build failed for the master branch with the following error 问题描述 看到这封邮件,一脸懵逼,本地运行 gitbook 服 ...

  5. Unity 协同程序

    定义协同程序: IEnumerator test() { Debug.log("test 1"); yeild return WaitForSecond(3.0f); Debug. ...

  6. 使用docker快速搭建nginx+php环境

    在朋友的强烈推荐下,走上了docker之路.经过了繁琐的docker环境安装,看了下镜像/容器的简单使用,开始进行nginx+php环境的搭建,本文记录一下在安装过程中的笔记. 原文地址:代码汇个人博 ...

  7. springboot 2.1.4 源码默认logback-spring.xml

    logback-spring.xml 是由几个文件组成的,整个的一个xml为 <?xml version="1.0" encoding="UTF-8"?& ...

  8. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  9. python实现对文件的全量、增量备份

    #!/user/bin/env python # @Time :2018/6/6 10:10 # @Author :PGIDYSQ #@File :FileBackup2.py import os i ...

  10. Java Selenium中的几种等待方式

    Selenium自动化性能测试过程中,经常会出现取不到界面元素,主要原因是界面元素的加载与我们访问页面的时机不一致.可能是界面要素过多或者网络较慢,界面一直加载中:为了解决这种问题,selenium提 ...