Keepalived + DR 集群

目录

1、Keepalive

VRRP 说明

故障切换

工作原理

核心组件

2、Keepalived + DR 集群

拓扑规划

前期准备

配置 Httpd 服务

配置 Nginx 服务

配置 LVS 主 node_01

配置 LVS 从 node_02

测试 LVS 集群

测试主备切换

3、Keepalived 脑裂现象

4、Keepalived 心态检测

TCP_CHECK 检测

HTTP_GET 检测

MISC_CHECK 检测

5、非抢占模式


1、Keepalive

Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,主用来提供故障切换和健检查功能,如判断 LVS 负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入集群。后来又加入了可以实现高可用的 VRRP 功能。因此,keepalived 除了能够管理 LVS 软件外,还可以作为其他服务的高可用解决方案软件(如nginx、 Mysql 等应用服务)

keepalived 软 件 主 要 是 通 过 VRRP 协 议 实 现 高 可 用 功 能 的 。 VRRP 是 Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP 出现的目的就是为了解决路由器的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

VRRP 说明

VRRP 是针对局域网中配置静态网关出现单点故障的解决方案,一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。

当缺省路由器 down 掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了 VRRP 时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。

VRRP 是针对路由器的一种备份解决方案-----由多台路由器组成一个热备组。这个热备组里面有一个 master 和多个 backup。master 上面有一个对外提供服务的 vip,通过 vip 地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的主服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟 IP 地址,以继续提供服务。

热备组内的每台服务器 都可以成为主服务器,虚拟 IP 地址(VIP)可以在热备组内的服务器之间进行转移,所以也称为漂移 IP 地址,使用 Keepalived 时,漂移地址的实现不需要手动建立虚拟接口配置文件(如 ens33:0),而是由 Keepalived 根据配置文件自动管理。

故障切换

Keepalived 高可用服务对主备之间的故障切换转移,是通过 VRRP 来实现的。 在 keepalived 服务工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备 Backup 节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的 IP 资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的 IP 资源和服务,恢复到原来的备用角色。

工作原理

Layer 3、4、5 工作在 IP/TCP 协议栈的 IP 层,TCP 层,及应用层。

keepalived 是一个类似于 layer3、4、5 交换机制的软件,也就是我们平时说的第3 层、第 4 层和第 5 层交换。Keepalived 的作用是检测节点服务器的状态,如果有一台节点服务器宕机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从集群中剔除,当服务器工作正常后 Keepalived 自动将其加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,只需要修复故障的节点服务器。

Layer3 层检测

进行 ICMP ping 包检测,确认主机是否存活,如果异常,则会将该主机从服务器集群中剔除。

Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向集群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序),如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从集群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。

Layer4 层检测

进行端口检测,例如 80、3306 等,端口不通时,将服务器从集群中剔除;主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。

Layer5 层检测

这个就是基于应用的了,如 http 返回码是否为 200,确认主机是否正常。Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除(例如:http 返回码是否为 200,确认主机是否正常)。

核心组件

keepalived 也是模块化设计,不同模块负责不同的功能,它主要有三个模块分别是:

  • core 模块:为 keepalived 的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
  • check:负责健康检查,包括常见的各种检查方式;
  • VRRP 模块:是来实现 VRRP 协议的。

其他组件:

  • system call:系统调用
  • watch dog:监控 check 和 vrrp 进程的看管者,check 负责检测健康状态,当其检测到 master 上的服务不可用时则通告 vrrp 将其转移至 backup 服务器上。
  • ipvs wrapper:为集群内的所有节点生成 IPVS 规则

利用 VRRP 协议进行主备通信。组播 224.0.0.18

利用 VRRP 协议进行主备竞选,产生 VIP

利用 VRRP 协议主向备发送组播包。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源。

当主恢复时,根据配置决定是否抢占备服务器资源

2、Keepalived + DR 集群
拓扑规划

主机名

内网IP

外网IP

VIP

角色

