在聊 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. [NOI2021] 密码箱 (平衡树,连分数,Stern-Brocot 树,矩阵)

    题面 记忆犹新 题解 f f f 函数值给得非常明显,一看就给人一种熟悉感--这不是连分数吗? 众所周知,连分数有个递推公式,即 p i = a i p i − 1 + p i − 2 q i = a ...

  2. python(第四版阅读心得)(系统工具)(一)

    本章将会讲解python常用系统工具的介绍 python中大多数系统级接口都集中在两个模块: sys 和 os 但仍有部分其他标准模块也属于这个领域 如: 常见: glob   用于文件名扩展 soc ...

  3. C++ 初识函数模板

    1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板. 如果现在有一个需求,要求编写一个求 2 个数字中最小数字的函数,这 2 个数字可以是 int类型,可以是 float ...

  4. KingbaseES V8R6集群外部备份案例

    案例说明: 本案例采用sys_backup.sh执行物理备份,备份使用如下逻辑架构:集群采用CentOS 7系统,repo采用kylin V10 Server. 一主一备+外部备份 此场景为主备双机常 ...

  5. 使用PBIS将Linux加入域

     使用PBIS将Linux加入域 很多企业已经部署的微软的活动目录,为了方便管理,可以把Linux加入域.网上流传了很多把Linux加入域的方法,感觉比较复杂,并且似乎并没有真正的加入域.只是完成 ...

  6. Ubuntu22.04 安装配置流水账

    前两天为了测一个CH340的bug, 装了三遍20.04. bug解决完, 心想反正也要重新装各种软件, 不如直接装22.04吧. 把涉及的安装记录一下方便将来参考. 制作启动U盘 在Ubuntu网站 ...

  7. CAP 6.2 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 6.2 版本正式版,在这个版本中我们主要做了一些功能优化,以及针对目前已经发现的几个 BUG 进行了修复了. 那么,接下来我们具体看一下吧. 总览 可能有些人 ...

  8. Kubernetes 控制器

    在实际使用的时候并不会直接使用 Pod,而是会使用各种控制器来满足我们的需求,Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致,它们就是 Kubernetes 的大脑. ...

  9. Windows上Navicat工具远程连接PostgreSQL数据库

    首先,在pgdata(也就是在安装pg时指定的存放数据的文件见中)文件夹中,找到pg_hba.conf文件,在文件最后写入下面的内容: host all all 0.0.0.0/0 trust 接着, ...

  10. influxDB2.2

    下载安装 下载地址 下载后在解压目录中,输入cmd执行exe文件 浏览器访问localhost:8086 选择快速开始,填写用户信息,组织信息 相关概念 InfluxDB是一个由InfluxData开 ...