centso 7 Keepalived 配置脚本

#!/bin/bash
#This is keepalived bashshell.
#MASTER/BACKUP
yum install -y openssl openssl-devel keepalived
vim /etc/keepalived/keepalived.conf
sed -i 's/MASTER/BACKUP/g' /etc/keepalived/keepalived.conf
sed -i 's/eth0/ens33/g' /etc/keepalived/keepalived.conf
sed -i 's/priority 100/priority 80/' /etc/keepalived/keepalived.conf
sudo systemctl start keepalived
sudo systemctl enable keepalived

#!/bin/bash

while true
do
if [ `ip a show eth0 |grep 10.0.0.3|wc -l` -ne 0 ]
then
    echo "keepalived is error!"
else
    echo "keepalived is OK !"
fi
done

 

Keepalived  官网地址:https://www.keepalived.org/manpage.htmlhtml

源码二进制包地址:https://www.keepalived.org/software/linux

keepalived-2.0.18.tar.gz:https://www.keepalived.org/software/keepalived-2.0.18.tar.gzgit

Keepalived for Linux - Version 2.0.18 - July 26, 2019 - MD5SUM:={9d1dc77a0e4c628daf9fe453701b54be}github

官网文档阅读:https://www.keepalived.org/doc/算法

什么是Keepalived?

Keepalived是用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础结构提供负载均衡和高可用性的简单而强大的功能。 shell

负载平衡框架依赖于提供第4层负载平衡的著名且普遍使用的Linux虚拟服务器(IPVS)内核模块。vim

Keepalived实现了一组检查器,以根据其运行情况动态,自适应地维护和管理负载平衡的服务器池。另外一方面,VRRP实现了高可用性 协议。安全

VRRP是路由器故障转移的基础砖。bash

此外,Keepalived还实现了一组VRRP有限状态机的挂钩,从而提供了低级和高速协议交互。为了提供最快的网络故障检测,Keepalived实施BFD协议。服务器

VRRP状态转换能够考虑BFD提示来驱动快速状态转换。Keepalived框架能够独立使用,也能够一块儿使用以提供弹性基础架构。

Keepalived是免费软件;您能够根据自由软件基金会发布的GNU通用公共许可证的条款从新分发和/或修改它;许可的版本2,或(由您选择)任何更高的版本。

介绍

负载平衡是一种在实际服务器群集之间分配IP流量的方法,可提供一个或多个高可用性虚拟服务。

在设计负载平衡拓扑时,重要的是要考虑负载平衡器自己以及其背后的真实服务器的可用性。

 

Keepalived提供了用于负载平衡和高可用性的框架。负载平衡框架依赖于广为人知的Linux虚拟服务器(IPVS)内核模块,该模块提供第4层负载平衡。

Keepalived实施一组运行情况检查器,以根据其运行情况动态,自适应地维护和管理负载平衡的服务器池。虚拟冗余路由协议(VRRP)实现了高可用性。

VRRP是路由器故障转移的基础砖。此外,keepalived还实现了一组VRRP有限状态机的挂钩,从而提供了低级和高速协议交互。

每一个Keepalived框架能够独立使用,也能够一块儿使用以提供弹性基础架构。

 

在这种状况下,负载均衡器也能够称为导向器或LVS路由器。

 

简而言之,Keepalived提供两个主要功能:

  • LVS系统的运行情况检查
  • VRRPv2堆栈的实施以处理负载均衡器故障转移

软件设计

Keepalived用纯ANSI/ISO C编写。
该软件围绕提供实时网络设计的中央I/O多路复用器进行链接。主要设计重点是在全部元素之间提供同质的模块化。
这就是建立核心库以删除代码重复的缘由。目的是产生安全可靠的代码,以确保生产的鲁棒性和稳定性。

为了确保健壮性和稳定性,守护程序分为三个不一样的进程:

一个简约的父进程,负责分叉子进程的监视。
两个子进程,一个负责VRRP框架,另外一个负责健康检查。

