Linux —— keepalived

简介 

Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。
Keepalived 开源并且免费的软件。

Keepalived 的2大核心功能


    1. loadbalance 负载均衡 LB:ipvs--》lvs软件在linux内核里已经安装,不需要单独安装
    2. high-availability 高可用 HA : vrrp协议

keepalived实现负载均衡的功能是依靠lvs这个软件里实现的

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

负载均衡和高可用性是2个概念
    负载均衡:将很多的请求分散到后端很多的服务器上  --》化解压力的一个软件
    高可用: 有2个或者多个服务器(人)做相同的事情,互相备份。

高可用的软件:keepalived  、HA Proxy、heartbeat

进程

keepalived正常启动的时候,共启动3个进程,一个是父进程,负责监控其子进程,一个是vrrp子进程,另外一个是checkers子进程
两个子进程都被系统watchdog看管,两个子进程各自负责复杂自己的事。

 vrrp协议  虚拟路由冗余协议

工作在网络层 

VRRP是一种容错协议,它通过把几台路由设备联合组成一台虚拟的路由设备,并通过一定的机制来保证当主机的下一跳设备出现故障时,可以及时将业务切换到其它设备,从而保持通讯的连续性和可靠性。

     VRRP将局域网内的一组路由器划分在一起,称为一个备份组。备份组由一个Master路由器和多个Backup路由器组成,功能上相当于一台虚拟路由器。局域网内的主机只需要知道这个虚拟路由器的IP地址,并不需知道具体某台设备的IP地址,将网络内主机的缺省网关设置为该虚拟路由器的IP地址,主机就可以利用该虚拟网关与外部网络进行通信。

     VRRP将该虚拟路由器动态关联到承担传输业务的物理路由器上,当该物理路由器出现故障时,再次选择新路由器来接替业务传输工作,整个过程对用户完全透明,实现了内部网络和外部网络不间断通信。
 

VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18

参考:https://blog.csdn.net/zhongzh86/article/details/81537644

vrrp协议工作在哪层
    网络层
vrrp协议的组播地址:
        封装角度: 
            帧: 源mac,目的mac
            vrrp协议: 封装
            ip协议


vrrp协议的工作原理:
    选举的过程:
        1.所有的路由器或者服务器发送vrrp宣告报文,进行选举,必须是相同vrid和认证密码的,优先级高的服务器或者路由器会被选举为master,其他的机器都是backup
        2.master定时(Advertisement Interval)发送VRRP通告报文,以便向Backup路由器告 知自己的存活情况。 默认是间隔1秒
        3.接收Master设备发送的VRRP通告报文,判断Master设备的状态是否正常。 如果超过1秒没有收到vrrp报文,就认为master挂了,开始重新选举新的master,vip会漂移到新的master上

vip是虚拟的ip地址,真正对外提供业务ip地址,可以告诉用户的

名词术语 

单点故障: 某些重要的应用,只有1个节点,如果这个节点出现故障,导致服务不可用。

高可用: high availability  :至少有2个以上的节点提供服务,互相备份,其中的一个坏了,另外一个可用顶替。
        灾备---》多搞几台机器--》成本会增加

master  :主要的,对外提供服务的
backup :备份的,不对外提供服务,在master是好的情况下。一旦master挂了,backup马上就会接替master的工作,成为master

VRRP的工作过程

(1)        虚拟路由器中的路由器根据优先级选举出Master。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务;

(2)        Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状况;

(3)        如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master;

(4)        虚拟路由器状态切换时,Master路由器由一台设备切换为另外一台设备,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息。网络中的主机感知不到Master路由器已经切换为另外一台设备。

(5)        Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。

由此可见,为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:

Master路由器的选举;

Master路由器状态的通告;

同时,为了提高安全性,VRRP还提供了认证功能;

Master路由器的选举

VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。初始创建的路由器工作在Backup状态,通过VRRP报文的交互获知虚拟路由器中其他成员的优先级优先级越高,则越有可能成为Master路由器。

Master路由器状态的通告

Master路由器周期性地发送VRRP报文,在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP报文的情况来判断Master路由器是否工作正常。

认证方式

