高可用集群KEEPALIVED
一、集群相关概念简述
HA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。
1、集群的分类
- LB:负载均衡集群
- lvs负载均衡
- nginx反向代理
- HAProxy
- HA:高可用集群
- heartbeat
- keepalived
- redhat5 : cman + rgmanager , conga(WebGUI) --> RHCS(Cluster Suite)集群套件
- redhat6 : cman + rgmanager , corosync + pacemaker
- redhat7 : corosync + pacemaker
- 数据库,redis
- HPC:高性能集群
- SPoF: Single Point of Failure,解决单点故障
2.系统可用性的计算公式
A=MTBF/(MTBF+MTTR)
- A:高可用性,指标:95%, 99%, 99.5%, ...., 99.999%,99.9999%等
- MTBF:平均无故障时间
- MTTR:平均修复时间
3.系统故障
硬件故障:设计缺陷、 wear out (损耗)、非人为不可抗拒因素软件故障:设计缺陷 bug
4.实现高可用
active/passive 主 / 备active/active 双主active --> HEARTBEAT --> passiveactive <--> HEARTBEAT <--> active
二.keepalived
1.Keepalived介绍
Keepalived是Linux下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,
它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,
与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成,
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能.
2.keepalived相关概念
- vrrp协议:Virtual Redundant Routing Protocol 虚拟冗余路由协议
- Virtual Router:虚拟路由器
- VRID(0-255):虚拟路由器标识
- master:主设备,当前工作的设备
- backup:备用设备
- priority:优先级,优先级越大优先工作,具体情况示工作方式决定
- VIP:虚拟IP地址,正真向客户服务的IP地址
- VMAC:虚拟MAC地址(00-00-5e-00-01-VRID)
- 抢占式:如果有优先级高的节点上线,则将此节点转为master
- 非抢占式:即使有优先级高的节点上线,在当前master工作无故障的情况运行抢占;等到此master故障后重新按优先级选举master
- 心跳:master将自己的心跳信息通知集群内的所有主机,证明自己正常工作
- 安全认证机制:
- 无认证:任何主机都可成为集群内主机,强烈不推荐
- 简单的字符认证:使用简单的密码进行认证
- AH认证
- sync group:同步组,VIP和DIP配置到同一物理服务器上
- MULTICAST:组播,多播
- Failover:master故障,故障切换,故障转移
- Failback:故障节点重新上线,故障切回
3.VRRP协议与工作原理
在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。
每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。
VRRP相关术语
VRRP路由器:执行VRRP协议一个或多个实例的路由器
虚拟路由器:由一个Master路由器和多个Backup路由器组成。当中,不管Master路由器还是Backup路由器都是一台VRRP路由器,下行设备将虚拟路由器当做默认网关。
VRID:虚拟路由器标识,在同一个VRRP组内的路由器必须有相同的VRID,事实上VRID就相当于一个公司的名称,每一个员工介绍自己时都要包括公司名称,表明自己是公司的一员,相同的道理,VRID表明了这个路由器属于这个VRRP组。
Master路由器:虚拟路由器中承担流量转发任务的路由器
Backup路由器:当一个虚拟路由器中的Master路由器出现问题时,可以取代Master路由器工作的路由器
虚拟IP地址:虚拟路由器的IP地址,一个虚拟路由器能够拥有一个或多个虚拟IP地址。
IP地址拥有者:接口IP和虚拟路由器IP地址同样的路由器就叫做IP地址拥有者。
主IP地址:从物理接口设置的IP地址中选择,一个选择规则是总是选用第一个IP地址,VRRP通告报文总是用主IP地址作为该报文IP包头的源IP。
虚拟MAC地址:组成方式是00-00-5E-00-01-{VRID},前三个字节00-00-5E是IANA组织分配的,接下来的两个字节00-01是为VRRP协议指定的,最后的VRID是虚拟路由器标识,取值范围[1,255]
VRRP相关技术
通告:心跳,优先级等;周期性工作方式:抢占式,非抢占式安全认证:无认证简单字符认证:预共享密钥MD5工作模式:主 / 备:单虚拟路由器主 / 主:主 / 备(虚拟路由器 1 ),备 / 主(虚拟路由器 2 )
4.keepalived功能
vrrp 协议的软件实现,原生设计目的为了高可用 ipvs 服务官网: http://keepalived.org/功能:基于 vrrp 协议完成地址流动为 vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 )为 ipvs 集群的各 RS 做健康状态检测基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持 nginx 、 haproxy 等服务
5.Keepalived体系结构
Keepalived起初是为LVS设计的,由于Keeplalived可以实现对集群节点的状态检测,而IPVS可以实现负载均衡功能,因此,Keepalived借助于第三方模块IPVS就可以很方便地搭建一套负载均衡系统,在这里有个误区,由于Keepalived可以和IPVS一起很好的工作,所以会有人以为Keepalived就是一个负载均衡软件,这种理解是错误,
在Keepalived当中IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时开打负载均衡功能,也可以通过编译参数关闭。
NetLINK模块主要用于实现一些高级路由框架和一些相关参数的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。
这个图我们可以看到用户空间层(user space),是建立在内核空间层之上的(kernel sapce),
用户空间层,主要有4个部分:
Scheduler I/O Multiplexer 是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求,
Memory Mngt 是一个内存管理机制,这个框架提供了访问内存的一些通用方法
Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析
Core componets 这部分主要保护了下面5个部分
1.Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
2.Checkers: 这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
3.VRRP Stack: 这时keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。
4.IPVS wrapper: 这个是IPVS功能的一个实现,IPVS warrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
5.Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换 ,
Netlink Reflector的所有请求最后都发送到内核空间层的NETLINK 模块来完成。
6.keepalived环境准备
要求:各节点时间必须同步:ntp,chrony, 关闭防火墙和selinux
7.keepalived相关配置文件
软件包名:keepalived
主程序文件:/usr/sbin/keepalived
主配置文件:/etc/keepalived/keepalived.conf
配置文件示例:/usr/share/doc/keepalived/
Unit File:/lib/systemd/system/keepalived.service
Unit File的环境配置文件:/etc/sysconfig/keepalived
安装软件包
# yum install keepalived
配置文件参数详解
全局配置
! Configuration File for keepalived
global_defs {
notification_email {
594233887@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
timiniglee-zln@163.com
}
notification_email_from keepalived@KA1.timinglee.org #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id KA1.timinglee.org #每个keepalived主机唯一标识
#建议使用当前主机名,但多节点重名不影响
vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能
#启用此配置后,如果收到的通告报文和上一个报文是同一 #个路由器,则跳过检查,默认值为全检查
vrrp_strict #严格遵循vrrp协议#启用此项后以下状况将无法启动服务:#1.无VIP地址#2.配置了单播邻居#3.在VRRP版本2中有IPv6地址#建议不加此项配置
vrrp_garp_interval 0 #报文发送延迟,0表示不延迟
vrrp_gna_interval 0 #消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}
配置虚拟路由器
vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和VIP不在一个网卡
virtual_router_id 51 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此值必须唯一#否则服务无法启动#同属一个虚拟路由器的多个keepalived节点必须相同#务必要确认在同一网络中此值必须唯一
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254#值越大优先级越高,每个keepalived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
uth_pass 1111 #预共享密钥,仅前8位有效#同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
172.25.254.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认32
172.25.254.101/24 dev eth1
172.25.254.102/24 dev eth2 label eth2:1
}
}
keepalived虚拟路由管理
实验环境
设备 | 角色 | IP |
ka1 | keepalived1 | 192.168.10.170/24 |
ka2 | keepalived2 | 192.168.19.180/24 |
webserver1 | real server | 192.168.10.220/24 |
webserver2 | real server | 192.168.10.230/24 |
注:vip设置为192.168.10.240/24
四台主机全部关闭防火墙和selinux
webserver1,webserver2上安装web服务,后面的测试可以更加清晰的看出结果
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo webserver1 - 192.168.10.220 > /var/www/html/index.html
[root@webserver1 ~]# systemctl restart httpd.service
[root@webserver1 ~]# curl 192.168.10.220
webserver1 - 192.168.10.220
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2 - 192.168.10.230 > /var/www/html/index.html
[root@webserver2 ~]# systemctl restart httpd.service
[root@webserver2 ~]# curl 192.168.10.230
webserver2 - 192.168.10.230
ka1,ka2上安装keepalived软件包
[root@ka1 ~]# yum install keepalived -y
[root@ka2 ~]# yum install keepalived -y
在ka1上进行配置
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf # 全局设定
global_defs {notification_email {2948250195@qq.com # 发送邮件通知给谁}notification_email_from keep@li.org #发送的邮件从哪来smtp_server 127.0.0.1 # 邮件服务器ip smtp_connect_timeout 30 # 连接邮件服务器的超时时间router_id ka1 # 虚拟路由的idvrrp_skip_check_adv_addr # 同一来源的只检测一次
# vrrp_strict # 强制使用vrrp协议vrrp_garp_interval 0 vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18 # 接收通告数据的IP地址(组播地址)}# 虚拟路由器配置vrrp_instance VI_1 {state MASTER # 主设备interface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 100 # 优先级advert_int 1authentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}
}
[root@ka1 ~]# systemctl restart keepalived.service
# 重启服务
[root@ka1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.170 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:feea:fe5a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)RX packets 88607 bytes 6246698 (5.9 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 65079 bytes 4618871 (4.4 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)# vip 为 192.168.10.240
ka2和ka1配置相同,所以我们可以使用scp,进行复制
[root@ka1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.10.180:/etc/keepalived/keepalived.conf
The authenticity of host '192.168.10.180 (192.168.10.180)' can't be established.
ECDSA key fingerprint is SHA256:Yrid63PgwDQh7wiaQmCGsLuxK3Cht8v/wekHTAza/XI.
ECDSA key fingerprint is MD5:d7:be:70:41:82:ff:81:40:5b:a7:40:10:d1:0c:ca:bf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.180' (ECDSA) to the list of known hosts.
root@192.168.10.180's password:
keepalived.conf 100% 4143 4.5MB/s 00:00
唯一要变的就是我们将ka1当作主设备,ka2当作从,使用需要改两个配置
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 {state BACKUP # 从设备interface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 80 # 优先级改为80,两个设备优先级不一样advert_int 1authentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}
}
[root@ka2 ~]# systemctl restart keepalived.service
测试:
[root@ka1 ~]# tcpdump -i ens33 -nn host 224.0.0.18[root@ka1 ~]# tcpdump -i ens33 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
19:06:36.826789 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:06:37.828337 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:06:38.829688 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:06:39.831263 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:06:40.832678 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:06:41.833834 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20# 使用tcpdump进行抓包
# -i 就是ens33接收到底数据
# -nn 表示不做解析
# host指定观察的那个ip
# 224.0.0.18 组播地址
ka1的优先级高于ka2所以正常情况看不到ka2的数据。若此时ka1发生故障,ka2则会迅速补上,此时在ka1上的vip也会跑到ka2上
[root@ka1 ~]# systemctl stop keepalived.service
[root@ka1 ~]# tcpdump -i ens33 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
19:09:39.386202 IP 192.168.10.180 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:09:40.387629 IP 192.168.10.180 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:09:41.388011 IP 192.168.10.180 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:09:42.389522 IP 192.168.10.180 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:09:43.390689 IP 192.168.10.180 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
19:09:44.391255 IP 192.168.10.180 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 80, authtype simple, intvl 1s, length 20
[root@ka2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.180 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:fe2c:7bd prefixlen 64 scopeid 0x20<link>ether 00:0c:29:2c:07:bd txqueuelen 1000 (Ethernet)RX packets 119533 bytes 8259027 (7.8 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 39657 bytes 3009635 (2.8 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:2c:07:bd txqueuelen 1000 (Ethernet)
因为默认是抢占模式,当ka1好了之后,vip则会跑到ka1上,流量也会回到ka1上
[root@ka1 ~]# systemctl start keepalived.service
[root@ka1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.170 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:feea:fe5a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)RX packets 92906 bytes 6566009 (6.2 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 67173 bytes 4781344 (4.5 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)
[root@ka1 ~]# tcpdump -i ens33 -nn host 224.0.0.18
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
19:13:06.604998 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:13:07.605229 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:13:08.605816 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
19:13:09.606386 IP 192.168.10.170 > 224.0.0.18: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
keepalived虚拟路由的通讯设定
此时ka1,ka2是ping不通vip的,因为防止被攻击,所有的数据流量打过来后可能会有恶意攻击,我们最终的数据流量是要转到real server上的,所以他默认会把你的vip访问功能给🈲掉
[root@ka1 ~]# ping 192.168.10.240
PING 192.168.10.240 (192.168.10.240) 56(84) bytes of data.
^Z
[7]+ 已停止 ping 192.168.10.240
[root@ka1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0 match-set keepalived dstChain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这就是导致ping不通的原因---- match-set keepalived dst
如果要想ping通,就需要在配置文件中添加参数 ka1,ka2相同
global_defs {notification_email {2948250195@qq.com # 发送邮件通知给谁}notification_email_from keep@li.org #发送的邮件从哪来smtp_server 127.0.0.1 # 邮件服务器ipsmtp_connect_timeout 30 # 连接邮件服务器的超时时间router_id ka1 # 虚拟路由的idvrrp_skip_check_adv_addr # 同一来源的只检测一次vrrp_strict # 强制使用vrrp协议vrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18 # 接收通告数据的IP地址(组播地址)vrrp_iptables
}# 在最后一行添加
# 或者将vrrp_strict 注释掉,效果相同
测试:
[root@ka1 ~]# ping 192.168.10.240
PING 192.168.10.240 (192.168.10.240) 56(84) bytes of data.
64 bytes from 192.168.10.240: icmp_seq=1 ttl=64 time=0.021 ms
64 bytes from 192.168.10.240: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 192.168.10.240: icmp_seq=3 ttl=64 time=0.035 ms
64 bytes from 192.168.10.240: icmp_seq=4 ttl=64 time=0.034 ms
^C
--- 192.168.10.240 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.021/0.029/0.035/0.007 ms
[root@ka1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination
keepalived日志独立
默认情况下keepalived的日志和其他的服务是捆在一起的
要想将其日志独立出来就要修改其配置文件
[root@ka1 ~]# vim /etc/sysconfig/keepalived # Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#KEEPALIVED_OPTIONS="-D -S 6"
# 指定采集日志用的id是6,0-7都行
重启服务
[root@ka1 ~]# systemctl restart keepalived.service
编辑rsyslog.conf文件
#### RULES ##### Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages# The authpriv file has restricted access.
authpriv.* /var/log/secure# Log all the mail messages in one place.
mail.* -/var/log/maillog# Log cron stuff
cron.* /var/log/cron# Everybody gets emergency messages
*.emerg :omusrmsg:*# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler# Save boot messages also to boot.log
local7.* /var/log/boot.log
local6.* /var/log/keepalived.log
在rules模块下可以添加 将日志采集在那个文件中,可以自定义,local加id
重启服务
[root@ka1 ~]# systemctl restart rsyslog.service
测试:
[root@ka1 ~]# systemctl restart rsyslog.service
[root@ka1 ~]# ll /var/log/keepalived.log
-rw-------. 1 root root 55473 8月 12 19:40 /var/log/keepalived.log
[root@ka1 ~]# tail -f /var/log/keepalived.log
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Adding sorry server [192.168.200.200]:1358 to VS [10.10.10.2]:1358
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Removing alive servers from the pool for VS [10.10.10.2]:1358
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Remote SMTP server [127.0.0.1]:25 connected.
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: SMTP alert successfully sent.
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Timeout connecting server [192.168.201.100]:443.
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Check on service [192.168.201.100]:443 failed after 3 retry.
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Removing service [192.168.201.100]:443 from VS [192.168.200.100]:443
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Lost quorum 1-0=1 > 0 for VS [192.168.200.100]:443
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: Remote SMTP server [127.0.0.1]:25 connected.
Aug 12 19:40:20 ka1 Keepalived_healthcheckers[3771]: SMTP alert successfully sent.
^Z
[8]+ 已停止 tail -f /var/log/keepalived.log
keepalived独立子配置文件
include /path/file 可以指定一个路径
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
}# vrrp_instance VI_1 {
# state MASTER # 主设备
# interface ens33 # vip使用的真实设备是谁
# virtual_router_id 100 # 虚拟路由id(唯一的)
# priority 100 # 优先级
# advert_int 1
# authentication {
# auth_type PASS # 发通告带的信息
# auth_pass 1111
# }
# virtual_ipaddress { # vip id # 设定网卡子接口
# 192.168.10.240/24 dev ens33 label ens33:0
# }
#}
include "/etc/keepalived/conf.d/*.conf" # 将以上注释的内容指定在这个文件中# 我们将以上的内容独立出来,放在一个新的文件里面,include指向新文件,前提是一定要有这个文件
[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/192.168.10.240.confvrrp_instance VI_1 {state MASTER # 主设备interface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 100 # 优先级advert_int 1authentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}
}[root@ka1 ~]# systemctl restart keepalived.service
测试:
[root@ka1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.170 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:feea:fe5a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)RX packets 107150 bytes 7643447 (7.2 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 75971 bytes 5480440 (5.2 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)
注意:将原配置文件独立出来后,原来的文件要么注释掉,要么删掉,否则独立出来的文件会和之前的文件冲突
keepalived非抢占和延迟抢占
非抢占模式 nopreempt
默认为抢占模式 preempt ,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色,这样会使 vip 在 KA 主机中来回漂移,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色非抢占模块下 , 如果原主机 down 机 , VIP 迁移至的新主机 , 后续也发生 down 时 , 仍会将 VIP 迁移回原主机
注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP
ka1,和ka2配置相同
vim /etc/keepalived/keepalived.conf
}vrrp_instance VI_1 {state BACKUP interface ens33 # vip使用的真实设备是谁 virtual_router_id 100 # 虚拟路由id(唯一的) priority 100 # 优先级 advert_int 1 nopreemptauthentication {auth_type PASS # 发通告带的信息 auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口 192.168.10.240/24 dev ens33 label ens33:0}
}# 设置非抢占模式 需要将state 改为 BACKUP 以及加一行参数 nopreempt
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {state BACKUP interface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 80 # 优先级advert_int 1nopreempt authentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0
我先重启ka2再重启ka1,vip将会跑到ka2上,并且不会回去,当ka2挂掉,vip才会回去,不管优先级
[root@ka2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.180 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:fe2c:7bd prefixlen 64 scopeid 0x20<link>ether 00:0c:29:2c:07:bd txqueuelen 1000 (Ethernet)RX packets 142318 bytes 10033173 (9.5 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 45810 bytes 3472473 (3.3 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:2c:07:bd txqueuelen 1000 (Ethernet)
[root@ka2 ~]# systemctl stop keepalived.service
[root@ka1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.170 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:feea:fe5a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)RX packets 111441 bytes 7967231 (7.5 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 78058 bytes 5653940 (5.3 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)
延迟抢占preempt_delay
抢占延迟模式,即优先级高的主机恢复后,不会立即抢回VIP,而是延迟一段时间(默认300s)再抢回VIP
preempt_delay # #指定抢占延迟时间为#s,默认延迟300s
[root@ka1 ~]# vim /etc/keepalived/keepalived.confvrrp_instance VI_1 {state BACKUPinterface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 100 preempt_delay 10s # 抢占延迟10sadvert_int 1
# nopreempt authentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 {state BACKUPinterface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 80 # 优先级advert_int 1preempt_delay 10s
# nopreemptauthentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}
测试:由于pa1的优先级高于pa2,我先启动pa2 ,down掉pa1,vip会到pa2上,我再启动pa1,vip不会立刻回到pa1上,而是10秒后
[root@ka2 ~]# systemctl restart keepalived.service
[root@ka2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.180 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:fe2c:7bd prefixlen 64 scopeid 0x20<link>ether 00:0c:29:2c:07:bd txqueuelen 1000 (Ethernet)RX packets 146839 bytes 10374458 (9.8 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 47473 bytes 3611473 (3.4 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 607 bytes 44033 (43.0 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 607 bytes 44033 (43.0 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@ka1 ~]# date
2024年 08月 12日 星期一 20:19:31 CST
[root@ka1 ~]# systemctl restart keepalived.service
[root@ka1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.170 netmask 255.255.255.0 broadcast 192.168.10.255inet6 fe80::20c:29ff:feea:fe5a prefixlen 64 scopeid 0x20<link>ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)RX packets 115304 bytes 8272918 (7.8 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 79935 bytes 5800622 (5.5 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.240 netmask 255.255.255.0 broadcast 0.0.0.0ether 00:0c:29:ea:fe:5a txqueuelen 1000 (Ethernet)lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 942 bytes 69116 (67.4 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 942 bytes 69116 (67.4 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@ka1 ~]# date
2024年 08月 12日 星期一 20:19:48 CST
#差不多就是这个意思
VIP单播配置
[!NOTE]注意:启用 vrrp_strict 时,不能启用单播
# 在所有节点 vrrp_instance 语句块中设置对方主机的 IP ,建议设置为专用于对应心跳线网络的地址,而非使用业务网络unicast_src_ip <IPADDR> # 指定发送单播的源 IPunicast_peer {<IPADDR> # 指定接收单播的对方目标主机 IP......}# 启用 vrrp_strict 时,不能启用单播 , 否则服务无法启动 , 并在 messages 文件中记录下面信息Jun 16 17:50:06 centos8 Keepalived_vrrp[23180]: (m44) Strict mode does notsupport authentication. Ignoring.Jun 16 17:50:06 centos8 Keepalived_vrrp[23180]: (m44) Unicast peers are not supported in strict modeJun 16 17:50:06 centos8 Keepalived_vrrp[23180]: Stopped - used 0.000606 usertime, 0.000000 system timeJun 16 17:50:06 centos8 Keepalived[23179]: Keepalived_vrrp exited with permanenterror CONFIG. TerminatingJun 16 17:50:06 centos8 systemd[1]: keepalived.service: Succeeded.Jun 16 17:50:06 centos8 Keepalived[23179]: Stopped Keepalived v2.0.10(11/12,2018)
组播变单播实验
ka1和ka2互相进行通告
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf global_defs {notification_email {2948250195@qq.com # 发送邮件通知给谁}notification_email_from keep@li.org #发送的邮件从哪来smtp_server 127.0.0.1 # 邮件服务器ipsmtp_connect_timeout 30 # 连接邮件服务器的超时时间router_id ka1 # 虚拟路由的idvrrp_skip_check_adv_addr # 同一来源的只检测一次
# vrrp_strict #注释此行,与vip单播模式冲突vrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18 # 接收通告数据的IP地址(组播地址)
# vrrp_iptables
}vrrp_instance VI_1 {state MASTERinterface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 100
# preempt_delay 10s # 抢占延迟10sadvert_int 1
# nopreemptauthentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}unicast_src_ip 192.168.10.170 # 发送源,就是本机ipunicast_peer {192.168.10.180 # 接收源,就是对端也就是ka2}
[root@ka2 ~]# vim /etc/keepalived/keepalived.confglobal_defs {notification_email {2948250195@qq.com # 发送邮件通知给谁}notification_email_from keep@li.org #发送的邮件从哪来smtp_server 127.0.0.1 # 邮件服务器ipsmtp_connect_timeout 30 # 连接邮件服务器的超时时间router_id ka1 # 虚拟路由的idvrrp_skip_check_adv_addr # 同一来源的只检测一次
# vrrp_strict # 注释此行,与vip单播模式冲突vrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18 # 接收通告数据的IP地址(组播地址)
# vrrp_iptablesvrrp_instance VI_1 {state BACKUPinterface ens33 # vip使用的真实设备是谁virtual_router_id 100 # 虚拟路由id(唯一的)priority 80 # 优先级advert_int 1
# preempt_delay 10s
# nopreemptauthentication {auth_type PASS # 发通告带的信息auth_pass 1111}virtual_ipaddress { # vip id # 设定网卡子接口192.168.10.240/24 dev ens33 label ens33:0}unicast_src_ip 192.168.10.180 # 发送源,就是本机ipunicast_peer {192.168.10.170}
测试:
[root@ka1 ~]# tcpdump -i ens33 -nn src host 192.168.10.170 and dst 192.168.10.180tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
09:43:21.998624 IP 192.168.10.170 > 192.168.10.180: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
09:43:23.005985 IP 192.168.10.170 > 192.168.10.180: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
09:43:24.011231 IP 192.168.10.170 > 192.168.10.180: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
09:43:25.017003 IP 192.168.10.170 > 192.168.10.180: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
09:43:26.017906 IP 192.168.10.170 > 192.168.10.180: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20
09:43:27.024354 IP 192.168.10.170 > 192.168.10.180: VRRPv2, Advertisement, vrid 100, prio 100, authtype simple, intvl 1s, length 20# 在170上看180到170的数据
# 在180上看170到180的数据
未完。。。。。
相关文章:

高可用集群KEEPALIVED
一、集群相关概念简述 HA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。 1、集群的分类 LB:负载均衡…...

Linux shell编程学习笔记69: curl 命令行网络数据传输工具 选项数量雷人(中)
0 前言 curl是Linux中的一款综合性网络传输工具,既可以上传也可以下载,支持HTTP、HTTPS、FTP等30余种常见协议。 该命令选项超多,在学习笔记68中,我们列举了该命令的部分实例,今天继续通过实例来研究curl命令的功能…...

怎么在网站底部添加站点地图?
在优化网站 SEO 时,站点地图(Sitemap)是一个非常重要的工具。它帮助搜索引擎更好地理解和抓取您的网站内容。幸运的是,从 WordPress 5.5 开始,WordPress 自带了站点地图生成功能,无需额外插件。下面将介绍如…...

bash和sh的区别
Bash和sh的主要区别在于它们的交互性、兼容性、默认shell以及脚本执行方式。 首先,Bash提供了更丰富的交互功能,使得它在终端中的使用更加舒适和方便。相比之下,sh由于其最小化的功能集,提供了更广泛的兼容性。然而ÿ…...

基于LSTM的锂电池剩余寿命预测 [电池容量提取+锂电池寿命预测] Matlab代码
基于LSTM的锂电池剩余寿命预测 [电池容量提取锂电池寿命预测] Matlab代码 无需更改代码,双击main直接运行!!! 1、内含“电池容量提取”和“锂电池寿命预测”两个部分完整代码和NASA的电池数据 2、提取NASA数据集的电池容量&am…...

PHP项目任务系统小程序源码
🚀解锁高效新境界!我的项目任务系统大揭秘🔍 🌟 段落一:引言 - 为什么需要项目任务系统? Hey小伙伴们!你是否曾为了杂乱的待办事项焦头烂额?🤯 或是项目截止日逼近&…...

乡村振兴旅游休闲景观解决方案
乡村振兴旅游休闲景观解决方案摘要 2. 规划方案概览 规划核心:PPT展示了乡村振兴建设规划的核心区平面图及鸟瞰图,涵盖景观小品、设施农业、自行车道、新社区等设计元素。 规划策略:方案注重打造大开大合的空间感受,特色农产大观…...

【大数据】重塑时代的核心技术及其发展历程
🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是大数据 2、大数据技术诞生的背景 二、大…...

基于python的小区监控图像拼接系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

在HFSS中对曲线等结构进行分割(Split)
在HFSS中对曲线进行分割 我们往往需要把DXF等其他类型文件导入HFSS进行分析,但是有时需要对某一个曲线单独进行分割成两段修改。 如果是使用HFSS绘制的曲线,我们修改起来非常方便,修改参数即可。但是如果是导入的曲线,则需要使用…...

高等数学精解【8】
文章目录 直线与二元一次方程平行垂直题目点到直线距离直线束概述直线束的详细说明一、定义二、计算 三、例子例子1:中心直线束例子2:平行直线束 四、例题 参考文献 直线与二元一次方程 平行 两直线平等的条件是它们的斜率相同。 L 1 : A 1 x B 1 y …...

山石网科---WAF---巨细
文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 今天被安排协助一线上架一台WAF,在这里重点总结一下WAF的内容 一.WAF部署 串联透明模式 串联模式特点: 二层透明接入,对客户网络影响小站点和webserve…...

【C++】6.类和对象(4)
文章目录 5.赋值运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前置和后置重载5.4 日期类的实现 6.取地址运算符重载6.1 const成员函数6.2 取地址运算符重载 5.赋值运算符重载 5.1 运算符重载 当运算符被用于类类型的对象时,C语言允许我们通过运算符重载的形式指…...

【5.2 python中的列表】
python中的列表 Python中的列表(List)是一种非常灵活且强大的数据结构,用于存储一系列的元素。列表是可变的,意味着你可以添加、删除或修改列表中的元素。列表中的元素可以是不同类型的数据,包括整数、浮点数、字符串、…...

opencv-特征检测
1,Harris角点检测 如果粉色窗口向四周移动,窗口内的像素没有变化则认定为平坦区域,如果窗口向上移动无明显变化,而左右移动有变化则认定为边缘,如果窗口向任意方向移动均有明显变化则为角点,如下图 dst不是…...

单片机在线升级架构(bootloader+app)
1、架构(bootloaderapp) 在一定的时间内如果没有程序需要更新则自动跳转到app地址执行用户程序 内部flash 512K bootloader 跑裸机 48k 主要实现USB升级和eeprom标志位升级 app 跑freeRtos 464K 程序的基本功能,升级时软件复位开始执行bootloader升级…...

leetcode169. 多数元素,摩尔投票法附证明
leetcode169. 多数元素 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输…...

Pixel Adventure Unity2D开发完整指南
本文参考:2-2. Get and Setup Assets_哔哩哔哩_bilibili 1、下载资源 在Asset Store中下载Pix Adventure1 2的资源: 在import的时候,不用到Scene import进来,如下图所示,Scenes目录反勾选一下。 两个资源都下载完成后…...

signed main()与int main()的区别
刷算法题时为了防止爆int ,通常会开long long #define int long long 但这样int main()会出现问题,main函数的返回值必须是signed或int,由于定义int 为long long 我们只能让返回值变为signed main() #include<bits/stdc.h> using namespace std; #define int long lo…...

【面试宝典】Java基础 这个面试题整理的不全 后期会进行补充
一、equals 和 hashcode 1、简述 hashCode() 和 equals(Object obj) 的作用及其关系 hashCode() 方法用于获取对象的哈希码,即一个整数。这个哈希码在基于哈希的集合(如HashSet、HashMap等)中用于确定对象的存储位置。 equals(Object obj)…...

获取语音文件时长
获取语音文件时长一会儿有一会儿没的,百思不得其解。 错误代码: const getAudioDuration async src > {const audio new Audio(src);const duration await new Promise(resolve > {if (audio.duration) {return resolve(parseInt(audio.duratio…...

应急响应计划:网络安全事件后的快速恢复策略
在数字化时代,网络安全威胁日益严峻,任何企业都无法完全避免遭受网络攻击或数据泄露的风险。因此,制定一套完善的应急响应计划,以便在网络安全事件发生后能够迅速、有效地进行应对和恢复,成为企业保障业务连续性、保护…...

【网络】IP和MAC地址的映射——ARP协议和ARP欺骗概述
目录 引言 ARP的工作机制 ARP欺骗 ARP欺骗的断网行为 ARP欺骗成为中间人 工具介绍 个人主页:东洛的克莱斯韦克-CSDN博客 引言 同一子网内不同主机用数据链路层的MAC地址来寻址,而不是子网内的私有IP(网络层)。数据包中的IP…...

鸿蒙(API 12 Beta3版)【音视频解封装】 文件解析封装
开发者可以调用本模块的Native API接口,完成音视频解封装,即从比特流数据中取出音频、视频等媒体帧数据。 当前支持的数据输入类型有:远程连接(http协议、HLS协议)和文件描述符(fd)。 支持的解封装格式如下: 媒体格式封装格式码…...

智能马桶盖和普通马桶盖有什么不同?
智能马桶盖与普通马桶盖之间存在显著的差异,主要体现在以下几个方面: 一、功能差异 1.清洗功能: 智能马桶盖:配备了清洗功能,包括臀洗、妇洗等,特别针对女性设计了贴心功能,如移动喷水、水流按…...

C# OnnxRuntime部署LivePortrait实现快速、高质量的人像驱动视频生成
目录 效果 说明 项目 模型信息 代码 下载 效果 LivePortrait实现快速、高质量的人像驱动视频生成 说明 官网地址:https://github.com/KwaiVGI/LivePortrait 代码实现参考:https://github.com/hpc203/liveportrait-onnxrun 模型下载:…...

Spring boot框架指南
1. Spring Boot 概述 1.1 定义与起源 Spring Boot是一种基于Spring框架的开源框架,旨在简化Spring应用程序的创建和开发过程。它通过提供一系列默认配置和自动配置功能,减少了开发者在配置上的工作量,使得快速搭建生产级别的Spring应用程序…...

数据结构--树与二叉树
数据结构分类 集合 线性结构(一对一) 树形结构(一对多) 图结构(多对多) 数据结构三要素 1、逻辑结构 2、数据的运算 3、存储结构(物理结构) 树的概念 树的分类 满二叉树和完全二叉树 二叉排序树 平衡二叉树 二叉树分类总结 二叉树的存储结构 …...

C#项目实战经验——计时方法总结
前言 我们在开发C#程序的过程中经常需要计算某段程序执行的时间,比如调用的某个算法的时间,这时候我们就需要利用计时工具,本文就是详细介绍在C#中我们常用哪些计时工具。 1、计时方法—StopWatch 在C#中我们可以利用Stopwatch这个类来实现…...

电子盖章软件哪个好|盖章软件
在选择电子盖章软件时,需要考虑多个因素,包括软件的功能、安全性、易用性、兼容性以及成本等。以下是根据当前市场情况推荐的一些优秀的电子盖章软件: e章宝: 功能丰富:e章宝是国内领先的电子盖章系统,功能…...