每一个子进程都有本身的调度I/O多路复用器,因为VRRP调度比运行情况检查程序更明智/更关键,所以能够优化VRRP调度抖动。
这种拆分设计最大程度地减小了对外部库的使用情况进行健康检查的可能性,并最大程度地减小了直到主线程并使其空闲的自身操做,从而避免了由自身引发的故障。

父进程监视框架称为看门狗,其设计是每一个子进程打开一个接受unix域套接字,而后在守护程序引导时,父进程链接到那些unix域套接字并向子进程发送按期(5s)的hello数据包。
若是父级没法将hello数据包发送到远程链接的Unix域套接字,则只需重启子级进程便可。

这种看门狗设计具备2个好处,首先,经过I / O复用器调度程序完成从父进程发送到远程链接的子进程的hello数据包,从而能够检测子调度程序框架中的死循环。
第二个好处是经过使用sysV信号检测死亡的孩子而带来的。运行时,您将在进程列表中看到:

PID 111 Keepalived <-- Parent process monitoring children
112 \_ Keepalived <-- VRRP child
113 \_ Keepalived <-- Healthchecking child


内核组件
Keepalived使用四个Linux内核组件:

1.LVS框架:使用getsockopt和setsockopt调用来获取和设置套接字上的选项。
2.Netfilter框架:支持NAT和假装的IPVS代码。
3.Netlink接口:设置和删除网络接口上的VRRP虚拟IP。
4.组播:将VRRP通告发送到保留的VRRP MULTICAST组(224.0.0.18)。

原子元素

 

 

控制平面
经过文件keepalived.conf完成Keepalived配置。
编译器设计用于解析。解析器与关键字树层次结构配合使用,以将每一个配置关键字与特定处理程序进行映射。
中央多级递归函数读取配置文件并遍历关键字树。解析期间,配置文件被转换为内部存储器表示。

调度程序-I/O多路复用器
全部事件都安排在同一过程当中。Keepalived是一个单一的过程。
Keepalived是一种网络路由软件,对I/O如此封闭。这里使用的设计是一个中央选择(...),负责安排全部内部任务。
不使用POSIX线程库。该框架提供了针对网络目的而优化的本身的线程抽象。

内存管理
该框架提供对某些通用内存管理功能的访问,例如分配,从新分配,发布等。
此框架能够在两种模式下使用:normal_mode和debug_mode。使用debug_mode时,它提供了一种强大的方法来消除和跟踪内存泄漏。
此低级环境经过跟踪内存的分配和释放来提供缓冲区运行不足保护。全部使用的缓冲区都是固定长度的,以防止最终出现缓冲区溢出。

核心组件
该框架定义了全部代码中都使用的一些通用和全局库。
这些库是:html解析,连接列表,计时器,向量,字符串格式,缓冲区转储,网络实用程序,守护程序管理,pid处理,低级TCP layer4。
此处的目标是将代码分解为最大,以限制尽量多的代码重复以增长模块化。

看门狗
该框架提供子进程监控(VRRP和运行情况检查)。
每一个孩子都接受与其本身的看门狗unix域套接字的链接。
父进程将“ hello”消息发送到此子unix域套接字。Hello消息在父端使用I/O复用器发送,并在子端使用I/O复用器接受/处理。
若是父级检测到管道损坏,则它使用sysV信号测试子级是否仍然存在并从新启动它。

跳棋
这是Keepalived的主要功能之一。检查人员负责realserver的运行情况检查。
一个检查器测试realserver是否还活着,该测试以二进制决定结束:从/向LVS拓扑中删除或添加realserver。
内部检查器设计是实时网络软件,它使用彻底多线程的FSM设计(有限状态机)。该检查器堆栈根据第4层到第5/7层测试结果提供LVS拓扑操做。它在由父进程监视的独立进程中运行。

