转自:http://www.cnblogs.com/MacoLee/p/5853356.html

简介

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.23.tar.gz
cd keepalived-1.2.23
#安装
./configure --prefix=/usr/local/keepalived #prefix指定安装目录
make
make install

配置

【/usr/local/keepalived/etc/keepalived/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 30 #超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_instance VI_1 {
state MASTER #指定当前节点为主节点 备用节点上设置为BACKUP即可
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1
authentication { #设置验证信息,两个节点必须一致
  auth_type PASS
  auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样
  192.168.1.21/24
}
}

【/usr/local/keepalived/etc/sysconfig/keepalived】

KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf" #指定keepalived配置文件路径

因为我们使用非默认路径(/usr/local)安装keepalived,需要设置一些软链接以保证keepalived能正常启动

ln -s /usr/local/keepalived/sbin/keepalived  /usr/bin #将keepalived主程序加入到环境变量
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ #keepalived启动脚本,放到/etc/init.d/目录下就可以使用service命令便捷调用
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ #keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可

启动

service keepalived start|stop|restart
chkconfig keepalived on

默认的配置文件中,指定了虚拟IP :192.168.1.21,可使用ip addr(或ip a)命令验证之。

应用

keepalived两种模式:主-备主-主

主-备

虚拟IP:192.168.1.21         主节点:192.168.1.23          备用节点:192.168.1.24

主配置文件

【/usr/local/keepalived/etc/keepalived/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 30 #超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_instance VI_1 {
state MASTER #指定当前节点为主节点 备用节点上设置为BACKUP即可
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样
192.168.1.21/24
}
}

备配置文件
【/usr/local/keepalived/etc/keepalived/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 30 #超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_instance VI_1 {
state BACKUP #指定当前节点为主节点 备用节点上设置为BACKUP即可
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 99 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样
192.168.1.21/24
}
}

主-主

虚拟IP:192.168.1.21、192.168.1.22      A节点:192.168.1.23       B节点:192.168.1.24

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

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

1.必须有两个虚拟IP, 分别绑定至两个节点上

2.每个节点作为某个虚拟IP的主节点,并同时作为另外一个虚拟IP的备用节点。

3.当某个节点产生故障时,两个虚拟IP自动绑定至正常节点上

也就是说,两个节点的配置应该是交叉的,对同个虚拟IP,交叉互为主备。

节点A配置文件

【/usr/local/keepalived/etc/keepalived/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 30 #超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51 #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
priority 100 #对应备用节点值应该比此值小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.21/24
}
} vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52 #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
priority 99 #主节点的值应该比此值大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.22/24
}
}

节点B配置文件
【/usr/local/keepalived/etc/keepalived/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 30 #超时时间
  router_id LVS_DEVEL #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
  vrrp_skip_check_adv_addr
  vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
} vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51 #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
  priority 99 #对应主节点值应该比此值大
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.1.21/24
  }
} vrrp_instance VI_2 {
  state MASTER
  interface eth0
  virtual_router_id 52 #本机两个vrrp_instance组的此值不能相同,但对应备用节点的此值必须相同
  priority 100 #对应备用节点的值应该比此值小
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.1.22/24
  }
}

脑裂问题

两个节点实际都处于正常工作状态,但是无法接收到彼此的组播通知,这时两个节点均强行绑定虚拟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 5 #运行间隔
}

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

track_script {
  check_local
}

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

1. 自身web服务故障(超时,http返回状态不是200)

2. 无法ping通网关

