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.mzph.cn/news/51393.shtml

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

相关文章

Java相关知识对应leetcode

力扣账号&#xff1a;华为邮箱 类知识点力扣链接Integer转为String Character 判断字符是否是字母或者数字转为小写字母 不可修改 String 转为字符串数组 是否包含某个字符或者字符位置 可修改 StringBuffer 单个字符获取 string转为StringBufferStringBuffer转为String字符…

C语言题目 - 调用qsort函数对数组进行排序

题目 如题 思路 其实没什么难的&#xff0c;只要严格按照 qsort 函数的参数来填充即可&#xff0c;这里要用到函数指针。 qsort 函数的原型如下&#xff1a; void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *)); 参数说明&…

线性代数的学习和整理12: 矩阵与行列式,计算上的差别对比

目录 1 行列式和矩阵的比较 2 简单总结矩阵与行列式的不同 3 加减乘除的不同 3.1 加法不同 3.2 减法不同 3.3 标量乘法/数乘 3.3.1 标准的数乘对比 3.3.2 其他数乘对比 3.4 乘法 4 初等线性变换的不同 4.1 对矩阵进行线性变换 4.2 对行列式进行线性变换呢&#xf…

Maven详解

文章目录 一、引言1.1 为什么需要 Maven&#xff1f;1.2 Maven 解决了哪些问题&#xff1f;1.2.1 添加第三方jar包1.2.2 jar包之间的依赖关系1.2.3 处理jar包之间的冲突1.2.4 获取第三方jar包1.2.5 将项目拆分成多个工程模块1.2.6 实现项目的分布式部署 二、介绍三、Maven 的特…

flutter 雷达图

通过CustomPainter自定义雷达图 效果如下 主要代码 import package:flutter/material.dart; import dart:math; import dash_painter.dart; import model/charts_model.dart;class RadarChart extends StatelessWidget {final List<ChartModel> list;final double maxV…

Flutter系列文章-Flutter 插件开发

在本篇文章中&#xff0c;我们将学习如何开发 Flutter 插件&#xff0c;实现 Flutter 与原生平台的交互。我们将详细介绍插件的开发过程&#xff0c;包括如何创建插件项目、实现方法通信、处理异步任务等。最后&#xff0c;我们还将演示如何将插件打包并发布到 Flutter 社区。 …

Attention is all you need 官方 tensorflow 1.x 实现

https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py 1&#xff0c;搭建cuda10.0环境&#xff0c; 2&#xff0c;安装tensorflow 1.14.0 3&#xff0c;安装python3的 tensor2tensor 包 4&#xff0c;示例代码&#xff1a; impor…

5.物联网LWIP之UDP编程,stm32作为服务器实现大小写转化

UDP编程模型 1.UDP C/S模型&#xff08;代码流程只需要根据以下模型去输入即可&#xff09; 2.UDP API socket int socket(int domain, int type, int protocol); domain: AF_INET 这是大多数用来产生socket的协议&#xff0c;使用TCP或UDP来传输&#xff0c;用IPv4的地址…

从0开始配置eslint

没有在.eslintrc文件中配置parserOptions指定语言版本和模块类型 {"parserOptions": {"ecmaVersion": 7, //指定es版本为es2016"sourceType": "module", //使用import导入模块} }eslint还不能识别jsx语法 {"parserOptions"…

网站是如何识别网络爬虫的?

在爬取数据时&#xff0c;你常常会遇到各种网站的反爬机制。网站是如何检测和拦截网络爬虫的呢&#xff1f;本文将为你揭秘网站使用的几种常见的反爬手段&#xff0c;并为你提供一些解决方案&#xff0c;助你越过反爬壁垒&#xff0c;提升你的实际操作效率。 一、Cookie检测 …

centos7物理机安装并配置外网访问

安装准备工作 安装之前需要准备一下&#xff0c;需要一个U盘&#xff0c;其次需要准备以下内容 1.需要centos7的ISO系统镜像 2.使用UltraISO软件写入ISO镜像 3.一台windows系统 将系统写入到U盘&#xff0c;写入步骤 打开UltraISO点击文件 → 打开&#xff0c;选择Linux镜…

Go 语言入门指南:基础语法和常用特性解析

变量 goCopy code package mainimport ("fmt""math" )func main() {// 声明并初始化变量var a "initial"// 声明并初始化多个变量var b, c int 1, 2// 声明并初始化变量&#xff0c;并推断其类型var d true// 声明变量&#xff0c;但没有初始…

告别数字化系统“物理叠加”,华为云推动智慧门店价值跃迁

文|智能相对论 作者|叶远风 有大屏幕滚动播放广告&#xff1b; 有人脸识别系统让消费者自助结账&#xff1b; 有订单管理系统综合分析一段时间内总体经营情况&#xff1b; 有全门店监控直连总部机房&#xff1b; …… 以搭载数字化系统的硬件设备为表面特征的智慧门店&a…

更改Docker的存储位置

要更改Docker的存储位置&#xff0c;可以按照以下步骤进行操作 文章目录 停止Docker服务编辑Docker配置文件 /etc/docker/daemon.json保存并关闭配置文件,并服务程序配置文件生效移动现有的Docker数据目录到新的存储路径更新文件权限以确保Docker可以访问新的数据目录启动Dock…

Windows快速关闭占用某端口的进程

在Windows操作系统中&#xff0c;你可以使用以下方法来快速关闭占用特定端口的进程&#xff0c;比如端口8848&#xff1a; 使用命令行工具 打开命令提示符&#xff08;Command Prompt&#xff09;。 输入以下命令&#xff0c;将端口号替换为你需要关闭的端口&#xff08;例如…

Java项目时间字段问题-MySQL

Java项目时间字段问题-MySQL ​ 在 Java 项目中&#xff0c;与 MySQL 数据库中的时间字段对应的 Java 类型通常使用 java.time 包中的类&#xff0c;这是从 Java 8 开始引入的日期和时间 API。以下是常见的时间字段和它们在 Java 实体类中的对应类型示例&#xff1a; 1、DATE…

前端面试:【性能优化】前端缓存、CDN、懒加载和预加载

亲爱的前端开发者&#xff0c;Web性能对用户体验至关重要。如果你想让你的网站更快、更具吸引力&#xff0c;就需要关注前端性能优化。在这篇文章中&#xff0c;我们将深入探讨四个关键的性能优化策略&#xff1a;前端缓存、CDN&#xff08;内容分发网络&#xff09;、懒加载和…

按软件开发阶段的角度划分:单元测试、集成测试、系统测试、验收测试

1.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff0c;又称模块测试。对软件的组成单位进行测试&#xff0c;其目的是检验软件基本组成单位的正确性。测试的对象是软件里测试的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;…

Unity OnDrawGizmos的简单应用 绘制圆形

编辑器和配置表各有各的好。 卡牌游戏即使再复杂&#xff0c;哪怕是梦幻西游&#xff0c;大话西游那种&#xff0c;甚至wow那种&#xff0c;用配表都完全没问题。但是崩坏3&#xff0c;或者鬼泣&#xff0c;格斗游戏&#xff0c;可视化编辑器是唯一的选择。 开发初期刚开始配技…

人工智能技术

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