无认证:不进行任何VRRP报文的合法性认证,不提供安全性保障。

简单字符认证:在一个有可能受到安全威胁的网络中,可以将认证方式设置为简单字符认证。发送VRRP报文的路由器将认证字填入到VRRP报文中,而收到VRRP报文的路由器会将收到的VRRP报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是合法的VRRP报文;否则认为接收到的报文是一个非法报文。

MD5认证:在一个非常不安全的网络中,可以将认证方式设置为MD5认证。发送VRRP报文的路由器利用认证字和MD5算法对VRRP报文进行加密,加密后的报文保存在AuthenticationHeader(认证头)中。收到VRRP报文的路由器会利用认证字解密报文,检查该报文的合法性

IP头参数

VRRP包的源地址是本机地址,目的地址必须为 224.0.0.18,为一多播地址;IP协议号为112;IP包的TTL值必须为255。 

VRRP协议数据格式

 现象

vip漂移

当master服务器挂了之后,vip自动漂移到backup服务器上

master 挂了,vip会漂到backup服务器上

在master上关闭下keepalived服务就可以了,在backup上查看是否有vip地址

vip脑裂

2台或者多台LB上都有vip地址

产生脑裂现象的原因:

1.vrid(虚拟路由id)不一样
2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
3.认证密码不一样也会出现脑裂

脑裂有没有危害?如果有危害对业务有什么影响?

    没有危害,能正常访问,反而还有负载均衡的作用
    脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的

keepalived的架构

单vip 架构

只有master上有vip,backup上没有vip,这个时候master会比较忙,backup机器会比较闲,设备使用率比较低


双vip 架构

启动2个vrrp实例,每台机器上都启用2个vrrp实例,一个做master,一个做backup,启用2个vip,每台机器上都会有一个vip,这2个vip都对外提供服务,这样就可以避免单vip的情况下,一个很忙一个很闲。  可以提升设备的使用率

配置

[root@lb-1 keepalived]# pwd
/etc/keepalived
[root@lb-1 keepalived]# ls
keepalived.conf
[root@lb-1 keepalived]# vim keepalived.conf 
[root@lb-1 keepalived]# cat keepalived.conf 
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 59priority 120advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.227.188}
}
vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 60priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.227.199}
}
[root@lb-1 keepalived]# 第2台机器上的配置
[root@lb2 keepalived]# cat keepalived.conf 
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 59priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.227.188}
}
vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 60priority 120advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.227.199}
}[root@lb2 keepalived]# 

keepalived的健康检查

参考:https://www.cnblogs.com/Yuanbangchen/p/16551032.html

vrrp_script,track_script   

只要vrrp示例在运行,脚本就会执行

keepalived调用脚本进行资源监控
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点分两步:(1) 先定义一个脚本;(2) 调用此脚本
vrrp_script SCRIPT_NAME {  # 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换,定义在与vrrp_instance平级。script <STRING>|<QUOTED-STRING>     # shell命令或脚本路径,此脚本返回值为非0时(假),会触发下面OPTIONS执行interval <INTEGER>                    # 间隔时间,单位为秒,默认1秒timeout <INTEGER>                     # 超时时间weight <INTEGER:-254..254>            # 权重,监测失败后会执行权重相加,权重可以为负数即相加后降低本机权重fall <INTEGER>                        # 脚本几次失败转换为失败rise <INTEGER>                        # 脚本连续监测成功后,把服务器从失败标记为成功的次数user USERNAME [GROUPNAME]           # 执行监测的用户或组init_fail                           # 设置默认标记为失败状态,监测成功之后再转换为成功状态}           
track_script {           #追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容,定义在vrrp_instance里。SCRIPT_NAMESCRIPT_NAME
}  
[root@localhost7A ~]# cat  /etc/keepalived/keepalived.conf
global_defs {notification_email {348987564@qq.com  }notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30router_id localhost7Avrrp_iptables#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.100.100
}
vrrp_script chk_down {   #定义脚本 说明:两台KA都需要/etc/keepalived/down,建议使用网络挂载方式这个文件夹,也叫仲裁盘。 script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0" # down存在时返回非0,触发权重-30interval 1weight -30fall 3rise 2timeout 2
}
vrrp_script chk_nginx { #定义脚本script “/usr/bin/killall -0 nginx "  #0表示检查进程是否运行。interval 1weight -20  #减后要小于backup中priority的值。fall 2rise 1
}
vrrp_instance zzhz {state MASTERinterface eth0virtual_router_id 88priority 88       advert_int 2        authentication {auth_type PASSauth_pass centos}virtual_ipaddress {192.168.80.222/24 dev eth0 label eth0:1}track_script { chk_downchk_nginx  #在vrrp示例里调用此脚本}
}
virtual_server 192.168.80.222  80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPsorry_server 127.0.0.1 80real_server 192.168.80.120 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 3delay_before_retry 3}      }  real_server 192.168.80.130 80 {weight 1HTTP_CHECK {connect_ip 192.168.80.130connect_port 80bindto 192.168.80.100bind_port 7777connect_timeout 3nb_get_retry 3delay_before_retry 3}}
} 

