在聊 Keepalived 之前,我们需要先简单了解一下 VRRP。VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而设计的。

简单说下它的工作原理:虚拟路由器由多个路由器组成,每个路由器都有各自的 IP 和共同的 VRID(0-255),其中一个 VRRP 路由器通过竞选成为 MASTER,就会接管 VIP(虚拟漂移IP),对外提供路由服务,其他成为 BACKUP。MASTER 以 IP 组播形式发送 VRRP 协议包,与 BACKUP 保持心跳连接,若 MASTER 不可用,或 BACKUP 接收不到 VRRP 协议包,则 BACKUP 通过竞选产生新的 MASTER,并继续对外提供路由服务,从而实现高可用。

Keepalived 简介

Keepalived 是一款基于 VRRP 协议的高可用软件,借助它可以让多台服务器能像路由器一样做 VIP 虚拟地址的冗余转移,从而提升后端服务器的高可靠性。Keepalived 由一台主服务器和多台备份服务器组成集群,在主服务器和备份服务器上部署相同的服务配置,并使用一个虚拟 IP 地址对外提供服务。当主服务器出现故障时,虚拟 IP 地址会自动漂移到备份服务器。

Keepalived+bfd 配置

VRRP v2 之前的版本虽然配置简单,但只能提供秒级以上的检测。这在十几年前是可用的,但已经不适合现在的环境了。幸运的是,VRRP v2.0.5 加入了对 BFD 的支持。

双向转发检测 BFD(Bidirectional Forwarding Detection)用于快速检测系统之间的通信故障,并在出现故障时通知上层应用。

BFD 提供了一个与介质和协议无关的快速故障检测机制,它具有以下优点:

  • 对网络设备间任意类型的双向转发路径提供快速、轻负荷的故障检测。

  • 用单一的机制对任何介质、任何协议层进行实时检测,并支持不同的检测时间与开销。

因此 VRRP v2 + BFD 得以实现毫秒级的检测。我们可以选用新版本编译测试 BFD,示例如下:

yum install -y libnl-devel
./configure --prefix=/opt/keepalived --enable-bfd --with-init=system
! Configuration File for keepalived

global_defs {
process_names keepalived_bfd
bfd_process_name bfdp
router_id LVS_UPYUN
} bfd_instance bfdp {
neighbor_ip 10.0.2.8 # 对端的服务器心跳ip
source_ip 10.0.2.4 # 本地的服务器心跳ip
} vrrp_instance VI_1 {
...
track_bfd{
bfdp weight 40 # 多跑一个bfd进程来监控心跳
}
}

Keepalived+VRRP v3配置

随着时间的推移,Keepalived 也支持了 VRRP v3 的协议。相较于之前版本的协议,VRRP v3 版本有以下改进:

  • 支持的网络类型不同。VRRP v3 适用于 IPv4 和 IPv6 两种网络,而 VRRP v2 仅适用于 IPv4 网络。

  • 认证功能不同。VRRP v3 不支持认证功能,而 VRRP v2 支持认证功能。VRRP v2 版本保留报文的认证字段,是为了兼容早期版本,因为 VRRP 认证并不能提高安全性。

  • 发送通告报文的时间间隔的单位不同。VRRP v2 中缺省单位为 1 秒,VRRP v3 缺省单位为 100 厘秒。

由于 VRRP v3 协议的改进,其不需要 BFD 也能实现 30ms 内的心跳检测和故障转移。那实践中具体是如何配置的,我们重点来看一下。

! Configuration File for keepalived

global_defs {
router_id SLB-SAD
script_user root
enable_script_security
# 检查vrrp报文中的所有地址比较耗时。默认是跳过检查
vrrp_skip_check_adv_addr
# 重点是启用vrrp3
vrrp_version 3
} vrrp_script chk_upyun {
# 除了心跳检测外,还可以调用脚本做业务上的健康检测
script "/etc/keepalived/bin/check_vip.sh"
interval 1 # check every 1 seconds
fall 1 # require 2 failures for failures
rise 1 # require 1 sucesses for ok
# weight 值为负数时,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差
weight -30
} vrrp_instance upyun_lb {
strict_mode off
advert_int 0.03
state BACKUP
interface eth3
virtual_router_id 19
priority 100
# 当master和backup角色转换时,触发脚本做业务上的切换
notify "/etc/keepalived/bin/change_state.sh" track_script {
chk_upyun
} virtual_ipaddress {
192.168.147.19 label eth3:9
}
}
# 这一段是可选的,如果和lvs规则就可以调用ipvsadm的转发规则
include /etc/keepalived/virserver.conf