node_01

192.168.137.101

192.168.2.101

192.168.2.88

lvs+keepalived 主

node_02

192.168.137.102

192.168.2.102

lvs+keepalived 从

node_03

192.168.137.103

192.168.2.103

192.168.2.88

nginx

node_04

192.168.137.104

192.168.2.104

192.168.2.88

nginx

node_05

192.168.137.105

httpd

node_06

192.168.137.106

httpd

前期准备

node_01、02、03、04 在虚拟机上新增一块网卡 & 修改宿主机的V1的网段为2.0

配置外网ip地址:node 01、02、03、04 根据规划分配指定外网IP地址,这里只演示node_01。

# 先查看新增网卡的名称。本次是ens36
ifconfig -a# 添加ens36网卡文件
cd /etc/sysconfig/network-scripts/ 
cp ifcfg-ens33 ifcfg-ens36
# 修改名称、设备名称、IP地址按照外网IP规划分配、网关
vim ifcfg-ens36

systemctl restart network
ifconfig -a

关闭防火墙和selinux

# 所有服务器关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld # 所有服务器关闭 selinx 
setenforce 0 
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

配置本地yum源

vim /etc/yum.repos.d/centos.repo
#----------------------------------------------------------
[centos7] 
name=centos_7 
baseurl=file:///mnt/cdrom 
enabled=1 
gpgcheck=0 
#gpgcheck=1 
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#----------------------------------------------------------mkdir /mnt/cdrom/ 
mount /dev/sr0 /mnt/cdrom/

所有服务器同步系统时间

yum install -y ntp 
ntpdate ntp1.aliyun.com
配置 Httpd 服务

在node05 和 node06 节点上安装httpd服务

yum install -y httpd 
systemctl start httpd 
systemctl enable httpd 
echo "192.168.137.105" > /var/www/html/index.html

配置 Nginx 服务

在node03 和 node04 节点上安装 nginx 服务

关闭 ARP 转发

vim /etc/sysctl.conf 
net.ipv4.conf.ens33.arp_ignore = 1 
net.ipv4.conf.ens33.arp_announce = 2 
net.ipv4.conf.ens37.arp_ignore = 1 
net.ipv4.conf.ens37.arp_announce = 2 
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

配置虚拟 IP 地址(VIP)

cd /etc/sysconfig/network-scripts/ 
cp ifcfg-lo ifcfg-lo:0 
vim ifcfg-lo:0
#---------------------------------
DEVICE=lo:0 
IPADDR=192.168.2.88 
NETMASK=255.255.255.255
ONBOOT=yes 
NAME=loopback
#---------------------------------#  重启 network 服务 
systemctl restart network 
ifconfig lo:0

安装Nginx

# 解压nginx软件包
tar -zxvf nginx-1.22.1.tar.gz -C /usr/local/src
cd /usr/local/src/nginx-1.22.1/# 安装编译环境
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel# 预编译
./configure --prefix=/usr/local/nginx# 编译安装
make
make install# 编辑服务文件
vim /usr/lib/systemd/system/nginx.service
#--------------------------------------------------------------------------
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true[Install]
WantedBy=multi-user.target
#--------------------------------------------------------------------------# 启动服务
systemctl restart nginx
ps -ef | grep nginx

配置 nginx 负载均衡

upstream apache {server 192.168.137.105:80 weight=1 max_fails=1 fail_timeout=10s;server 192.168.137.106:80 weight=1 max_fails=1 fail_timeout=10s;}
server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {#root   html;#index  index.html index.htm;proxy_pass http://apache;}
}

配置 lvs + Keepalived

在这种模式下,虚拟 IP 在某时刻只能属于某一个节点,另一个节点作为备用节点存在。当主节点不可用时,备用节点接管虚拟 IP,提供正常服务。

配置 LVS 主 node_01

配置keepalived

# 安装 keepalived 
yum install -y keepalived# 查看 keepalived 配置文件 
ls /etc/keepalived/keepalived.conf