notify

只会执行一次

用法

  notify_master:当当前节点成为master时,通知脚本执行任务(一般用于启动某服务,比如nginx,haproxy等)
  notify_backup:当当前节点成为backup时,通知脚本执行任务(一般用于关闭某服务,比如nginx,haproxy等)
  notify_fault:当当前节点出现故障,执行的任务; 

  notify_stop  VRRP停止后后执行的脚本
 

案例

监控本机的nginx进程是否运行,如果nginx进程不运行就立马将优先级降低30,观察vip是否漂移?

1.编写监控nginx的脚本

1.编写监控nginx的脚本如何判断nginx是否运行,方法很多?1.pidof  nginx2.killall -0 nginx
[root@lb-1 nginx]# pwd
/nginx
[root@lb-1 nginx]# cat check_nginx.sh 
#!/bin/bash#检测nginx是否正常运行
if  /usr/sbin/pidof  nginx  ;thenexit 0
elseexit 1
fi
[root@lb-1 nginx]# 
[root@lb-1 nginx]# chmod +x check_nginx.sh 
[root@lb-1 nginx]# ll
总用量 4
-rwxr-xr-x 1 root root 102 12月 21 15:01 check_nginx.sh
[root@lb-1 nginx]# keepalived 会通过看脚本执行的返回值来判断脚本是否正确执行0 执行成功非0 表示执行失败在2台负载均衡器上都要完成脚本的编写,并且授予可执行权限
[root@lb2 keepalived]# mkdir /nginx
[root@lb2 keepalived]# cd /nginx/
[root@lb2 nginx]# ls
[root@lb2 nginx]# vim check_nginx.sh
[root@lb2 nginx]# ll
总用量 4
-rw-r--r-- 1 root root 128 12月 21 15:06 check_nginx.sh
[root@lb2 nginx]# chmod +x check_nginx.sh 
[root@lb2 nginx]# ll
总用量 4
-rwxr-xr-x 1 root root 128 12月 21 15:06 check_nginx.sh
[root@lb2 nginx]# 

2.在keepalived里定义监控脚本

#定义监控脚本chk_nginx
vrrp_script chk_nginx {
#当脚本/nginx/check_nginx.sh脚本执行返回值为0的时候,不执行下面的weight  -30的操作,只有脚本执行失败,返回值非0的时候,就执行执行权重值减30的操作
script "/nginx/check_nginx.sh"
interval 1
weight -30
}

3.在keepalived里调用监控脚本

要用在vrrp实例里

vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 59priority 120advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.227.188}
#调用监控脚本
track_script {
chk_nginx
}}

如果检查到nginx进程关闭,立马关闭keepalived的软件

第1步先编写脚本

#当本机成为backup的时候,立马执行下面的脚本
notify_backup  "/nginx/halt_keepalived.sh"
[root@lb-1 nginx]# pwd
/nginx
[root@lb-1 nginx]# ls
check_nginx.sh  halt_keepalived.sh
[root@lb-1 nginx]# cat halt_keepalived.sh 
#!/bin/bashservice  keepalived stop
[root@lb-1 nginx]# 