配置中用到了“check_vip.sh”和“change_state.sh”的两个脚本,我们也来简单看下。

check_vip.sh

上面配置中只是举例说明,当 ping 丢包严重超过 80% 时,就认为要切换主备关系了。大家也可以根据具体的业务场景做一些逻辑判断,来实现主备切换,以达到高可用的目的。

#!/bin/sh
TMP="/tmp/bad" GATEWAY=$(ip ro|awk '/default/{print $3}')
LOSS=$(ping -fc10 -s1 $GATEWAY | sed -r -n '/loss/s@.* (.*)%.*@\1@p')
if [ $LOSS -ge 80 ];then
echo "${LOSS}% lost #`date`" >> $TMP
fi if [ -e $TMP ] ;then
exit 1
fi

change_state.sh

当检测到服务器的角色转换时,这个脚本就会调用钉钉报警,并且调整业务上的一些操作。如 sysctl.conf 配置或者 iptables 上的规则,甚至可以配合 LVS 做一些负载均衡的部署。

#!/bin/bash
HOME="/etc/keepalived/"
LIP=`/sbin/ip addr | awk '/192.168./{gsub("/.*","");if($2!=""){print $2}}'|sort -u|head -n1`
VIP=$(awk '/virtual_ipaddress/{getline; print $1}' $HOME/keepalived.conf)
URL="https://oapi.dingtalk.com/robot/send?access_token=07xxxxxxxxxxxxx"
[ -z $LIP ] && LIP=$VIP
############################################################################
dingding(){
curl $URL --connect-timeout 10 -H 'Content-Type: application/json' \
-d '{"msgtype": "markdown",
"markdown": {
"title": "数据中心报警",
"text": "* 报警类别: '"$1"'\n* 报警机器: '"$2"'\n* 报警服务: '"$3"'\n* 报警内容: '"$4"'\n* 报警时间: '"$(date "+%Y-%m-%d %T")"'\n"
}
}'
} ENDSTATE=$3
NAME=$2
TYPE=$1
dingding Keepalived $LIP Change_state "$ENDSTATE" case $ENDSTATE in
"BACKUP") # Perform action for transition to BACKUP state
echo "--- I am $ENDSTATE #`date`" >> /tmp/keepalived.log
sed -r -i '/state/s#MASTER#BACKUP#g' $HOME/keepalived.conf
sysctl -w \
net.ipv4.conf.all.arp_accept=1 \
net.ipv4.conf.all.arp_ignore=0 \
net.ipv4.conf.all.arp_announce=0 \
net.ipv4.ip_nonlocal_bind=1
#$HOME/tunl start
exit 0
;;
"FAULT") # Perform action for transition to FAULT state
exit 0
;;
"MASTER") # Perform action for transition to MASTER state
echo "+++ I am $ENDSTATE #`date`" >> /tmp/keepalived.log
sed -r -i '/state/s#BACKUP#MASTER#g' $HOME/keepalived.conf
sysctl -w \
net.ipv4.conf.all.arp_ignore=1 \
net.ipv4.conf.all.arp_accept=1 \
net.ipv4.conf.all.arp_announce=1 \
net.ipv4.ip_nonlocal_bind=1 iptables -L -vn | grep -iqE "vrrp|112"
[ $? = 0 ] || iptables -I INPUT -p vrrp -j ACCEPT
iptables -L -vn | grep -iq "accept .*$VIP"
[ $? = 0 ] || iptables -I INPUT -d $VIP -j ACCEPT
exit 0
;;
*)
echo "Unknown state ${ENDSTATE} for VRRP ${TYPE} ${NAME}"
exit 1
;;
esac

今天的分享就到这了,大家可以扫描下方二维码加又小拍好友,期望与你有更多交流。

推荐阅读

详解 SSL(三):SSL 证书该如何选择?

红利风口下,企业出海如何强势突围?