keepalived 只有一个配置文件 keepalived.conf,里面主要包括以下几个配置区域:

  • global_defs:主要是配置故障发生时的通知对象以及机器标识。
  • vrrp_instance:用来定义对外提供服务的 VIP 区域及其相关属性。
  • virtual_server:虚拟服务器定义。

编辑Keepalived 配置文件

# 编辑keepalived配置文件
vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id node_01
} vrrp_instance lvs-dr { state MASTERinterface ens36virtual_router_id 51priority 100advert_int 1 authentication {auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.88 } 
} virtual_server 192.168.2.88 80 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 50 protocol TCP real_server 192.168.2.103 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.2.104 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } 
}# ----------------------------配置文件说明 start ---------------------------------# !表示注释
! Configuration File for keepalived# 全局定义部分
global_defs { # 设置警报邮箱notification_email { # 接收警报的邮箱地址,根据实际情况写acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } # 设置发件人地址notification_email_from Alexandre.Cassen@firewall.loc# 设置 smtp server 地址,即发邮件服务器smtp_server 192.168.200.1 # 设置 smtp 超时连接时间,以上参数可以不配置smtp_connect_timeout 30 #表示运行 keepalived 服务器的一个标识,这个标识(router_id)是唯一的router_id cong11 
} # 定义一个实例,一个集群就是一个实例。 默认 VI_1 可以随意改
vrrp_instance lvs-dr { # MASTER 表示指定本节点为主节点,备用节点上设置为BACKUP。注意节点状态均大写。state MASTER # 绑定虚拟 IP 的网络接口interface ens37 # 虚拟路由 ID 标识,这个标识最好是一个数字,在一个keepalived.conf 配 置 中 是 唯 一 的 ,# MASTER 和 BACKUP 配 置 中 相 同 实 例 的 virtual_router_id 必须是一致的。virtual_router_id 51 # 节点的优先级(1-255 之间),越大越优先。备用节点必须比主节点优先级低。priority 100 # 为同步通知间隔。MASTER 与 BACKUP 之间心跳检查的时间间隔,单位为秒,默认为 1。advert_int 1 # 设置验证信息,两个节点必须一致,同一 vrrp 实例的MASTER 与 BACKUP 使用相同的密码才能正常通信authentication { auth_type PASS auth_pass 1111 } # 指定虚拟 IP, 两个节点设置必须一样virtual_ipaddress { 192.168.2.88 } 
} # 至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除# 以下为虚拟服务器定义部分:类似添加虚拟服务器 ipvsadm -A -t 192.168.2.11:80 -s rr 
# 设置虚拟服务器,指定虚拟 IP 和端口
virtual_server 192.168.2.88 80 { # 健康检查时间为 6 秒,即 Keepalived 多长时间监测一次 RS。delay_loop 6 # 设置负载调度算法为 rr 算法lb_algo rr # 设置负载均衡模式,有 NAT,TUN 和 DR 三种模式可选lb_kind DR # 非 NAT 模式注释掉此行 注释用!号nat_mask 255.255.255.0 # 连接保持时间,单位是秒。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,# 直到超过这个会话的保持时间。同一 IP地址的客户端 50 秒内的请求都发到同个 real server ,# 这个会影响 LVS 的 rr 调度算法,同一 IP 的客户端超过 50 秒后,# 再次访问,才会被转发到另一台 real server上。Persistence 是持久性的意思persistence_timeout 50 # 指定转发协议类型,有 TCP 和 UDP 两种protocol TCP # 配置 RS 节点 1,需要指定 realserver 的真实 IP 地址和端口,IP 和端口之间用空格隔开 real_server 192.168.2.13 80 {# 权重,权重大小用数字表示,数字越大,权重越高 weight 1 # 节点健康检查。这段内容要手动添加,把原来的内容删除TCP_CHECK { # 超时时间,表示 3 秒无响应超时。connect_timeout 3 # 表示重试次数nb_get_retry 3# 表示重试间隔delay_before_retry 3 # 检测端口,利用 80 端口检查connect_port 80 } } real_server 192.168.2.14 80 { #RS 节点 2 weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } 
} #默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。如: 
#virtual_server 10.10.10.2 1358 { 。。。 } 
#virtual_server 10.10.10.3 1358 { 。。。 }
# ----------------------------配置文件说明 end---------------------------------# 重启 keepalived 服务 
systemctl restart keepalived 
systemctl enable keepalived 
systemctl status keepalived

