keepalive原理详解及应用

news2024/11/17 1:32:27

目录

一、高可用集群

1.1 什么是keepalived

1.2 什么是VRRP协议

二、Keepalived 部署

2.1 keepalived 简介

2.2 keepalived 框架

2.3 实验环境搭建

2.4 Keepalived 安装

2.5 Keepalived 配置

2.5.1 虚拟路由配置

2.5.2 独立日志

2.5.3 独立子配置文件

三、Keepalived 的应用示例

3.1 VIP单播配置

3.2 邮件配置

3.3 通知脚本

3.4 master/master 的 Keepalived 双主架构

3.5 实现IPVS的高可用性


一、高可用集群

1.1 什么是keepalived

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。基于VRRP(冗余协议)基础之上提高系统高用性、降低平均故障时间,减少资源耗费的高可用集群。

通常情况下是将两台服务器组成一个热备组,同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。

如果keepalived检测到master宕机或服务故障,备服务器会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。减少资源损耗。

1.2 什么是VRRP协议

VRRP全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。对于VRRP,需要清楚知道的是:
1)VRRP是用来实现路由器冗余的协议。
2)VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设计设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。
3)VRRP协议需要具有IP备份,优先路由选择,减少不必要的路由器通信等功能。
4)VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当主级失效时,BACKUP将接管原先MASTER的网络功能。
5)VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整整数,;同一个组中的路由器通过使用优先权值来选举MASTER。,优先权大者为MASTER,优先权也是一个0-255的正整数。

二、Keepalived 部署

2.1 keepalived 简介

是VRRP的软件实现,为了实现高可用ipvs服务

功能:

  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

2.2 keepalived 框架

用户核心组件
参数作用
vrrp stackVIP消息通告
checkers监测real server
system call实现 vrrp 协议状态转换时调用脚本的功能
SMTP邮件组件
IPVS wrapper生成IPVS规则
Netlink Reflector网络接口
WatchDog监控进程
名称作用
控制组件提供keepalived.conf的解析器,完成Keepalived配置
名称作用
内存管理组件为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
名称作用
I0复用器针对网络目的而优化的自己的线程抽象

2.3 实验环境搭建

注意事项:

  • 防火墙和selinux必须关闭
  • 各节点时间必须同步

根据上图将IP配置好,在rs1和rs2上安装httpd,并启动,到此为止,基本环境我们就搭建好了

[root@rs1 ~]# yum install httpd -y

[root@rs1 ~]# systemctl enable --now httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@rs2 ~]#  yum install httpd -y

[root@rs2 ~]# systemctl enable --now httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

2.4 Keepalived 安装

  • 安装Keepalived(在 ka1 和 ka2上)
[root@k1 ~]# yum install keepalived -y

[root@k2 ~]# yum install keepalived -y

2.5 Keepalived 配置

2.5.1 虚拟路由配置

全局预览

参数解释
uth_pass 1111
共享密钥,前八位有效,建议六位
priority 100/80
优先级,范围:1-254;值越大优先级越高
virtual_router_id 100
同属一个虚拟机的多个keepalived结点必须相同,我设定了100
advert_int 1
vrrp 通告的时间间隔,默认 1s
virtual_ipaddress
虚拟IP,自己设定。指定 VIP ,不指定网卡,默认为 eth0, 注意:不指定 /prefix, 默认 32

1、查看依赖文件

[root@k1 ~]# rpm -ql keepalived

 2、打开主配置文件 /etc/keepalived/keepalived.conf 进行编辑

[root@k1 ~]# vim /etc/keepalived/keepalived.conf

3、修改完成后,启动服务

[root@k1 ~]# systemctl enable --now keepalived.service
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.

4、在主配置文件中设置vrrp

5、重启k1中的keepalived服务

[root@k1 ~]# systemctl restart keepalived.service

6、这里偷个懒,直接将k1配置好的文件复制到k2

[root@k1 ~]# scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf

7、在k2中修改一下优先级(priority)

[root@k2 ~]# vim /etc/keepalived/keepalived.conf

8、在k2启动keepalived服务

[root@k2 ~]# systemctl enable --now keepalived.service