VRRP协议栈
另外一个最重要的Keepalived功能。VRRP(虚拟路由器冗余协议:RFC2338)专一于导演接管,它为路由器备份提供了低级设计。
它实现了完整的IETF RFC2338标准,并为LVS和防火墙设计提供了一些规定和扩展。它实现了vrrp_sync_group扩展,该扩展可确保协议接管后的持久路由路径。
它使用MD5-96位密码提供来实现IPSEC-AH,以确保协议广告交换的安全。有关VRRP的更多信息,请阅读RFC。重要事项:VRRP代码无需LVS支持便可使用,它是为独立使用而设计的。
它在由父进程监视的独立进程中运行。

系统调用
该框架提供了启动额外系统脚本的功能。它主要用于MISC检查器。在VRRP框架中,它提供了在协议状态转换期间启动额外脚本的功能。系统调用完成到一个分叉的过程当中,以不影响全局调度计时器。

Netlink反射器
与IPVS包装器相同。Keepalived具备其本身的网络接口表示形式。IP地址和接口标志是经过内核Netlink通道设置和监视的。Netlink消息传递子系统用于设置VRRP VIP。
另外一方面,Netlink内核消息传递广播功能用于将与接口相关的任何事件反映到咱们的用户空间Keepalived内部数据表示中。
所以,任何其余用户空间(其余程序)的网络连接操做都会经过网络连接内核广播(RTMGRP_LINK和RTMGRP_IPV4_IFADDR)反映到咱们的Keepalived数据表示中。

SMTP
SMTP协议用于管理通知。它使用多线程FSM设计实现IETF RFC821。发送有关健康检查程序活动和VRRP协议状态转换的管理通知。SMTP是经常使用的,能够与任何其余通知子系统(例如GSM-SMS,寻呼机等)接口。

IPVS包装器
该框架用于将规则发送到内核IPVS代码。它提供了Keepalived内部数据表示和IPVS rule_user表示之间的转换。它使用IPVS libipvs保持与IPVS代码的通用集成。

IPVS
由LinuxVirtualServer.org开源项目的Wensong提供的Linux内核代码。IPVS(IP虚拟服务器)在Linux内核内部实现了传输层负载平衡,也称为第4层交换。

网通
Alexey Kuznetov提供的Linux Kernel代码具备很是好的高级路由框架和子系统功能。Netlink用于在内核和用户空间进程之间传输信息。
它由一个用于用户空间进程的基于套接字的标准接口和一个用于内核模块的内部内核API组成。

系统日志
全部keepalived守护程序通知消息都是使用syslog服务记录的。

健康检查框架
每一个健康检查都注册到全局调度框架。这些运行情况检查工做程序线程实现如下类型的运行情况检查:

TCP_CHECK
在第4层工做。为了确保此检查,咱们使用TCP Vanilla检查,该检查使用无阻塞/超时的TCP链接。若是远程服务器未回复此请求(超时),则测试错误,而且该服务器已从服务器池中删除。
HTTP_GET
在第5层工做。对指定的URL执行HTTP GET。而后,使用MD5算法对HTTP GET结果进行求和。若是该总和与指望值不匹配,则测试是错误的,并将服务器从服务器池中删除。
该模块对同一服务实现多URL获取检查。若是您使用的服务器托管多个应用程序服务器,则此功能颇有用。此功能使您可以检查应用程序服务器是否正常运行。
MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。
SSL_GET
与HTTP_GET相同,但使用到远程Web服务器的SSL链接。
MISC_CHECK
经过此检查,能够将用户定义的脚本做为运行情况检查器运行。结果必须为0或1。脚本在目录框上运行,这是测试内部应用程序的理想方法。
可使用完整路径(即/path_to_script/script.sh)调用能够在不带参数的状况下运行的脚本。须要参数的变量须要用双引号引发来(即“ /path_to_script/script.sh arg 1 ... arg n”)
Keepalived的目标是定义一个易于扩展的通用框架,以添加新的Checkers模块。若是您对现有或新检查器的开发感兴趣,请查看源代码中的keepalived / check目录:

https://github.com/acassen/keepalived/tree/master/keepalived/check

