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.html

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

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

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

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

什么是Keepalived?

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

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

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

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

此外,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"
}

 

 

posted @ 2019-09-27 15:08  wwweee000  阅读(1306)  评论(0编辑  收藏  举报