安装 ipvsadm

注意:安装完成不需要做任何配置,启动方式由 keepalived 控制

 yum -y install ipvsadm 
lsmod | grep ip_vs

 ipvsadm -L -n

配置 LVS 从 node_02
# 安装 keepalived 
yum install -y keepalived # 修改 keepalived.conf 配置文件 
vim /etc/keepalived/keepalived.conf! Configuration File for keepalived 
global_defs { router_id node_02
} vrrp_instance lvs-dr { state BACKUP interface ens36 virtual_router_id 51 priority 99 advert_int 1 authentication {auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.88 } 
} virtual_server 192.168.2.88 80 { delay_loop 6 lb_algo rr lb_kind DR #persistence_timeout 50 protocol TCP real_server 192.168.2.103 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.2.104 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } 
}
#-----------------------------------------------# 启动 keepalived
systemctl start keepalived
systemctl enable keepalived 

安装 ipvsadm 
yum -y install ipvsadm
测试 LVS 集群

浏览器访问

查看负载调度

查看 Nginx 日志

tail -0f /usr/local/nginx/logs/access.log

查看Apache 日志

tail -0f /var/log/httpd/access_log 

测试主备切换

查看主节点、从节点的VIP情况

ip addr show dev ens36

测试主备 vip 地址漂移

# 停止主节点服务
systemctl stop keepalived# 查看主节点、从节点的VIP情况
ip addr show dev ens36

重新启动LVS旧主(node_01)

systemctl start keepalived # 查看主节点、从节点的VIP情况
ip addr show dev ens37 

3、Keepalived 脑裂现象

由于某些原因,导致两台 keepalived 高可用服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。表现形式就是备节点上出现了虚拟 IP, 此时主节点也是持有虚拟 IP 的。

脑裂产生的原因:

高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

  • 因心跳线坏了(包括断了,老化)。
  • 因网卡及相关驱动坏了,ip 配置及冲突问题(网卡直连)。
  • 因心跳线间连接的设备故障(网卡及交换机)。

高可用服务器上开启了 iptables 防火墙阻挡了心跳消息传输。

高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件 Bug 等。

Keepalived 配置里同一 VRRP 实例如果 virtual_router_id 两端参数配置不一致也会导致裂脑问题发生。