故障转移(VRRP)框架
Keepalived实施VRRP协议进行导演故障转移。在已实现的VRRP堆栈中,VRRP数据包分派器负责为每一个VRRP实例解复用特定的I/O。

根据RFC2338,VRRP定义为:

“VRRP specifies an election protocol that dynamically assigns
responsibility for a virtual router to one of the VRRP routers on a LAN.
The VRRP router controlling the IP address(es) associated with a virtual
router is called the Master, and forwards packets sent to these IP
addresses. The election process provides dynamic fail over in the
forwarding responsibility should the Master become unavailable. This allows
any of the virtual router IP addresses on the LAN to be used as the default
first hop router by end-hosts. The advantage gained from using VRRP is a
higher availability default path without requiring configuration of dynamic
routing or router discovery protocols on every end-host.” [rfc2338]

 

注意

该框架是独立于LVS的,所以您能够将其用于LVS Director故障转移,即便是其余须要Hot-Standby协议的Linux路由器也是如此。因为设计和健壮性的缘由,此框架已彻底集成在Keepalived守护程序中。

该框架提供的主要功能是:

故障转移:基于VRRP VIP漫游集的原始VRRP协议。
VRRP实例同步:咱们能够指定2个VRRP实例之间的状态监视,也称为VRRP同步组。它保证2个VRRP实例保持相同状态。同步的实例相互监视。
不错的后备
广告包完整性:使用IPSEC-AH ICV。
系统调用:在VRRP状态转换期间,能够调用外部脚本/程序。


关于将VRRP与虚拟MAC地址一块儿使用的说明
为了减小对接管的影响,某些网络环境将要求使用带有VMAC地址的VRRP。为了实现该目标,Keepalived VRRP框架经过调用配置文件中的“ use_vmac”关键字来实现VMAC支持。

在内部,Keepalived代码将启动虚拟接口,每一个接口专用于特定的virtual_router。Keepalived使用Linux内核macvlan驱动程序来定义这些接口。而后必须使用经过macvlan支持编译的内核。

此外,咱们能够提到VRRP VMAC仅适用于包含如下补丁的内核:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=729e72a10930ef765c11a5a35031ba47f18221c4

默认状况下,MACVLAN接口处于VEPA模式,该模式会过滤掉接收到的MAC源地址与MACVLAN接口的地址匹配的数据包。将MACVLAN接口设置为私有模式将不会基于源MAC地址进行过滤。

或者,您能够指定“ vmac_xmit_base”,这将致使VRRP消息在基础接口上发送和接收,而ARP将从VMAC接口发生。

您可能还须要调整物理接口,以解决众所周知的ARP问题。若是遇到问题,请尝试如下配置:

1.全局配置:

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.all.arp_filter = 0


2.物理接口配置

对于运行VRRP实例的物理以太网接口,请使用:

net.ipv4.conf.eth0.arp_filter = 1

3.VMAC接口
考虑如下VRRP配置:

vrrp_instance instance1 {
state BACKUP
interface eth0
virtual_router_id 250
use_vmac
vmac_xmit_base # Transmit VRRP adverts over physical interface
priority 150
advert_int 1
virtual_ipaddress {
10.0.0.254
}
}

该use_vmac关键字将驱动器的keepalived代码来建立一个名为macvlan接口vrrp.250(默认内部范例VRRP {} virtual_router_id,您只需提供一个参数“use_vmac”关键字,如覆盖此命名:use_vmac vrrp250)。

而后,您须要使用如下命令配置接口:

net.ipv4.conf.vrrp.250.arp_filter = 0
net.ipv4.conf.vrrp.250.accept_local = 1(对于地址全部者,这是必需的)
net.ipv4.conf.vrrp.250.rp_filter = 0

您能够建立notify_master脚本为您自动执行此配置步骤:

vrrp_instance instance1 { state BACKUP interface eth0 virtual_router_id 250 use_vmac priority 150 advert_int 1 virtual_ipaddress { 10.0.0.254 } notify_master "/usr/local/bin/vmac_tweak.sh vrrp.250"}

相关文章
相关标签/搜索