keepalived使用脚本进行健康检查时的相关配置项。例如keepalived+haproxy实现haproxy的高可用。

keepalived分为vrrp实例的心跳检查和后端服务的健康检查。如果要配置后端服务,则后端服务只能是LVS。但vrrp能独立于lvs存在,例如keepalive结合haproxy、mysql等服务实现它们的高可用。

  1. vrrp实例的心跳检查(lvs,haproxy,mysql...)

    • (1).除了LVS,vrrp只能通过脚本来实现vrrp的健康检查,并通过vrrp实例脚本结束keepalived进程来中断该实例的心跳通告。此时virtual server部分的配置需省略。
    • (2).对于LVS,无需使用任何脚本,因为所有keepalived节点会同时对后端服务进行健康检查,并同时从LVS规则中剔除下线的服务。如果所有后端服务都不健康,那就没有必要切换keepalived。
  2. 后端RS的健康检查(只能是LVS)
    • (1).一般采用TCP_CHECK、HTTP_GET、SSL_GET进行健康检查。
    • (2).但也能自写脚本进行后端服务的健康检查,这种模式称为MISC_CHECK。

以下是从man keepalived中截取的通过脚本进行心跳检查、健康检查时的相关配置选项。man介绍的比较简单,更详细的配置说明可参考:https://github.com/acassen/keepalived/blob/master/doc/keepalived.conf.SYNOPSIS

VRRP script(s)
# 定义一个vrrp脚本,后续vrrp组或vrrp实例要执行某脚本时,需要从此处引用
# 注意,所有vrrp实例都会监控脚本的退出状态码
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> # 要执行的命令或脚本路径
interval <INTEGER> # 脚本调用时间间隔,默认1秒
timeout <INTEGER> # 脚本执行等待超时时长,超过该时长,表示脚本执行失败
weight <INTEGER:-254..254> # 根据该权重值调整vrrp实例优先级值,默认值为0
rise <INTEGER> # 需要成功多少次,vrrp才进行角色状态切换(从fault切换为正常)
fall <INTEGER> # 需要失败多少次,vrrp才进行角色状态切换(从正常切换为fault)
user USERNAME [GROUPNAME] # 脚本执行身份,group默认同username
init_fail # 假定脚本初始化时就处于失败状态
} VRRP synchronization group(s)
# 分别表示切换为主/备/出错(例如监控的eth0坏了)时所执行的脚本。
# 要为脚本传递参数时,使用引号包围整个脚本和参数
notify_master /path/to_master.sh [username [groupname]]
notify_backup /path/to_backup.sh [username [groupname]]
notify_fault "/path/fault.sh VG_1" [username [groupname]] # notify表示只要状态切换都会调用的脚本,且该脚本是在以上三个脚本执行之后再调用的,
# keepalived会自动传递四个参数,因此不要手动为脚本传递参数。
# $1 = "GROUP"|"INSTANCE"
# $2 = vrrp组名称或vrrp实例名
# $3 = 切换的目标状态(MASTER/BACKUP/FAULT)
# $4 = 优先级数值(priority value)
notify /path/notify.sh [username [groupname]] VRRP instance(s)部分 # 监控接口,当某接口down掉时,切换为fault状态
track_interface {
eth0
eth1
eth2 weight <-254..254>
...
} # 监控脚本,即执行vrrp_script定义的脚本
track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254..254>
} # notify_master/backup/fault/stop分别表示切换为主、备、出错(例如监控的eth0坏了)、vrrp停止时所执行的脚本
# 要为脚本传递参数时,使用引号包围整个脚本和参数
notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
notify_stop <STRING>|<QUOTED-STRING> [username [groupname]] # executed when stopping vrrp # notify表示只要状态切换都会调用的脚本,并且该脚本是在以上三个脚本执行之后再调用的
notify <STRING>|<QUOTED-STRING> [username [groupname]] Virtual server(s)部分 # 投票被选举成功或失败时执行的脚本
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING> real_server <IPADDR> <PORT>
{
# 当健康检查的后端rs上线、下线时执行的脚本
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING> # MISC健康检查类型,该类型通过自定义脚本来检查后端健康状况
MISC_CHECK
{
# 执行哪个脚本来判断后端是否健康
misc_path <STRING>|<QUOTED-STRING>
# Script execution timeout
misc_timeout <INT> # 指定一个随机延迟时间,防止同时检查所有后端,指定为0时表示禁止该功能。
# 默认启动该功能,默认最大间隔为delay_loop的值。
warmup <INT> # 如果指定该选项,则根据健康检查脚本的退出状态码动态调整权重值
# 退出状态码为:
# 0:表示检查成功,不做任何权重修改
# 1:表示检查失败
# 2-255:表示检查成功,但权重值减2,例如(状态码为255,则设置权重为253)
misc_dynamic # 指定运行后端健康检查脚本的身份,不指定group时将默认使用username
user USERNAME [GROUPNAME]
}
}
}

例如,在keepalived+haproxy时。

vrrp_script check_haproxy {
script"/etc/keepalived/chk_haproxy.sh"
interval 2
weight 2
} global_defs {
router_id haproxy1
} vrrp_instanceVI_1 {
state MASTER
interface eth0
virtual_router_id 150
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
} virtual_ipaddress{
192.168.1.201
}
track_script {
check_haproxy
}
}

其中check_haproxy的脚本/etc/keepalived/chk_haproxy.sh内容如下:

#!/bin/bash

if ! killall -0 haproxy &>/dev/null;then
serivce haproxy restart
sleep 1
if ! killall -0 haproxy &>/dev/null;then
service keepalived stop
fi
fi

另外一种方式,直接在vrrp_script处定义要执行的命令,而不是使用一个额外的脚本来监控对象。例如:


vrrp_script check_haproxy {
script "killall -0 haproxy" # 此行改变
interval 2
weight 2
} global_defs {
router_id haproxy1
} vrrp_instanceVI_1 {
state MASTER
interface eth0
virtual_router_id 150
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
} virtual_ipaddress{
192.168.1.201
}
track_script {
check_haproxy
}
}

上面的vrrp_script配置中,每两秒检查一次haproxy进程是否存在,连续检查fall <int>次数后都不存在就进入fault状态,由于没有指定fall <int>,所以一次检查失败就进入fault。

其实通过脚本控制比较复杂,因为要考虑脚本的返回值(不是退出状态码)。当然,如果直接像前面示例一样在脚本中直接进行restart、stop等操作也是可以的。

KeepAlived(三):vrrp实例故障转移(keepalived+haproxy)的更多相关文章

  1. 为什么很多人用keepalived来实现redis故障转移

    目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案.Redis作者有一个名为Redis Sentinel的计划 ,据称将会有监控,报警和自动故障转移三大功能,非 ...

  2. MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移

    系统信息: mysql主库 mysql从库 VIP 192.168.1.150 mysql 主主同步都设置 auto-increment-offset,auto-increment-increment ...

  3. 服务器搭建域控与SQL Server的AlwaysOn环境过程(三)配置故障转移

    0 引言 主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的. 在讲解步骤之前需要了解一下故障转移集群仲裁配置 下面图片来自<Windows Server20 ...

  4. Redis源码解析:27集群(三)主从复制、故障转移

    一:主从复制 在集群中,为了保证集群的健壮性,通常设置一部分集群节点为主节点,另一部分集群节点为这些主节点的从节点.一般情况下,需要保证每个主节点至少有一个从节点. 集群初始化时,每个集群节点都是以独 ...

  5. 在Azure上实现Linux Server故障转移

    要充分利用公有云的弹性扩展和高可用, 首先要在应用系统层面支持横向扩展(scale out),这个说起来很容易,或者说对新开发的应用系统而言已经成为标配.但是对已有的.老旧的应用系统来说,这就比较困难 ...

  6. 基于MGR+Atlas的读写分离尝试,以及MGR+Keepalived+Atlas自动故障转移+读写分离设想

    目的是尝试altas的读写分离,现有一套搭建好做测试的MGR(单主),于是就腿搓绳,在MGR基础上搭建altas. 复制环境准备 读写分离理论上讲,跟复制模式没有关系,atlas负责的是重定向读写,至 ...

  7. 记一次Nginx+Keepalived高可用故障转移

    Master端:192.168.2.156 ! Configuration File for keepalived global_defs { notification_email { acassen ...

  8. VRRP笔记二:配置keepalived为实现haproxy高可用的配置文件示例

    ! Configuration File for keepalived global_defs { notification_email { linuxedu@foxmail.com mageedu@ ...

  9. 1、Keepalived及VRRP原理介绍

    keepalived:即在linux中vrrp协议的实现 http://www.keepalived.org/ 什么是Keepalived?  Keepalived是一个用C语言编写的路由软件.该项目 ...

随机推荐

  1. java操作FTP的一些工具方法

    java操作FTP还是很方便的,有多种开源支持,这里在apache开源的基础上自己进行了一些设计,使用起来更顺手和快捷. 思路: 1.设计FTPHandler接口,可以对ftp,sftp进行统一操作, ...

  2. JavaScript基础视频教程总结(061-070章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓

    阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...

  4. windows系统中配置多版本anaconda

    1.最好从国内的镜像站下载anaconda,国外那个站实在是太慢了,清华开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/) 2.如 ...

  5. win7里linux虚拟机安装vmware tools(ubuntu12.04)

    安装Vmware Tools工具 1.安装linux虚拟机(略) 2.虚拟机去启动,选择虚拟机à设置,“硬件”中选择CD/DVD(IDE),右侧选择“使用ISO镜像文件(M)”  -- 文件选择vmw ...

  6. SJCP认证题前五十题填坑

    在做Java的SJCP认证试题时自己整理了一些Java基础细节知识点,以下是知识点陈列 1.标签机制:标签起作用的唯一的地方刚好在迭代语句之前(不然编译错误) continue label1 直接转到 ...

  7. charming_memory

    Memory Master 一 .Forget遗忘 遗忘似乎是记忆的天敌,但是善用遗忘规律却能帮助我们更好的记忆. 复习的最佳时间是实际材料的1~24小时,最晚不超过2天,复习时间太长,就有一种生疏的 ...

  8. Memcached未授权访问

    概念 memcached是一个内存中的键值存储区,用于存储来自数据库调用.API调用或页面呈现结果的任意小数据块(字符串.对象).memcached简单但功能强大.其简单的设计促进了快速部署.易于开发 ...

  9. Java并发编程实战

    代码中比较容易出现bug的场景: 不一致的同步,直接调用Thread.run,未被释放的锁,空的同步块,双重检查加锁,在构造函数中启动一个线程,notify或notifyAll通知错误,Object. ...

  10. 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...