4、Keepalived 心态检测
TCP_CHECK 检测
real_server 192.168.2.13 80 { weight 100 TCP_CHECK { # 检测端口,利用 80 端口检查connect_port 80 # 连接超时时间connect_timeout 3 # 重连次数nb_get_retry 3# 重连间隔delay_before_retry 3 } 
}
HTTP_GET 检测
real_server 192.168.2.13 80 { weight 1 HTTP_GET { url { path /index.html # http://192.168.2.103/index.html 的返回状态码status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } 
}
MISC_CHECK 检测

自定义 Shell 脚本监控

real_server 192.168.2.13 80 { weight 100 MISC_CHECK { # 脚本名,需全路径misc_path "/opt/mytools/check_web.sh 192.168.2.103" # 脚本执行的超时时间misc_timeout 30 # 如果设置了 misc_dynamic,healthchecker # 程序的退出状态码会用来动态调整服务器的权重(weight)。misc_dynamic } 
}

用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:

  • 返回 0:健康检查 OK,权重不被修改
  • 返回 1:健康检查失败,权重设为 0
  • 返回 2-255:健康检查 OK,权重设置为:退出状态码-2,比如返回 255,那么 weight=255-2=253

keepalived 检测脚本内容/opt/mytools/check_web.sh,返回 0 代表检查正常,返回 1 代表检查异常

/opt/mytools/check_web.sh 内容如下:

#!/bin/sh 
serverip=$1 
curl -s -m 2 http://$serverip 
if [ $? -eq 0 ];then exit 0 
else exit 1 
fi

注意:curl 命令中的-s 选项表示静音模式,不输出任何东西。-m 选项表示设置数据传输的最大时间。传输的最大允许时间

5、非抢占模式

和抢占模式的配置相比,只改了两个地方:

  • 在 vrrp_instance 块下,两个节点各增加了 nopreempt 指令,表示不争抢 vip。
  • 两个节点的 state 都为 BACKUP。

在非抢占模式下,两个 keepalived 节点都启动后,默认都是 BACKUP 状态,双方在发送组播信息后,会根据优先级来选举一个 MASTER 出来。由于两者都配置了 nopreempt,所以 MASTER 从故障中恢复后,不会抢占 vip。这样会避免 VIP 切换可能造成的服务延迟。

! Configuration File for keepalived 
global_defs { router_id cong11 
} 
vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 
} 
vrrp_instance lvs-dr { state BACKUPinterface ens37 virtual_router_id 51 priority 100 advert_int 1 nopreemptauthentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.88 } track_script { chk_nginx } 
}

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

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

相关文章

平安健康与中航健康时尚集团携手并进,共创会员制健康管理美好未来

近日,深圳市中航健康时尚集团股份有限公司(以下简称“中航健康时尚”)与平安健康正式达成战略合作。平安健康总裁吴军、中航健康时尚董事长王岚等领导出席签约仪式,就此次战略合作展开深入交流。 据了解,中航健康时尚集团创建于1995年&#x…

内存泄漏的原因及排查方法

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 随着网页应用的逐渐复杂化,内存管理也变得越来越重要。内存泄漏不仅会…

YUDIAN(宇电)温控器参数笔记(二)

没想到啊,时隔3年,我又用到了这个温控器,又来更新一下,因为我刚好要做一个简易的控温系统,类似于恒温水槽。 这个系统大概就是: 温控器用pt100测温,作为输入,输入连接到一个ssr上&a…

Start gtkmm 4 Programming (range controls)_

文章目录 基础解析 Chapter 7. Range Widgets https://gtkmm.org/en/documentation.htmlhttps://gnome.pages.gitlab.gnome.org/gtkmm-documentation/index.html 基础 容器: 容器小部件与其他小部件一样,派生自Gtk::Widget.例如Gtk::Grid可以容纳许多子小部件&…

vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)

概述:没有后端数据的前端,就失去了灵魂,由于本人没有写后端数据,所有调用黑马的,往下看相信对你会有收获的。 目录 第一步:安装axios 第二步:编写后端访问地址 第三步:编写具体的…

如何更新github上fork的项目(需要一定git基础)

如何更新Fork的项目(需要一定git基础) 前言:本文记录一下自己在github上fork了大佬的开源博客项目https://github.com/tangly1024/NotionNext,如何使用git克隆以及自定义开发和同步合并原项目更新迭代内容的的步骤 如何更新fork的项目(进阶版) 首先你…

解决:ModuleNotFoundError: No module named ‘selenium’

解决:ModuleNotFoundError: No module named ‘selenium’ 文章目录 解决:ModuleNotFoundError: No module named selenium背景报错问题报错翻译报错位置代码报错原因解决方法方法一,直接安装方法二,手动下载安装方法三&#xff0…

数字图像处理(实践篇)三十七 OpenCV-Python 使用SIFT和BFmatcher对两个输入图像的关键点进行匹配实践

目录 一 涉及的函数 二 实践 三 报错处理 使用SIFT(尺度不变特征变换)算法

幻兽帕鲁服务器Palworld游戏怎么更新?

自建幻兽帕鲁服务器进入Palworld游戏提示“您正尝试加入的比赛正在运行不兼容的游戏版本,请尝试升级游戏版本”什么原因?这是由于你的客户端和幻兽帕鲁服务器版本不匹配,如何解决?更新幻兽帕鲁服务器即可解决。阿里云百科aliyunba…

git操作之本地代码修改后想回退成当前最新版本

这张图很关键,取自https://www.cnblogs.com/cblx/p/12467083.html 我们的vscode就是workspace,我们提交代码需要三步,add,commit,push,其中我们想拉取代码有两种方式,git pull或者git fetch/cl…

《【Python】如何设置现代 Python 日志记录 | Python 基础教程 | Python 冷知识 | 十分钟高手系列》学习笔记

《【Python】如何设置现代 Python 日志记录 | Python 基础》 2 PUT ALL HANDLERS/FILTERS ON THE ROOT:扁平化的设计有助于简化维护成本 5 STORE CONFIG IN JSON OR YAML FILE:使用配置文件可以将配置和代码解耦,减少代码量 日志设置示例 7 …

ubuntu 22安装配置并好安全加固后,普通用户一直登录不上

现象 ubuntu 22安装配置并好安全加固后,普通用户一直登录不上 排查报错 查看日志/var/log/auth.log发现报错 Jan 30 15:49:57 aiv-O-E-M sshd[62570]: PAM unable to dlopen(pam_tally2.so): /lib/security/pam_tally2.so: cannot open shared object file: No …

管理的四种风格

前言 管理的四种风格,一般的领导大概就是这几种管理模式,告知,辅导,参与,授权,还有就是乱搞式(神经病模式)。 一、告知式 告知式是指组织通过正式、明确的渠道,将信息传达给员工。这种方式通常用于传递基本的规章制度、工作流程、政策文件等。告知式的作用在于确保员…

体验 AutoGen Studio - 微软推出的友好多智能体协作框架

体验 AutoGen Studio - 微软推出的友好多智能体协作框架 - 知乎 最近分别体验了CrewAI、MetaGPT v0.6、Autogen Studio,了解了AI Agent 相关的知识。 它们的区别 可能有人要问:AutoGen我知道,那Autogen Studio是什么? https://g…

pandas绘制饼图:百分比、定制标签、关闭图例、支持中文

matplotlib绘制饼图 import matplotlib.pyplot as pltplt.rc(font, family=SimHei, size=13) size = [25, 15

C++_list

目录 一、模拟实现list 1、list的基本结构 2、迭代器封装 2.1 正向迭代器 2.2 反向迭代器 3、指定位置插入 4、指定位置删除 5、结语 前言: list是STL(标准模板库)中的八大容器之一,而STL属于C标准库的一部分,因此在C中可以直接使用…

npm 淘宝镜像正式到期

由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且同步频率…

AsyncLocal是如何实现在Thread直接传值的?

一:背景 1. 讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候,有朋友提出了AsyncLocal是如何实现的,虽然做了口头上的表述,但总还是会不具体,所以觉得有必要用文字图表的方式来系统…

百度智能小程序开发平台:SEO关键词推广优化 带完整的搭建教程

移动互联网的普及,小程序成为了众多企业和开发者关注的焦点。百度智能小程序开发平台为开发者提供了一站式的解决方案,帮助企业快速搭建并推广自己的小程序。本文将重点介绍百度智能小程序开发平台的SEO关键词推广优化功能,并带完整的搭建教程…

img标签插入图片下方有空隙,怎么解决?

在写静态页面时,经常会用 img 标签插入图片,但图片插入后,直接在浏览器中运行时,图片的下方经常会有空隙间距,文字或者其它元素不好跟图片对齐,devtools 工具查看的话会很明显。 如下图: 上图…