9、现在进行测试,在k1中抓包,看能否获取到组播。因为在前面的配置文件中,我给k1设置的优先级为100,k2优先级为80,在主机k1没有出现故障的情况下,抓包获取到的组播应该是k1的包

[root@k1 ~]# tcpdump -i eth0 -nn host 224.0.0.18

10、现在我将k1的keepalived服务停止,模拟k1出现故障的状态,再次进行抓包操作,可以看到获取到的是k2的包

[root@k1 ~]# systemctl stop keepalived.service

[root@k1 ~]# tcpdump -i eth0 -nn host 224.0.0.18

11、再次打开k1的keepalived服务,就可以看到抓取的包恢复成k1了

2.5.2 独立日志

1、在 k1 和 k2 中,进入主配置文件,并做以下修改

[root@k1 ~]# vim /etc/keepalived/keepalived.conf
[root@k2 ~]# vim /etc/keepalived/keepalived.conf

2、进入 k1和 k1 的 /etc/sysconfig/keepalived 编写日志级别,这里注意日志级别范围是0~7

[root@k1 ~]# vim /etc/sysconfig/keepalived                                      

[root@k1 ~]# cat /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 6"



[root@k2 ~]# vim /etc/sysconfig/keepalived                                      

[root@k2 ~]# cat /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D -S 6"

3、重启keepalived服务

[root@k1 ~]# systemctl restart keepalived

[root@k2 ~]# systemctl restart keepalived

4、修改配置文件内容,设定采集方法

[root@k1 ~]# vim /etc/rsyslog.conf


[root@k2 ~]# vim /etc/rsyslog.conf

5、重启rsyslog.conf

[root@k1 ~]# systemctl restart rsyslog.service


[root@k2 ~]# systemctl restart rsyslog.service

6、查看日志

[root@k1 ~]# ll /var/log/keepalived.log
-rw------- 1 root root 4766 8月  12 13:38 /var/log/keepalived.log

2.5.3 独立子配置文件

建立文件,并在/etc/keepalived/conf.d/172.25.254.100.conf中添加以下内容

k1和k2一样的操作

三、Keepalived 的应用示例

3.1 VIP单播配置

  • Keepalived 的 VRRP(Virtual Router Redundancy Protocol)实现支持两种模式:组播和单播。
  • 组播模式:这是 VRRP 的标准模式,也是 Keepalived 的默认模式。在组播模式中,VRRP 实例将其通告(Advertisement)消息发送到一个特定的组播地址(通常是 224.0.0.18)。所有的 VRRP 实例都监听这个地址,因此它们都可以接收到这些通告消息。这种模式的优点是它不需要知道其他 VRRP 实例的 IP 地址,但是它需要网络设备支持组播。
  • 单播模式:在单播模式中,VRRP 实例将其通告消息直接发送到其他 VRRP 实例的 IP 地址。这种模式的优点是它不需要网络设备支持组播,但是它需要在配置中指定其他 VRRP 实例的 IP 地址。
  • 默认keepalived主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量
#注意:
#启用vrrp_strict时,不能启用单播,否则服务无法启动
#在所有节点vrrp_instance语句块中设置对方主机的IP,建议设置为专用于对应心跳线网络的地址,而非使
用业务网络
unicast_src_ip <IPADDR> #指定发送单播的源IP
unicast_peer {
<IPADDR> #指定接收单播的对方目标主机IP

1、在主机master k1中对主配置文件做以下修改

2、在k1中进行单播处理,指向172.25.254.20

3、在k2中进行单播处理,指向172.25.254.10

4、抓包查看单播效果

[root@k1 ~]#  tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20

[root@k2 ~]# tcpdump -i eth0 -nn src host 172.25.254.20 and dst 172.25.254.10

3.2 邮件配置

1、首先在浏览器登录自己的qq邮箱,并获取授权码

2、在k1和k2中安装mail

[root@k1 ~]# yum install mailx -y

[root@k2 ~]# yum install mailx -y

3、进入配置文件添加以下内容

4、发送测试邮件

root@k1 ~]# echo hello world | mail -s test 3312143042@qq.com

[root@k2 ~]# echo test | mail -s test 3312143042@qq.com