3. 产生以上任何一个问题,均应该移除本机的虚拟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 $0`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
  exit 1
fi trap "rm -fr $pidfile ; exit 0" 1 2 3 15
echo $$ > $pidfile maxfails=3
fails=0
success=0 while [ 1 ]
do
  /usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null
  if [ $? -ne 0 ] ; then
    let fails=$[$fails+1]
    success=0
  else
    fails=0
    let success=$[$success+1]
  fi   if [ $fails -ge $maxfails ] ; then
    fails=0
    success=0     #check keepalived is running ? try to stop it
    service keepalived status | grep running
    if [ $? -eq 0 ] ; then
      logger -is "local service fails $maxfails times ... try to stop keepalived."
      service keepalived stop 2>&1 | logger
    fi
  fi   if [ $success -gt $maxfails ] ; then
    #check keepalived is stopped ? try to start it
    service keepalived status | grep stopped
    if [ $? -eq 0 ] ; then
      logger -is "service changes normal, try to start keepalived ."
      service keepalived start
    fi
    success=0
  fi
  sleep 3
done

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

如果本地服务连续三次检测失败,就尝试停止keepalived服务(如果keepalived处于运行状态)

如果本地服务连接三次检测成功,但keepalived没有启动,则启动之

关键的执行点,均已经记录到系统日志中(/var/log/messages)

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

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

停止掉本机的keepalived, 稍过一会,就会keepalived服务被自动启动了(这是因为本地服务检测正常)

停止掉本机的nginx, 稍过一会,就会发现keepalived服务也被停止掉了

再启动nginx, 稍过一会,发现keepalived也被正常启动,并绑定了正确的虚拟IP


参考资料:

http://zhangxugg-163-com.iteye.com/blog/1665419

【转载】Keepalived安装使用详解的更多相关文章

  1. lvs keepalived 安装配置详解【转】

    lvs keepalived 安装配置详解 张映 发表于 2012-06-20 分类目录: 服务器相关 前段时间看了一篇文章,lvs做负载均衡根F5差不多,说实话不怎么相信,因为F5没玩过,也无法比较 ...

  2. Keepalived安装使用详解

    简介 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker. 但是它一般不会单独出现, ...

  3. lvs keepalived 安装配置详解

    前段时间看了一篇文章,lvs做负载均衡根F5差不多,说实话不怎么相信,因为F5没玩过,也无法比较.F5相当的贵,真不是一般企业能负担的起的.负载均衡软件也用过不少,nginx,apache,hapro ...

  4. keepalived的配置详解(非常详细)

    keepalived的配置详解(非常详细) 2017-01-22 15:24 2997人阅读 评论(0) 收藏 举报  分类: 运维学习(25)    转载自:http://blog.csdn.net ...

  5. Oracle11g R2客户端安装图文详解过程

    转: Oracle11g R2客户端安装图文详解过程 2018-06-17 13:30:26 大话JAVA的那些事 阅读数 4129更多 分类专栏: Oracle   版权声明:本文为博主原创文章,遵 ...

  6. lvs原理及安装部署详解(参考)

    LVS安装使用详解 摘至:http://www.cnblogs.com/MacoLee/p/5856858.html 简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟 ...

  7. Ubuntu19.04的安装过程详解以及操作系统初始化配置

    Ubuntu19.04的安装过程详解以及操作系统初始化配置                                                                       ...

  8. TortoiseGIT的安装过程详解

    TortoiseGIT简介 TortoiseGIT 是Git版本控制系统的一个免费开源客户端,它是git版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windo ...

  9. linux PHP 编译安装参数详解

    linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

随机推荐

  1. 1022 D进制的A+B

    输入两个非负 10 进制整数 A 和 B (≤2^​30​​−1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 D. 输出格式: 输 ...

  2. 关于send message 函数

    Windows是一个消息驱动模式的系统,SendMessage 是应用程序和应用程序之间进行消息传递的主要手段之一.由于 SendMessage 函数的参数选项过于繁多,因此很有必要作一个汇总,分门别 ...

  3. Python学习(001)--计算机基础

    操作系统发展历史 操作系统并不是与计算机硬件一起诞生的,它是在人们使用计算机的过程中,为了满足两大需求:提高资源利用率.增强计算机系统性能,伴随着计算机技术本身及其应用的日益发展,而逐步地形成和完善起 ...

  4. 解决python3读写中文txt时UnicodeDecodeError : 'ascii' codec can't decode byte 0xc4 in position 5595: ordinal not in range(128) on line 0的问题

    今天使用python3读写含有中文的txt时突然报了如下错误,系统是MAC OS,iDE是pycharm: UnicodeDecodeError : 'ascii' codec can't decod ...

  5. C高级第一次PTA作业(2)

    6-1 在数组中查找指定元素 本题要求实现一个在数组中查找指定元素的简单函数. 1.设计思路 (1)算法: 第一步:定义一个数组名为a的数组,循环变量i,需要查找的数x,和数组元素的个数n. 第二步: ...

  6. 学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4

    当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...

  7. ACM 常见词汇

    rectangular 美:  [rek'tæŋɡjələr] 英:  [rek'tæŋɡjʊlə(r)] adj. 矩形的:成直角的   grid 美:  [ɡrɪd] 英:  [ɡrɪd] n. ...

  8. SendTo MD5 - imsoft.cnblogs

    SendTo MD5 is a small application that allows you to calculate and compare MD5 checksums of files an ...

  9. X-Mirage苹果屏幕录制工具7天试用期破解 imsoft.cnblogs

    X-Mirage (PC) 能让你的 Windows 变成一个 iPhone.iPad 或者 iPod Touch 的屏幕镜像,应用程序.游戏.照片.视频等等一切可以在 iOS 移动端显示的东西,都镜 ...

  10. 杭电 KazaQ's Socks

    KazaQ wears socks everyday. At the beginning, he has n pairs of socks numbered from 1 to n in his cl ...