Keepalived + DR 集群

news2024/11/15 19:59:59

目录

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 keepalived

global_defs { 
 router_id node_01
} 

vrrp_instance lvs-dr { 
  state MASTER
  interface ens36
  virtual_router_id 51
  priority 100
  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 
    } 
  } 
}


# ----------------------------配置文件说明 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 BACKUP
 interface ens37 
 virtual_router_id 51 
 priority 100 
 advert_int 1 
 nopreempt
 authentication { 
   auth_type PASS 
   auth_pass 1111 
 } 
 virtual_ipaddress { 
   192.168.1.88 
 } 
 track_script { 
   chk_nginx 
 } 
}

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

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

相关文章

每日一练:LeeCode-404、左叶子之和【二叉树】

本文是力扣LeeCode-404、左叶子之和 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 404、 左叶子之和 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,…

Coremail启动鸿蒙原生应用开发,打造全场景邮件办公新体验

1月18日,华为在深圳举行鸿蒙生态千帆启航仪式,Coremail出席仪式并与华为签署鸿蒙合作协议,宣布正式启动鸿蒙原生应用开发。作为首批拥抱鸿蒙的邮件领域伙伴,Coremail的加入标志着鸿蒙生态版图进一步完善。 Coremail是国内自建邮件…

Spring | Spring的“数据库开发“ (Srping JDBC)

目录: Spring JDBC1.Spring JDBC的核心类 ( JdbcTemplate类 )2.Srping JDBC 的配置3.JdbcTemplate类的“常用方法”execute( ):直接执行“sql语句”,没有返回值update( ) :“增删改”,返回 “影响的行数”query( ) : “…

LabVIEW电液伺服控制系统

介绍了如何利用ARM微处理器和LabVIEW软件开发一个高效、精准的电液伺服控制系统。通过结合这两种技术,我们能够提高系统的数字化程度、集成化水平,以及控制精度,从而应对传统电液伺服控制器面临的问题。 该电液伺服控制系统由多个关键部分组…

IDEA:git 回滚本地提交-git 选择 Reset Current Branch to

前言 回滚提交到本地但是还没有 Push 上去的提交 选择我们要回滚的节点,然后点击 git 选择 Reset Current Branch to… 再选择 Hard 。当我们点击 Reset 的时候,代码就会回滚到单前选中的这个版本

Docker 安装篇(CentOS)

Docker社区版 Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。 1、Docker 要求 C…

《CSS3》田字网格背景(外实线内虚线)的实现

一、前言 记录一些有趣的CSS实现方式,总所周知,当一段效果可以通过CSS实现的时候,绝不使用Javascript来实现,因此记录一些有意思的CSS效果,一来是方便自己学习,另一来是方便以后在需要使用到的时候能快速找…

聊一聊GPT、文心、通义、混元

我使用同一个Prompt提示词“请以记叙文的文体来写”,分别发送给GPT-3.5(调用API)、文心、通义、混元,下面是它们各自生成的文本内容,大家一看便知了。 GPT-3.5: 在我个人使用GPT模型的过程中,我…

从零开始 Linux(一):基础介绍与常用指令总结

从零开始 Linux 01. 概念理解 1.1 什么是 Linux? Linux 是一个开源免费的 操作系统,具有很好的稳定性、安全性,且有很强的处理高并发的能力 Linux 的应用场景: 可以在 Linux 下开发项目,比如 JavaEE、大数据、Python…

Typecho独家Joe编辑器Joe博客主题二次开发版

Typecho独家Joe编辑器Joe博客主题二次开发版。因为Joe主题作者不再更新,二开基于原主题 7.3.7 最新版开发。 源码下载:https://download.csdn.net/download/m0_66047725/88783800 更多资源下载:关注我。

mini-spring 实现应用上下文,自动识别、资源加载、扩展机制

我们不能让面向 Spring 本身开发的 DefaultListableBeanFactory 服务,直接给予用户使用 DefaultListableBeanFactory、XmlBeanDefinitionReader,是我们在目前 Spring 框架中对于服务功能测试的使用方式,它能很好的体现出 Spring 是如何对 xm…

Postman-接口测试教程

接口是软件开发中常用的概念,是软件生产过程中比较核心的任务。对于接口开发者,调试接口是一件较为繁琐的事情,很多时候需要线上线下来回切换。在这里,我就跟大家介绍一个只需要在本地就可以调试接口的方法,即使用post…

Android 使用高德地图

一、获取高德平台key 【1】基于application包名&sha1值在高德控制台获取key值&#xff0c;详情参考&#xff1a; 获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API 【2】在manifest中声明权限 【3】将拿到的key值在manifest中进行声明 <!--允许程序打开网络…

React-Native跟Android交互--简单示例记录

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

机器学习复习(3)——分类神经网络与drop out

完整的神经网络 以分类任务为例&#xff0c;神经网络一般包括backbone和head&#xff08;计算机视觉领域&#xff09; 下面的BasicBlock不是一个标准的backbone,标准的应该是复杂的CNNs构成的 Classfier是一个标准的head,其中output_dim表示分类类别&#xff0c;一般写作num…

三步实现 Sentinel-Nacos 持久化

一、背景 版本&#xff1a;【Sentinel-1.8.6】 模式&#xff1a;【Push 模式】 参照官网介绍&#xff1a;生产环境下使用Sentinel &#xff0c;规则管理及推送模式有以下3种模式&#xff1a; 比较之后&#xff0c;目前微服务都使用了各种各样的配置中心&#xff0c;故采用Pus…

手机屏幕生产厂污废水处理需要哪些工艺设备

随着手机行业的快速发展&#xff0c;手机屏幕生产厂的规模也越来越大&#xff0c;但同时也带来了大量的污废水排放问题。为了保护环境和人类的健康&#xff0c;手机屏幕生产厂需要采取适当的工艺设备来处理污废水。本文将介绍手机屏幕生产厂污废水处理所需的工艺设备。 首先&am…

【环境配置】安装了pytorch但是报错torch.cuda.is_availabel()=Flase

解决思路&#xff1a;import torch正常&#xff0c;说明torch包安装正常&#xff0c;但是不能和gpu正常互动&#xff0c;猜测还是pytroch和cuda的配合问题 1.查看torch包所需的cuda版本 我的torch是2.0.1&#xff0c;在现在是比较新的包&#xff0c;需要12以上的cuda支持&…

【算法与数据结构】198、213、337LeetCode打家劫舍I, II, III

文章目录 一、198、打家劫舍二、213、打家劫舍 II三、337、打家劫舍III三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、198、打家劫舍 思路分析&#xff1a;打家劫舍是动态规划的的经典题目。本题的难点在于递归公式…

Android开发之UI控件

TextView 实现阴影效果的textview android:shadowColor"#ffff0000" 设置阴影颜色为红色android:shadowRadius"3" 设置阴影的模糊程度为3android:shadowDx"10" 设置阴影在水平方向的偏移android:shadowDy"10" 设置阴影在竖直方向的偏…