5、查看qq邮箱,收到邮件

3.3 通知脚本

1、在k1/k2中的keepalived结点配置如下

[root@k1 ~]# vim /etc/keepalived/mail.sh
[root@k1 ~]# cat /etc/keepalived/mail.sh
#!/bin/bash
mail_dst="3312143042@qq.com"
send_message()
{
  mail_sub="$HOSTNAME to be $1 vip move"
  mail_msg="`date +%F\ %T`:vrrp move $HOSTNAME chage $1"
  echo $mail_msg | mail -s "$mail_sub" $mail_dst
}
case $1 in
  master)
  send_message master
  ;;
  backup)
  send_message backup
  ;;
  fault)
  send_message fault
  ;;
  *)
  ;;
esac


[root@k2 ~]# vim /etc/keepalived/mail.sh
[root@k2 ~]# cat /etc/keepalived/mail.sh
mail_dst="3312143042@qq.com"
send_message()
{
  mail_sub="$HOSTNAME to be $1 vip move"
  mail_msg="`date +%F\ %T`:vrrp move $HOSTNAME chage $1"
  echo $mail_msg | mail -s "$mail_sub" $mail_dst
}
case $1 in
  master)
  send_message master
  ;;
  backup)
  send_message backup
  ;;
  fault)
  send_message fault
  ;;
  *)
  ;;
esac

2、赋权限

[root@k1 ~]# chmod +x /etc/keepalived/mail.sh


[root@k2 ~]# chmod +x /etc/keepalived/mail.sh

3、在主配置文件中添加以下内容

4、重启keepalived服务

[root@k1 ~]# systemctl restart keepalived.service


[root@k2 ~]# systemctl restart keepalived.service

5、在qq邮箱中查看邮件

6、关闭k1的 keepalived服务,在浏览器中查看邮件,可以发现发送主机变成了k2

3.4 master/master 的 Keepalived 双主架构

  • master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
  • master/master 的双主架构: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高服务器资源利用率。

1、在master k1中配置

2、在master k2中配置

3、分别重启keepalived服务

[root@k1 ~]# systemctl restart keepalived.service

[root@k2 ~]# systemctl restart keepalived.service

4、在两个master主机中分别查看ip

5、停用master k1的 keepalived 服务,查看master k1的ip

3.5 实现IPVS的高可用性

3.5.1 IPVS相关配置

  • 配置结构
virtual_server IP port {
...
real_server {
...
}
real_server {
...
}
}
  • 定义格式
  • virtual_server IP port       定义虚拟主机IP地址及其端口
  • virtual_server fwmark int      ipvs的防火墙打标,实现基于防火墙的负载均衡集群
  • virtual_server group string      使用虚拟服务器组
  • 应用层检测
  • status_code 200     判断上述检测机制为健康状态的响应码,一般为 200
  • nb_get_retry 3   重试次数
  • connect_ip 172.25.24.10    向当前RS哪个IP地址发起健康状态检测请求
  • connect_port  80     向当前RS的哪个PORT发起健康状态检测请求
  • bindto 172.25.254.10    向当前RS发出健康状态检测请求时使用的源地址
  • bind_port  80     向当前RS发出健康状态检测请求时使用的源端口
  • TCP检测
  • connect_ip 172.25.254.10      向当前RS的哪个IP地址发起健康状态检测请求
  • connect_port 80    向当前RS的哪个PORT发起健康状态检测请求
  • bindto 172.25.254.10    发出健康状态检测请求时使用的源地址
  • bind_port 80    发出健康状态检测请求时使用的源端口
  • connect_timeout  1    客户端请求的超时时长(等于haproxytimeout server)

3.5.2 案例

给rs1/rs2配置VIP,我配置的临时ip

[root@rs1 ~]# ip a a 172.24.254.100 dev lo

[root@rs2 ~]# ip a a 172.24.254.100 dev lo

查看

进入rs1和rs2的脚本,修改ARP响应规则

[root@rs1 ~]# vim /etc/sysctl.d/arp.conf
[root@rs1 ~]# cat /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2