第2步:在vrrp实例里使用notify_backup 调用脚本

如果负载均衡器上的nginx程序出现问题,keepalived是否还有价值? 

keepalived的价值是建立在nginx能正常工作的情况下,如果nginx异常,这台机器就不是负载均衡器了,需要停止它的master身份,将优先级降低,让位给其他的机器。  背后需要有健康检测功能。

负载均衡

keeaplived的负载均衡功能是通过lvs软件实现的,这个软件linux里自带,不需要安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/104294.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js 简单使用 开始

1.概要 问&#xff1a;体验一下node.js 看一下如何运行。 答&#xff1a;使用命令 node 文件名.js 2.举例 2.1 代码准备(main.js) console.log(第一行node.js代码); 2.2 运行效果

网络安全入口设计模式

网络安全入口涵盖了几种设计模式&#xff0c;包括全局路由模式、全局卸载模式和健康终端监控模式。网络安全入口侧重于&#xff1a;全局路由、低延迟故障切换和在边缘处减轻攻击。 上图包含了3个需求。 •网络安全入口模式封装了全局路由模式。因此&#xff0c;实现可以将请求路…

springBoot防止重复提交

两种方法&#xff0c; 一种是后端实现&#xff0c;较复杂&#xff0c;要通过自定义注解和AOP以及Redis组合实现 另一种是前端实现&#xff0c;简单&#xff0c;只需通过js&#xff0c;设置过期时间&#xff0c;一定时间内&#xff0c;多次点击按钮只生效一次 后端实现 自定义注…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 等等开头

不与世俗为伍。哪怕这是自己许给自己的诅咒。 —— 宫崎骏 《红猪》 最近&#xff0c;在使用最新版的AndroidStudio打开一个两年前的项目时候&#xff0c;报了一个如下的错误&#xff1a;【cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容】。应以 ‘…

从2023年世界机器人大会发现机器人新趋势

机器人零部件为何成2023年世界机器人大会关注热门&#xff1f; 在原先&#xff0c;机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今&#xff0c;机器人的主体框架结构已经落实&#xff0c;更多机器人已经开始深入到各类场景中…

论文阅读 FOCUS-AND-DETECT: A SMALL OBJECT DETECTION FRAMEWORK FOR AERIAL IMAGES

文章目录 FOCUS-AND-DETECT: A SMALL OBJECT DETECTION FRAMEWORK FOR AERIAL IMAGESABSTRACT1 Introduction2 Related Work3 Focus-and-Detect3.1 Overview3.2 Focus Stage3.2.1 Generating Ground-Truth Boxes of Focal Regions Using Gaussian Mixture Model 3.3 Detection …

横扫“盲区”、“看透”缺陷,维视智造推出短波红外相机

在可见光领域&#xff0c;工业相机的视觉应用已经十分成熟&#xff0c;但在日常的客户咨询中&#xff0c;我们也经常接到一些“超纲需求”——客户想要检测“白底上的白色缺陷”、“不透明包装内的透明物体有无”等&#xff0c;均属于可见光无法实现的检测&#xff0c;而市面上…

Ubuntu20.04安装软件报错:The following packages have unmet dependencies

Ubuntu20.04更换阿里云源后安装软件都会报错&#xff1a;The following packages have unmet dependencies 查看资料&#xff0c;大概是ubuntu本身的源比较版本较老&#xff0c;而阿里云的源比较新&#xff0c;因此版本不匹配造成依赖的库不匹配&#xff0c;所以只要将阿里云的…

基于 SVG 的图形交互方案实践

不知道从什么时候起&#xff0c;人们开始喜欢上数字大屏这种“花里胡哨”的东西&#xff0c;仿佛只要用上“科技蓝”这样神奇的色调&#xff0c;就可以让一家公司焕然一新&#xff0c;瞬间变得科技感满满。不管数字大屏的实际意义&#xff0c;是用来帮助企业监控和决策&#xf…

汽车制造业外发文件时 如何阻断泄密风险?

