简介

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. IM多类型holder封装

    如标题,这是一个在列表多类型视图时的一个简化封装方法,减少多余代码,提高复用性,更好迭代扩展,先看视图列表效果图 GitHub:https://github.com/1024477951/Fragme ...

  2. Android View的重绘过程之Layout

    博客首页:http://www.cnblogs.com/kezhuang/p/ View绘制的三部曲,测量,布局,绘画现在我们分析布局部分测量部分在上篇文章中已经分析过了.不了解的可以去我的博客里找一 ...

  3. 随笔:关于去年的WordPress建站的回忆

    2018-02-26    建站 2018-02-28    选择主题Clearision 2018-03-01    学习插入视频.修改主题 <iframe src="//playe ...

  4. Django项目结构介绍

    官网下载网址:https://www.djangoproject.com/download/ 安装(安装最新LTS版): pip3 install django==2.0.7 创建一个django项目 ...

  5. SQL常用语句(二)

    --语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据 --数 ...

  6. centos7新增硬盘

    centos7新增硬盘 步骤:分区---格式化---挂载(配置开机自动挂载) 1.分区 fdisk -l 查看硬盘信息确认新硬盘的名称(以/dev/sdb为例) fdisk /dev/sdb  管理硬 ...

  7. 下载合适的tomcat版本

    Tomcat因技术先进.性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器.对于新手来讲,如何下载合适的tomcat版本呢?今天我们以下 ...

  8. Copula函数

    Copula函数 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. Copula介绍 Copula函数把边缘分布函数与联合分布函数联系起来,是研究变 ...

  9. Step by Step Recipe for Securing Kafka with Kerberos

    Short Description: Step by Step Recipe for Securing Kafka with Kerberos. Article I found it is a lit ...

  10. vue打包发布在spingboot项目中 vue-router路由的处理

    (原) 以下例子springboot后端地址为:localhost:7080/pingandai vue前端地址为:locahost:8080/pingandai/ 1.如果路由模式设置的是histo ...