[root@rs2 ~]# vim /etc/sysctl.d/arp.conf
[root@rs2 ~]# cat /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2

启动脚本

在k1和k2中下载ipvsadm,并修改主配置文件

重启

[root@k1 ~]# systemctl restart keepalived.service


[root@k2 ~]# systemctl restart keepalived.service

测试

[root@k1 ~]# curl 172.25.254.100
RS1 - 172.25.254.110
[root@k1 ~]# curl 172.25.254.100
RS2 - 172.25.254.120
[root@k1 ~]# curl 172.25.254.100
RS1 - 172.25.254.110

3.6 VRRP脚本控制VIP

3.6.1 怎么实现

  • vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值,公共定义,可被多个实例调用,定义在vrrp实例之外的独立配置块,一般放在global_defs设置块之后。
  • 通常此脚本用于监控指定应用的状态。一旦发现应用的状态异常,则触发对MASTER节点的权重减至低于SLAVE节点,从而实现 VIP 切换到 SLAVE 节点。
  • track_script :调用 vrrp_script 定义的脚本去监控资源,定义在 VRRP 实例之内,调用事先定义的 vrrp_script

3.6.2 定义 VRRP

vrrp_script <SCRIPT_NAME>                            定义一个检测脚本,在 global_defs 之外配置
script <STRING>|<QUOTED-STRING>            shell命令或脚本路径
interval <INTEGER>                                          间隔时间,单位为秒,默认1
timeout <INTEGER>                                          超时时间
weight <INTEGER:-254..254>      默认为 0, 如果设置此值为负数,当上面脚本返回值为非0 时会将此值与本节点权重相加可以降低本节点权重,即表示fall, 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本节点权重 即表示 rise, 通常使用负值
fall <INTEGER>                     执行脚本连续几次都失败 , 则转换为失败,建议设为 2 以上
rise <INTEGER>                    执行脚本连续几次都成功,把服务器从失败标记为成功
user USERNAME [GROUPNAME]            执行监测脚本的用户或组
init_fail                                    设置默认标记为失败状态,监测成功之后再转换为成功状态

3.6.3 调用VRRP

vrrp_instance test {
... ...
      track_script {
          check_down
      }
}

3.6.4 案例:利用脚本实现主从角色切换

[root@k1 ~]# vim /mnt/check_yee.sh
[root@k1 ~]# cat /mnt/check_yee.sh
#!/bin/bash
[ ! -f "/mnt/yee" ]



[root@k1 ~]# chmod +x /mnt/check_yee.sh     #赋权限

3.7 实现HAProxy高可用

在k1和k2中安装 haproxy,并启动

[root@k1 ~]#  yum install haproxy -y
[root@k1 ~]# systemctl enable --now haproxy
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.



[root@k2 ~]#  yum install haproxy -y
[root@k2 ~]# systemctl enable --now haproxy
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.

在k1和k2的主配置文件/etc/haproxy/haproxy.cfg中做修改

[root@k1 ~]# vim /etc/haproxy/haproxy.cfg
#
listen webserver
    mode http
    balance roundrobin
    bind 172.25.254.100:80
    server web1 172.25.254.110:80 check
    server web2 172.25.254.120:80 check
[root@k1 ~]# systemctl restart haproxy.service


[root@k2 ~]# vim /etc/haproxy/haproxy.cfg
#
listen webserver
    mode http
    balance roundrobin
    bind 172.25.254.100:80
    server web1 172.25.254.110:80 check
    server web2 172.25.254.120:80 check
[root@k2 ~]# systemctl restart haproxy.service

检测端口是否打开

在k1和k2的两个节点启用内核参数

在k1中编写检测脚本

修改主配置文件,k1与k2相同

测试

[root@k1 ~]# curl 172.25.254.100
RS1 - 172.25.254.110
[root@k1 ~]# curl 172.25.254.100
RS2 - 172.25.254.120

关闭k1的haproxy,假设出现故障,先进行检测

将ARP响应规则全部改为0

k1和k2做相同操作

再次重启haproxy和keepaliver服务,k1vip丢失,k2拥有两个

测试

[root@k2~]# for i in {1..10}; do curl 172.25.254.100; done
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120
172.25.254.110
172.25.254.120

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

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