汽车制造业是我国国民经济发展的支柱产业之一&#xff0c;具有产业链长、关联度高、就业面广、消费拉动大等特性。汽车制造行业景气度与宏观经济、居民收入水平和固定资产投资密切相关。 汽车制造业产业链长&#xff0c;关联度高&#xff0c;汽车制造上游行业主要为钢铁、化工…

Docker搭建elasticsearch+kibana测试

最近需要做大数据画像&#xff0c;所以先简单搭建一个eskibana学习使用&#xff0c;记录一下搭建过程和遇到的问题以及解决办法 1.拉取es和kibana镜像 在拉取镜像之前先搜索一下 elasticsearch发现是存在elasticsearch镜像的&#xff0c;我一般习惯性拉取最新镜像&#xff0c…

CSS中的vertical-align属性

vertical-align 1.CSS属性 - vertical-align 2.深入理解vertical-align – line boxes This property affects the vertical positioning inside a line box of the boxes generated by an inline-levelelement. 官方文档的翻译&#xff1a;vertical-align会影响 行内块级元素…

如何将下载的安装包导入PyCharm

1. 下载安装包 这里以pyke为例。下载好之后解压缩&#xff0c;然后放入/Lib/site-packages/pyke-1.1.1 2. 打开PyCharm的终端进行安装 python setup.py install 3. 安装好之后导入即可使用 import pyke

2023年7月京东空气净化器行业品牌销售排行榜(京东运营数据分析)

随着科技发展&#xff0c;智能家具在日常生活中出现的频率越来越高&#xff0c;许多曾经不被关注的家电也出现在其中&#xff0c;包括近年来逐渐兴起的空气净化器。伴随人们对自身健康的重视度越来越高&#xff0c;作为能够杀灭空气污染物、有效提高空气清洁度的产品&#xff0…

龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP

1. 描述 LT7911UX是一种高性能的Type-C/DP1.4a到MIPI或LVDS芯片。HDCP RX作为HDCP中继器的上游端&#xff0c;可以与其他芯片的HDCP TX协同工作&#xff0c;实现中继器的功能。 对于DP1.4a输入&#xff0c;LT7911UX可以配置为1/2/4车道。自适应均衡使其适用于长电缆应用&#…

bash: conda: command not found

问题描述&#xff1a; 在Pycharm上用SSH远程连接到服务器&#xff0c;打开Terminal准备查看用 conda 创建的虚拟环境时&#xff0c;却发现调用 conda 指令时出现以下报错&#xff1a; -bash: conda: command not found如果使用Xshell 利用端口号直接连接该 docker 容器&#…

人工智能技术

人工智能技术是什么&#xff1f; 人工智能技术&#xff08;Artificial Intelligence Technology&#xff0c;AI技术&#xff09;是一种模仿人类智能和思维方式的计算机技术&#xff0c;旨在使计算机能够执行需要人类智能才能完成的任务。这些任务包括理解自然语言、解决问题、…

【IMX6ULL驱动开发学习】10.Linux I2C驱动实战:AT24C02驱动设计流程

前情回顾&#xff1a;【IMX6ULL驱动开发学习】09.Linux之I2C框架简介和驱动程序模板_阿龙还在写代码的博客-CSDN博客 目录 一、修改设备树&#xff08;设备树用来指定引脚资源&#xff09; 二、编写驱动 2.1 i2c_drv_read 2.2 i2c_drv_write 2.3 完整驱动程序 三、上机测…

Python数据挖掘与机器学习

近年来&#xff0c;Python编程语言受到越来越多科研人员的喜爱&#xff0c;在多个编程语言排行榜中持续夺冠。同时&#xff0c;伴随着深度学习的快速发展&#xff0c;人工智能技术在各个领域中的应用越来越广泛。机器学习是人工智能的基础&#xff0c;因此&#xff0c;掌握常用…

Java虚拟机(JVM):堆溢出

一、概念 Java堆溢出&#xff08;Java Heap Overflow&#xff09;是指在Java程序中&#xff0c;当创建对象时&#xff0c;无法分配足够的内存空间来存储对象&#xff0c;导致堆内存溢出的情况。 Java堆是Java虚拟机中用于存储对象的一块内存区域。当程序创建对象时&#xff0c…