又拍云之 Keepalived 高可用部署的更多相关文章

  1. LVS+Keepalived高可用部署

    一.LVS+Keepalived高可用部署 一.keepalived节点部署 1.安装keepalived yum install keepalived ipvsadm -y mkdir -p /op ...

  2. Mysql双主热备+LVS+Keepalived高可用部署实施手册

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  3. 腾讯云部署keepalived高可用

    使用背景: 通过调用python SDK在腾讯云手动部署keepalived高可用 部署环境 系统:centos7.3 Master:192.168.0.100 Slave:192.168.0.14 ...

  4. Oracle Compute云快速搭建MySQL Keepalived高可用架构

    最近有个客户在测试Oracle Compute云,他们的应用需要使用MySQL数据库,由于是企业级应用一定要考虑高可用架构,因此有需求要在Oracle Compute云上搭建MySQL高可用集群.客户 ...

  5. 十一.keepalived高可用服务实践部署

    期中集群架构-第十一章-keepalived高可用集群章节======================================================================0 ...

  6. LVS+Keepalived 高可用环境部署记录(主主和主从模式)

    之前的文章介绍了LVS负载均衡-基础知识梳理, 下面记录下LVS+Keepalived高可用环境部署梳理(主主和主从模式)的操作流程: 一.LVS+Keepalived主从热备的高可用环境部署 1)环 ...

  7. 使用Ansible实现nginx+keepalived高可用负载均衡自动化部署

    本篇文章记录通过Ansible自动化部署nginx的负载均衡高可用,前端代理使用nginx+keepalived,端web server使用3台nginx用于负载效果的体现,结构图如下: 部署前准备工 ...

  8. Ubuntu构建LVS+Keepalived高可用负载均衡集群【生产环境部署】

    1.环境说明: 系统版本:Ubuntu 14.04 LVS1物理IP:14.17.64.2   初始接管VIP:14.17.64.13 LVS2物理IP:14.17.64.3   初始接管VIP:14 ...

  9. Keepalived+LVS实现LNMP网站的高可用部署

    Keepalived+LVS实现LNMP网站的高可用部署   项目需求   当我们访问某个网站的时候可以在浏览器中输入IP或者域名链接到Web Server进行访问,如果这个Web Server挂了, ...

随机推荐

  1. 【MySQL】从入门到掌握3-WorkBench

    上期:[MySQL]从入门到掌握2-下载安装 我们安装完MySQL Server的时候,是没有任何界面的. 不过很好,我们有一个工具,MySQL Workbench,他可以简化我们的操作,有点像Jav ...

  2. C# winfrom ListView控件实现自由设置每一行字体及背景色等

    背景:公司经常会需要将日志信息,输出到一个对话框中显示出来.之前一直采用的listbox控件,操作简单,使用方便,但是遗憾的是,不能自由控制每一行的状态. 于是想了如下几个方案: (1)重绘listb ...

  3. 在Apache Cassandra数据库软件中报告高严重性RCE安全漏洞

    研究人员披露了ApacheCassandra一个现已修补的高严重性安全漏洞的细节,如果这个漏洞得不到解决,可能会被滥用来获取受影响安装的远程代码执行(RCE). DevOps公司JFrog的安全研究员 ...

  4. rh358 005 dhcp dhcp6 打印机 ansible配置dhcp和打印机

    部署dhcp服务器 主机发送Discover报文 目标为广播地址 同一网段的dhcp收到报文后,dhcp响应一个offer报文 offer报文:dhcp自己的ip地址.和客户端ip以及使用周期,和客户 ...

  5. spark 读取Geomesa(Hbase)数据

    package com.grady.geomesa import org.apache.hadoop.conf.Configuration import org.apache.spark.SparkC ...

  6. day36-IO流03

    JavaIO流03 4.常用的类02 4.4节点流和处理流 4.4.1基本介绍 节点流可以从一个特定的数据源读写数据,如FileReader.FileWriter 数据源就是存放数据的地方,比如文件. ...

  7. 助力培养高质量AI人才,璞公英乐学平台在日本深受好评!

    璞公英乐学平台(原名"璞睿魔数")自进入日本市场以来,受到日本用户的广泛好评.近日,日本AI门户网站AIsmiley在发刊的杂志<AI人才育成指南>中对璞公英乐学平台做 ...

  8. 【C++】GoogleTest入门指南

    参考: GoogleTest官网 基本概念 要使用GoogleTest,需要包含header gtest/gtest.h 断言Assertions 断言是检查条件是否为真的语句,其结果可能是成功或失败 ...

  9. Rust变量用法与特征

    变量用法与特征 变量绑定 let a = "hello world"  为何不用赋值而用绑定呢(其实你也可以称之为赋值,但是绑定的含义更清晰准确)?这里就涉及 Rust 最核心的原 ...

  10. 基于electron+vue+element构建项目模板之【自定义标题栏&右键菜单项篇】

    1.概述 开发平台OS:windows 开发平台IDE:vs code 本篇章将介绍自定义标题栏和右键菜单项,基于electron现有版本安全性的建议,此次的改造中主进程和渲染进程彼此语境隔离,通过预 ...