相关文章

Unity动画模块 之 3D Rig页签

​本文仅作笔记学习和分享&#xff0c;不用做任何商业用途本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 1.Rig页签 Rig 选项卡 - Unity 手册&#xff0c;rig是设置骨骼与替身系统的&#xff0c;工作流程如下 Avatar是什么…

【算法】弗洛伊德(Floyd)算法求最短路径

目录 1.弗洛伊德&#xff08;Floyd&#xff09;算法介绍 2.弗洛伊德算法图解分析 2.1思路&#xff1a; 2.2图和矩阵的准备 2.3弗洛伊德算法的步骤&#xff1a; 2.4疑问 3.弗洛伊德算法的代码实现 3.1创建图并显示距离表与前驱表 3.2完整代码 1.弗洛伊德&#xff08;Flo…

数据结构stack (笔记)

文章目录 1. 概念理解易混淆内容 2. 时间复杂度3. 实现方式4. 应用5. 内容出处 1. 概念理解 stack(中文名&#xff1a;堆栈、栈)&#xff1a;虽然它叫堆栈&#xff0c;但是它其实指的是栈&#xff0c;跟堆没啥关系。 栈的特性&#xff1a;先进后出、后进先出(这个过程就…

【STL】红黑树(插入、删除底层实现)

目录 红黑树简介 红黑树框架构建 构造函数 析构函数 四种旋转逻辑&#xff08;左单旋&#xff0c;右单旋&#xff0c;左右双旋&#xff0c;右左双旋&#xff09; 左右双旋与右左双旋 左单旋 右单旋 红黑树的插入 Insert 插入节点的颜色 红黑树插入的三种情况 代码…

Datawhale X 魔搭 AI夏令营第四期 魔搭-AIGC方向 task03笔记

Datawhale官方的Task3链接&#xff1a;Task03 往期Task1、Task2链接&#xff1a;Task01&#xff0c; Task02 【学习者手册】&#xff1a;链接直达 【QA文档】&#xff1a;链接直达 【赛事官网】&#xff1a;链接直达 ComfyUI ComfyUI是一个基于深度学习的图像生成软件&…

鸿萌数据恢复服务:SQL Server 中的“PFS 可用空间信息不正确”错误

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份、网络及终端数据安全等解决方案与服务。 同时&#xff0c;鸿萌是国际主流数据恢复软件(Stellar、UFS、R-Studio、ReclaiMe Pro 等)的授权代理商&#xff0c;为专…

【教学类-58-10】黑白三角拼图08(参考图+操作卡+黑白块,适合个别化)

背景需求&#xff1a; 前期做了一套适合集体操作的绘画“黑白三角” 【教学类-58-09】黑白三角拼图07&#xff08;1页3张黑白的白点卡片&#xff0c;一种宫格36张&#xff0c;适合一个班级一次操作&#xff09;-CSDN博客文章浏览阅读1k次&#xff0c;点赞30次&#xff0c;收藏…

面向自动驾驶保证车辆转向稳定性的模型预测控制

摘 要 车辆智能化是当前和未来汽车发展的主要方向和核心技术之一。随着车辆智能化水 平的提高&#xff0c;自动驾驶等级从无自动驾驶向完全自动驾驶提升。在自动驾驶的人机协同控制 和完全自动驾驶阶段&#xff0c;由于人类驾驶员在动态驾驶任务中的参与程度不同&#xff0c;…

23. 机盒通信

1. 概述 耳机和充电盒,采用机盒通信的方式,完成通信和充电。受限于耳机上的触电,机盒通信采用单线模式。 注:耳机只做应答,不主动发起通信 2. 硬件连接 由于bes2700外置SY5501的电源管理芯片,实际上串口通信,通过SY5501进行转发。 充电盒 -> SY5501 -> bes27…

windows安装boost后没有b2.exe(无法执行b2)

原因&#xff1a;如果你是在官网下载的.exe文件进行的boost安装&#xff0c;那么就不需要再执行bootstrap.bat&#xff0c;也因此不会有b2.exe 链接&#xff1a;官方网址下载 通过.exe安装boost并配置环境变量之后就可以直接使用了 如果你仍希望有b2.exe&#xff0c;那么双击执…

2024“钉耙编程”中国大学生算法设计超级联赛(9)hdu7529 树异或价值(树形dp+贪心)

题目 t(t<20)组h里&#xff0c;每次给定一棵n(n<2e5)个点的&#xff0c;点1为根的有根树&#xff0c; 定义树的价值为&#xff0c; 其中&#xff0c;&#xff0c;dep为深度&#xff0c;1号点的深度为0 而a数组待确定&#xff0c;对于所有的种方案&#xff0c;你要使树…

Leetcode每日刷题之118.杨辉三角

1.题目解析 杨辉三角作为一个经典的数学模型&#xff0c;其基本原理相信大家已经耳熟能详&#xff0c;这里主要是在学习了vector之后&#xff0c;对于本题有了新的解法&#xff0c;更加简便。关于vector的基本使用详见 面向对象程序设计(C)之 vector&#xff08;初阶&#xff0…

Selenium + Python 自动化测试17(数据驱动-文本操作)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 之前有一篇我们讨论了使用模块化测试来优化我们的测试脚本&#xff0c;今天我们试着进一步深入学习数据驱动。 本篇文章我们讨论一下数据驱动思想&#xff0c;如何将数据和脚本…

Zookeeper的在Ubuntu20.04上的集群部署

安装资源 官方安装包下载地址&#xff1a;https://zookeeper.apache.org/releases.html 懒得找版本的可以移步下载zookeeper3.84稳定版本&#xff1a; https://download.csdn.net/download/qq_43439214/89646735 安装方法 创建安装路径&&解压安装包 # 创建路径 m…

机器学习之ROC曲线

机器学习之ROC曲线 1.TPR与FPR计算2.TPR、FPR与分类阈值的关系3.生成ROC曲线4.AUC计算参考文献本博客主要参考了https://www.evidentlyai.com/classification-metrics/explain-roc-curve。 1.TPR与FPR计算 真阳率TPR(True Positive rate),又称召回率recall rate。 假阳率F…

AtCoder Beginner Contest 367(ABCDEF题)视频讲解

A - Shout Everyday Problem Statement In the Kingdom of AtCoder, residents are required to shout their love for takoyaki at A A A o’clock every day. Takahashi, who lives in the Kingdom of AtCoder, goes to bed at B B B o’clock and wakes up at C C C o’…

flink车联网项目前篇:项目设计(第64天)

系列文章目录 车联网项目设计 5.1 数仓分层 5.2 数仓主题数据建模数据仓库建模方法论 2.1 关系建模 2.1.1 ER模型 2.1.2 关系模式范式 文章目录 系列文章目录前言5. 车联网项目设计5.1 数仓分层5.2 数仓主题 1. 数据建模2. 数据仓库建模方法论2.1 关系建模2.1.1 ER模型2.1.2 关…

[Meachines] [Medium] TartarSauce Wordpress-gwolle-gb-RFI+tar权限提升+定时器备份文件权限提升

信息收集 IP AddressOpening Ports10.10.10.88TCP:80 $ nmap -p- 10.10.10.88 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open tcpwrappedWordpress & gwolle-gb & RFI $ feroxbuster --url http://10.10.10.88/ $ wpscan --url http://10.…

汽车IVI中控OS Linux driver开发实操(二十五):GPIO设备驱动的上手编写

概述: 1、验证GPIO是否有效。 2、如果有效,则可以从内核GPIO子系统请求GPIO。 3、将GPIO导出到sysfs(这是可选的)。 4、设置GPIO的方向 5、如果将GPIO设置为输出引脚,则将其设置为高/低。 6、设置去抖动间隔,如果将其设置为输入引脚,则读取状态。您还可以为边缘/级别触…

图像直方图计算

1. 图像直方图&#xff08;Image histogram&#xff09; 图像直方图&#xff0c;又叫影像直方图&#xff0c;是一种用来表现数位影像中像素分布的直方图&#xff0c;根据统计影像中不同亮度的像素总数&#xff0c;我们可以画出一张代表这张影像的影像直方图&#xff0c;透过这…