当前位置: 首页 > news >正文

云原生|kubernetes|kubernetes的etcd集群备份策略

简介: 云原生|kubernetes|kubernetes的etcd集群备份策略

前言

etcd作为集群的关键组件之一,还是非常有必要进行定期备份的,本例将会就如何更快更好的备份etcd以及应该有哪些策略做一解析。(二进制部署的etcd集群)

备份什么数据和恢复什么数据?

etcd的数据默认会存放在 /var/lib/etcd/member/,我们发现数据所在的目录,会被分为两个文件夹中:

snap: 存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态。

那么,别的方式部署的集群也需要备份etcd集群吗?

基本是不需要的,例如,kubeadm部署的集群,只要把相关的一些文件和证书备份好就可以了。Kubeadm的默认安装时,将etcd的存储数据落地到了宿主机的/var/lib/etcd/目录,将此目录下的文件定期备份起来,如果以后etcd的数据出现问题,需要恢复时,直接将文件还原到此目录下,就实现了单节点的etcd数据恢复。

注:如果etcd容器正在启动,是不能覆盖的,这时只需要将/etc/kubernetes/manifests文件夹重命名,数据文件替换后,将/etc/kubernetes/manifests改回来,过一会就会自动将etcd容器重启起来(这个的原理是修改apiserver的配置文件就会自动重启apiserver服务。)

下面我写的这个脚本不仅适合kubernetes集群的etcd备份恢复,也适合于大数据下使用的etcd以及openstack平台的etcd。

 

备份和原理

备份的方式:因为我们备份的是etcd集群,集群的每一个节点都是一样的,因此,在一个节点执行快照备份即可,这样我们会得到一个快照文件。

恢复方式:

wal: 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中。

恢复的方式:整个集群停止,然后进行恢复动作。前面得到的快照文件需要在每个一个节点使用,使用前删除原有的数据文件,然后重启etcd服务,在master节点重启etcd和apiserver服务(两个服务有先后顺序,先etcd服务,然后是apiserver服务),在其它节点重启etcd服务。

OK,基本的etcd集群备份原因和方法我想应该是讲清楚了,那么,下面我就以一个三节点的etcd集群备份和恢复为例,通过shell脚本的方式来自动备份和恢复。

 

三个节点,一主两工作节点,IP地址为:192.168.217.16/17/18  ,此etcd集群使用了证书,因此,查询什么的需要带上证书。

为了方便etcd集群的操作,做一点优化,并对etcd的常用查询做一点示例:

vim /etc/profile

alias etcd_search='ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints=https://192.168.217.16:2379,https://192.168.217.17:2379,https://192.168.217.18:2379 --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem'

 激活变量:

[root@k8s-master ~]# etcd_search member list -w table
+------------------+---------+--------+-----------------------------+-----------------------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         |
+------------------+---------+--------+-----------------------------+-----------------------------+
| 1a58a86408898c44 | started | etcd-1 | https://192.168.217.16:2380 | https://192.168.217.16:2379 |
| 67146ac2958941d0 | started | etcd-2 | https://192.168.217.17:2380 | https://192.168.217.17:2379 |
| e078026890aff6e3 | started | etcd-3 | https://192.168.217.18:2380 | https://192.168.217.18:2379 |
+------------------+---------+--------+-----------------------------+-----------------------------+

1,etcd集群成员查询

[root@k8s-master ~]# etcd_search member list -w table
+------------------+---------+--------+-----------------------------+-----------------------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         |
+------------------+---------+--------+-----------------------------+-----------------------------+
| 1a58a86408898c44 | started | etcd-1 | https://192.168.217.16:2380 | https://192.168.217.16:2379 |
| 67146ac2958941d0 | started | etcd-2 | https://192.168.217.17:2380 | https://192.168.217.17:2379 |
| e078026890aff6e3 | started | etcd-3 | https://192.168.217.18:2380 | https://192.168.217.18:2379 |
+------------------+---------+--------+-----------------------------+-----------------------------+

2,etcd集群检查点健康查询

[root@k8s-master ~]# etcd_search endpoint health -w table
https://192.168.217.16:2379 is healthy: successfully committed proposal: took = 3.675613ms
https://192.168.217.17:2379 is healthy: successfully committed proposal: took = 4.341192ms
https://192.168.217.18:2379 is healthy: successfully committed proposal: took = 5.6451ms

 3,etcd集群检查点状态查询

[root@k8s-master ~]# etcd_search endpoint status -w table
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
|          ENDPOINT           |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://192.168.217.16:2379 | 1a58a86408898c44 |  3.3.13 |   20 kB |      true |         2 |         17 |
| https://192.168.217.17:2379 | 67146ac2958941d0 |  3.3.13 |   20 kB |     false |         2 |         17 |
| https://192.168.217.18:2379 | e078026890aff6e3 |  3.3.13 |   20 kB |     false |         2 |         17 |
+-----------------------------+------------------+---------+---------+-----------+-----------+------------+

ETC集群的备份

在非master节点上新建备份目录(脚本已经写了还是在写一遍):

mkdir -p /opt/etcd_backup_dir/

编写脚本(任意节点都可以,一般还是master上):

vim  etcd-bak.sh(注,在master执行的,因此,scp的是其它两个节点地址,要是在17执行,scp那要改一哈的哦)

#!/bin/bash
# author zsk_john
# date 2022-09-27
set -e
#定义了很多变量,按实际情况填写IP相关的变量,备份路径变量也可根据自己喜好定义。
master_ip=192.168.217.16
Slave1_Ip=192.168.217.17
Slave2_Ip=192.168.217.18
BackupDir="/opt/etcd_backup_dir"
ETCD_SSL_PATH=/opt/etcd/ssl               #这个是证书存放路径,根据实际情况定义
#===================================
ETCD_ENDPOINTS="192.168.217.16:2379"      #这个是检查点,根据实际情况定义      
CACERT=$ETCD_SSL_PATH/ca.pem             #三个etcd用的证书,名称很可能也不一样,有的是ca.crt这样的,实际情况定义
CERT=$ETCD_SSL_PATH/server.pem
KEY=$ETCD_SSL_PATH/server-key.pem
mkdir -p $BackupDir                      #建立前面定义的备份文件存放路径,否则脚本失败。
#etctctl这个可执行文件的路径,如果是在系统变量内,留etcdctl就可以
ETCDCTL_API=3 /opt/etcd/bin/etcdctl \
--cacert="${CACERT}" \
--cert="${CERT}" \
--key="${KEY}" \
--endpoints=${ETCD_ENDPOINTS} \
snapshot save $BackupDir/etcd-snapshot-`date +%Y%m%d`.db  #按日期命名备份文件,例如,脚本执行后生成的文件名称会是这样的:etcd-snapshot-20220927.db
# 备份保留30天
find $BackupDir/ -name *.db -mtime +30 -exec rm -f {} \;
scp -r $BackupDir root@$Slave1_Ip:$BackupDir #如果有更多的节点,在上面定义后,将此行复制后修改一哈就可以了,因为是集群,一般都免密,因此,不用担心拷贝不过去。
scp -r $BackupDir root@$Slave2_Ip:$BackupDir
echo  "`date` etcd cluster is success backup !"

 执行脚本即可。该脚本自动将备份文件传到其它两个节点,为以后的备份提供了一点方便。注意一哈,里面写的证书路径不要错了,按实际的来就可以了,因为有的etcd集群会把ca.pem 生成为ca.crt等等

脚本执行输出如下:

[root@master ~]# bash etcd-bak.sh
Snapshot saved at /opt/etcd_backup_dir/etcd-snapshot-20220927.db
etcd-snapshot-20220927.db                                                                                                                                                   100%   71MB  25.3MB/s   00:02    
etcd-snapshot-20220927.db                                                                                                                                                   100%   71MB  43.6MB/s   00:01    
Tue Sep 27 23:06:50 CST 2022 etcd cluster is success backup !

脚本执行输出如下:此脚本可反复执行,没有什么bug,主要是变量要定义准确不要错误了。

 

二,etcd集群恢复

cp -rf  /var/lib/etcd/default.etcd{,default.etcd.bak}

这里是先备份哈数据文件,以防万一,根据自己实际情况修改此命令

etcd相关配置文件
#[Member]
ETCD_NAME="etcd-1" #这样要复制
ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #这样要复制
ETCD_LISTEN_PEER_URLS="https://192.168.217.16:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.217.16:2379"#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.217.16:2380" #这样要复制
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.217.16:2379"  #这样要复制
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.217.16:2380,etcd-2=https://192.168.217.17:2380,etcd-3=https://192.168.217.18:2380" #这样要复制
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #这样要复制
ETCD_INITIAL_CLUSTER_STATE="new"

直接将上面的5个变量复制到下面的脚本,这个脚本在哪个节点,就复制哪个节点上的etcd配置文件的这五个

vim etc_restore.sh
#!/bin/bash
# author zsk_john
# date 2022-09-27
set -e
rm -rf /var/lib/etcd/default.etcd
apiserver_pid=`ps aux |grep apiserver |grep -v grep|wc -l` #判断是否是apiserver,是就停止apiserver,否则不停,只停etcd
BackupDir="/opt/etcd_backup_dir"  #备份文件路径
BACKUP_FILE="$BackupDir/etcd-snapshot-$1.db" #备份文件名称
ETCD_SSL_PATH=/opt/etcd/ssl  #etcd证书存放路径,根据实际填写,结尾不能带/
ETCD_DATA=/var/lib/etcd/default.etcd #etcd数据存放目录,根据实际填写,结尾不能带/  #etcd配置文件里的
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #etcd配置文件里的
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.217.16:2380"  #etcd配置文件里的
ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.217.16:2380,etcd-2=https://192.168.217.17:2380,etcd-3=https://192.168.217.18:2380" #etcd配置文件里的
ETCD_NAME=etcd-1  #etcd配置文件里的
if [ $apiserver_pid -eq 1 ];
then
echo "this server is master node,will stop apiserver and etcd service"
systemctl stop kube-apiserver etcd
echo "service apiserver and etcd is Success finished"
else
echo "this server is not master node,will only stop etcd service"
systemctl stop etcd
echo "this node's etcd service is success finsihed"
fi  #停止服务
#=================================================================
#cp -rf  /var/lib/etcd/default.etcd{,default.etcd.bak} #备份一哈
if [ ! -n "$1" ];
thenecho "请输入etcd备份文件的时间"exit
fiecho $BACKUP_FILE
if [ ! -f "$BACKUP_FILE" ];
thenecho "etcd备份文件不存在,请重新执行并输入正确的备份文件时间"exit
fi
#提醒一哈此脚本是带参的,如果没有输入参数,不执行脚本
#================================================================
ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore $BACKUP_FILE \
--name "${ETCD_NAME}" \
--initial-cluster="${ETCD_INITIAL_CLUSTER}" \
--initial-advertise-peer-urls=$ETCD_INITIAL_ADVERTISE_PEER_URLS \
--initial-cluster-token=etcd-cluster \
--data-dir=$ETCD_DATA
echo "restore etcd is success"

此脚本带参数,参数为备份文件名里的日期,例如:

[root@master ~]# ls -al /opt/etcd_backup_dir/etcd-snapshot-20220927.db 
-rw-r--r-- 1 root root 74780704 Sep 27 23:09 /opt/etcd_backup_dir/etcd-snapshot-20220927.db

想要恢复27号的etcd,那么执行命令为bash etcd-restore.sh 20220928,如果是28号的etcd,那么就是 bash etcd-restore.sh 20220928:

注意哈:恢复肯定是要整个集群恢复,所以先把脚本复制到其它节点,并且按当前节点的etcd配置文件修改好后,所有节点都执行此恢复脚本。

[root@master ~]# bash etcd-restore.sh 20220927
+ rm -rf /var/lib/etcd/default.etcd
++ ps aux
++ grep apiserver
++ grep -v grep
++ wc -l
+ apiserver_pid=1
+ BackupDir=/opt/etcd_backup_dir
+ BACKUP_FILE=/opt/etcd_backup_dir/etcd-snapshot-20220927.db
+ ETCD_SSL_PATH=/opt/etcd/ssl
+ ETCD_DATA=/var/lib/etcd/default.etcd
+ ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
+ ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.217.16:2380
+ ETCD_INITIAL_CLUSTER=etcd-1=https://192.168.217.16:2380,etcd-2=https://192.168.217.17:2380,etcd-3=https://192.168.217.18:2380
+ ETCD_NAME=etcd-1
+ '[' 1 -eq 1 ']'
+ echo 'this server is master node,will stop apiserver and etcd service'
this server is master node,will stop apiserver and etcd service
+ systemctl stop kube-apiserver etcd
+ echo 'service apiserver and etcd is Success finished'
service apiserver and etcd is Success finished
+ '[' '!' -n 20220927 ']'
+ echo /opt/etcd_backup_dir/etcd-snapshot-20220927.db
/opt/etcd_backup_dir/etcd-snapshot-20220927.db
+ '[' '!' -f /opt/etcd_backup_dir/etcd-snapshot-20220927.db ']'
+ ETCDCTL_API=3
+ /opt/etcd/bin/etcdctl snapshot restore /opt/etcd_backup_dir/etcd-snapshot-20220927.db --name etcd-1 --initial-cluster=etcd-1=https://192.168.217.16:2380,etcd-2=https://192.168.217.17:2380,etcd-3=https://192.168.217.18:2380 --initial-advertise-peer-urls=https://192.168.217.16:2380 --initial-cluster-token=etcd-cluster --data-dir=/var/lib/etcd/default.etcd
2022-09-27 23:40:15.248258 I | mvcc: restore compact to 711953
2022-09-27 23:40:15.268601 I | etcdserver/membership: added member 1a58a86408898c44 [https://192.168.217.16:2380] to cluster e4c1916e49e5defc
2022-09-27 23:40:15.268694 I | etcdserver/membership: added member 67146ac2958941d0 [https://192.168.217.17:2380] to cluster e4c1916e49e5defc
2022-09-27 23:40:15.268758 I | etcdserver/membership: added member e078026890aff6e3 [https://192.168.217.18:2380] to cluster e4c1916e49e5defc
+ echo 'restore etcd is success'
restore etcd is success

 

总结:

etcd恢复还是比较快的,脚本做了一些工作,比如,停服务,因此,恢复完要先启动etcd,然后在其它节点启动etcd,最后启动kube-apiserver服务,顺序不要搞错了哦。

可将备份脚本放入计划任务,实现自动备份哈,这里我就不演示啦,然后恢复的时候根据需要恢复任意天的etcd。

再次强调,集群恢复是所有节点都恢复,不能只恢复一个节点,那样会劈叉的,根据每个节点的etcd配置文件修改脚本。

相关文章:

云原生|kubernetes|kubernetes的etcd集群备份策略

简介: 云原生|kubernetes|kubernetes的etcd集群备份策略 前言: etcd作为集群的关键组件之一,还是非常有必要进行定期备份的,本例将会就如何更快更好的备份etcd以及应该有哪些策略做一解析。(二进制部署的etcd集群&…...

永不收费的软件,离线可用

上次在推荐PC端证件照软件时,有小伙伴问是否有安卓端的版本。当时我说有,只是需要测试一下再给大家推荐。 今天就为大家带来一款安卓端的证件照软件,有需要的小伙伴可以赶紧收藏起来! 底色证件照(安卓) 之…...

解锁课程编辑器之独特风姿

(一)强大的编辑功能​ 课程编辑器的编辑功能堪称一绝,就像是一位全能的艺术大师。在文字编辑方面,它提供了丰富的字体、字号选择,还能对文字进行加粗、倾斜、下划线等格式设置,让重点知识一目了然。比如教师…...

在企业级智能体浪潮中,商业数据分析之王SAS或将王者归来

继LLM大模型与GenAI生成式AI应用之后,智能体正在成为下一个风口。与基于LLM的GenAI应用不同,智能体将LLM的智能涌现能力与智能决策的能力相结合,让智能体不仅能够认知、分析和总结,还能够进行决策和执行决策,将知识与智…...

WPF自定义控件开发全指南:多内容切换与动画集成

WPF自定义控件开发全指南:多内容切换与动画集成 一、控件基础架构设计1.1 选择控件基类1.2 定义关键属性 二、动画系统集成2.1 淡入淡出动画实现2.2 滑动动画实现 三、视觉状态管理四、完整使用示例4.1 XAML声明4.2 动画触发逻辑 五、扩展与优化5.1 性能优化建议5.2…...

二维差分(主要看原数组与差分数组的关系)

#include<stdio.h> #include<windows.h> int main() { int n, m; scanf("%d%d", &n, &m); int d[n 2][n 2]; // 差分数组 int a[n 2][n 2]; // 原数组 // 初始化数组 for (int i 0; i < n 1; i) { for (int j 0; j < n 1; j) { d…...

AI+企业应用级PPT生成(实战)

使用DeepSeek生成PPT框架Kimi PPT助手生成PPT全流程教学 目录 工具简介操作步骤 2.1 DeepSeek生成PPT框架2.2 Kimi PPT助手生成PPT 案例演示注意事项与优化建议扩展应用场景 1. 工具简介 DeepSeek&#xff1a;国内领先的AI大模型&#xff0c;擅长生成结构化文本内容&#xff…...

EXCEL Python 实现绘制柱状线型组合图和树状图(包含数据透视表)

1、组合图、数据透视表 &#xff08;1&#xff09;数据预处理 知识点 日期函数 year() month()数据透视表操作 同比计算公式 环比计算公式 &#xff08;2&#xff09;excel 数据透视表插入组合图 a.2015~2017数据集处理方式&#xff1a; 操作&#xff1a; 结果 b.2020~20…...

OpenCV的CUDA模块进行图像处理

本文介绍了使用OpenCV和CUDA加速的四种图像处理技术&#xff1a;灰度化、高斯模糊、Sobel边缘检测和直方图均衡化。每种技术都通过将图像数据上传到GPU&#xff0c;利用CUDA进行加速处理&#xff0c;最后将结果下载回CPU。灰度化通过cv::cuda::cvtColor实现&#xff0c;高斯模糊…...

电路研究9.3.5——合宙Air780EP中的AT开发指南:MQTT 应用指南

应用概述 4G 模块支持 MQTT 和 MQTT SSl 协议&#xff0c; MQTT 应用的基本流程如下&#xff1a; 1、如果要支持 SSL &#xff0c;配置 SSL 参数 2、通过 TCP 连接到 MQTT 服务器 3、发送 MQTT CONNECT 到服务器&#xff0c;打开会话连接 4、订阅或者发布消息…...

每日算法刷题计划Day5 5.13:leetcode数组3道题,用时1h

11. 26. 删除有序数组中的重复项(简单&#xff0c;双指针) 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思想: 1.我的思想: 双指针遍历集合储存已有元素 2.官方思想&#xff1a; 题目条件有序数组删除重复元素&#xff0c;所以重复元素都是连续存在…...

常见排序算法及复杂度分析

冒泡排序 (Bubble Sort) 基本思想 相邻元素比较&#xff0c;大的元素后移 每轮将最大元素"冒泡"到末尾 代码实现 void bubbleSort(int arr[], int n) {for (int i 0; i < n-1; i) {for (int j 0; j < n-i-1; j) {if (arr[j] > arr[j1]) {swap(arr[j]…...

git 怎么更改本地的存储的密码

目录 找到控制面板---用户账户---凭证管理器 点击【windows凭据】&#xff0c;选择普通凭据&#xff0c;点击你要修改的地址。点击【编辑】 修改完&#xff0c;点击【保存】​编辑 找到控制面板---用户账户---凭证管理器 点击【windows凭据】&#xff0c;选择普通凭据&#x…...

数据分析预备篇---Pandas的Series

Pandas优势 Pandas优势在于它是构建在NumPy之上的,继承了NumPy高性能的数组计算功能,同时还提供了更多复杂精细的数据处理功能(如缺失值处理、时间序列分析),支持表格型数据(DataFrame)和带标签的一维数据(Series) 安装Pandas Windows操作系统,在菜单栏搜索cmd,进入…...

Kaamel隐私合规洞察:Facebook美容定向广告事件分析

Kaamel隐私合规与数据安全团队分析报告 I. 引言&#xff1a;基于情绪的定向广告指控 A. 事件概述 近期&#xff0c;一则关于Meta&#xff08;前身为Facebook&#xff09;的指控引发了公众对数字隐私和广告伦理的广泛关注。该指控核心内容为&#xff0c;Meta公司涉嫌利用其平台…...

最优化方法Python计算:有约束优化应用——线性可分问题支持向量机

设问题的数据样本点 ( x i , y i ) (\boldsymbol{x}_i,y_i) (xi​,yi​)&#xff0c; x i ∈ R n \boldsymbol{x}_i\in\text{R}^n xi​∈Rn&#xff0c; y i 1 y_i\pm1 yi​1&#xff0c; i 1 , 2 , ⋯ , m i1,2,\cdots,m i1,2,⋯,m。由于标签数据 y i ∈ { − 1 , 1 } y_i\…...

深入解析 I/O 模型:原理、区别与 Java 实践

一、I/O 模型的核心概念 I/O 操作的本质是数据在用户空间&#xff08;应用程序内存&#xff09;和内核空间&#xff08;操作系统内核内存&#xff09;之间的传输。根据数据准备与拷贝阶段的处理方式不同&#xff0c;I/O 模型可分为以下五类&#xff1a; 阻塞 I/O&#xff08;…...

React系列——HOC高阶组件的封装与使用

技巧一&#xff1a;复用组件逻辑 具体而言&#xff0c;高阶组件是参数为组件&#xff0c;返回值为新组件的函数 const EnhancedComponent higherOrderComponent(WrappedComponent);For example: 参数复用 const withSize (Component) > {return class toSize extends C…...

72.编辑距离

编辑距离是指通过删除、插入和替换三种操作&#xff0c;将一个字符串转换为另一个字符串所需的最少操作次数。 首先定义状态&#xff1a;dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少操作数。接下来定义状态转移方程&#xff1a; 如果 word1[i]…...

自适应稀疏核卷积网络:一种高效灵活的图像处理方案

自适应稀疏核卷积网络&#xff1a;一种高效灵活的图像处理方案 引言 在深度学习的大潮中&#xff0c;计算机视觉技术取得了长足的进步。其中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;作为图像处理的核心工具&#xff0c;极大地推动了各类图像识别任务的效果提升。…...

c# UTC 时间赋值注意事项

文章目录 最佳实践:赋值时指定时区问题描述回答关键区别&#xff1a;DateTime.SpecifyKind 的作用​​1. 直接赋值 DateTime.UtcNow.Date​​​​2. 使用 DateTime.SpecifyKind 强制指定​​ 最佳实践:赋值时指定时区 避免 C# 版本默认读取时采用 机器时区问题 如果需要UTC 时间…...

对端服务器重装系统之后远程SSH无法登录的问题

今天遇到一个SSH连接问题特此记录下。 我之前可以从本机使用SSH跳转到其他服务器&#xff0c;今天突然发现无法跳转了&#xff0c;有警告信息&#xff0c;此报错是由于远程的主机的公钥发生了变化导致的&#xff0c;可能是有异常&#xff0c;建议修改认证文件后再次登录。 突然…...

豌豆 760 收录泛滥现象深度解析与应对策略

xinruanj 一、收录泛滥现象的具体表现 当用户在豌豆760 中搜索某类应用时&#xff0c;往往会被数量庞大、功能相似的程序所包围。以图片编辑类应用为例&#xff0c;搜索结果中可能会出现数十款名称相近、图标相似的应用。这些应用不仅在界面设计上缺乏创新&#xff0c;甚至部…...

dockers笔记

docker 和 虚拟机的区别 虚拟机比较笨重&#xff0c;包括操作系统 虚拟化&#xff1a;将物理资源虚拟为逻辑资源 镜像 - 模板 容器 - 实例 docker hub - 分享 和 复用 容器化和dockerfile dockerfile实践 我们想打印一个js语句&#xff0c;如何构建镜像完成这个事情 新建了…...

Angular | 利用 `ChangeDetectorRef` 解决 Angular 动态显示输入框的聚焦问题

在 Angular 应用开发中&#xff0c;实现用户点击按钮后&#xff0c;原地切换显示一个输入框并自动获取焦点的功能&#xff0c;是一个常见的交互模式。例如&#xff0c;搜索图标点击后变为搜索框&#xff0c;用户可以直接输入。然而&#xff0c;由于 Angular 的变更检测和 DOM 更…...

Redis——数据结构

Redis的五种基本数据类型&#xff1a;String、Hash、List、Set、ZSet 结构类型结构存储值结构读写能力String字符串、整数或浮点数对整个字符串或字符串的一部分进行操作&#xff1b;对整数或者浮点数进行自增或自减操作List链表&#xff0c;每个节点上包含一个字符串对链表两…...

通讯录管理系统(IO_序列化和反序列化版)

参照之前文章&#xff0c;也是IO的变版 package day4;import java.io.Serializable;/* 有需求 -- 才去设计类 自定义表示通讯录单条信息的类*/ public class PhoneBookItem implements Serializable {private static final long serialVersionUID 1L;//属性private String na…...

基于RT-Thread的STM32F4开发第三讲——DAC

文章目录 前言一、DAC是什么&#xff1f;二、RT-Thread工程创建三、DAC函数编写1.DAC.c2.DAC.h3.main.c 四、结果测试五、工程分享 前言 本章利用RT-Thread最新的驱动5.1.0开发DAC模块&#xff0c;使用的开发板是正点原子的STM32F4探索者。很多配置和上文重复&#xff0c;本文…...

git cherry-pick和git stash命令详解

git cherry-pick命令 定义 用于将指定的提交(commit)从一个分支"挑选"并应用到当前分支它复制某个提交的更改&#xff08;diff&#xff09;&#xff0c;生成一个新的提交&#xff0c;保留原提交的更改内容&#xff0c;但拥有新的提交ID&#xff08;SHA值&#xff09;…...

MapReduce基本介绍

核心思想 分而治之&#xff1a;将大规模的数据处理任务分解成多个可以并行处理的子任务&#xff0c;然后将这些子任务分配到不同的计算节点上进行处理&#xff0c;最后将各个子任务的处理结果合并起来&#xff0c;得到最终的结果。 工作流程 Map 阶段&#xff1a; 输入数据被…...

正则表达式常用验证(一)

正则表达式(Regular Expression)是一种强大的文本匹配工具,常用于验证字符串的格式。以下是常见的正则表达式验证场景及其对应的表达式: 1. 数字验证 验证纯数字: ^\d+$示例:123、456789 验证固定长度的数字(如 6 位): ^\d{6}$示例:123456 验证数字范围(如 1 到 100…...

基于几何布朗运动的股价预测模型构建与分析

基于几何布朗运动的股价预测模型构建与分析 摘要 本文建立基于几何布朗运动的股价预测模型&#xff0c;结合极大似然估计与蒙特卡洛模拟&#xff0c;推导股价条件概率密度函数并构建动态预测区间。实证分析显示模型在标普500指数预测中取得89%的覆盖概率&#xff0c;波动率估…...

通过SSRF击穿内网!kali-ssrf靶场实战!

目录 1. 靶场拓扑图 2. 判断SSRF的存在 3. SSRF获取本地信息 3.1. SSRF常用协议 3.2. 使用file协议 4. 172.150.23.1/24探测端口 5. 172.150.23.22 - 代码注入 6. 172.150.23.23 SQL注入 7. 172.150.23.24 命令执行 7.1. 实验步骤 8. 172.150.23.27:6379 Redis未授权…...

Yarn-概述

一、YARN 是什么&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09; 是 Apache Hadoop 生态系统中的核心组件&#xff0c;是一个 分布式资源管理和作业调度系统&#xff0c;主要用于协调集群中的计算资源&#xff08;CPU、内存、磁盘、网络等&#xf…...

如何在sheel中运行spark

// 读取文件&#xff0c;得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 将单词进行切割&#xff0c;得到一个存储全部单词的RDD val rdd2 fileRDD.flatMap(line > line.split(" ")) // 将单词转换为元组对象&#xff0…...

销售具备的能力有哪些

销售人员是许多公司业务的开拓者&#xff0c;他们的存在让公司的利益更高。因此&#xff0c;在许多的公司中&#xff0c;销售人员的待遇都非常的高。也因此&#xff0c;有的人看重销售人员的薪资待遇想寻找销售型的工作。但是&#xff0c;相当销售人员还需要具有一定的工作能力…...

React面试常问问题详解

以下是30个React面试中常见的问题及简要解析&#xff0c;涵盖基础概念、核心原理、性能优化、Hooks、状态管理等方面&#xff0c;适用于初中高级开发者准备面试时参考&#xff1a; 一、React 基础与核心概念 React 是什么&#xff1f; React 是由 Facebook 开发的用于构建用户界…...

POM 和关键字驱动区别

一、POM 和关键字驱动的区别以及各自的优势分别是什么&#xff1f; 1、POM 适用于对单个系统封装的自动化框架中&#xff0c;对业务覆盖更精准&#xff1b;   优势&#xff1a;更加便利、维护性更高 2、关键字驱动可以用于对多个业务、多个系统进行封装的自动化框架中&…...

2025年PMP 学习十一 第8章 项目质量管理(8.3)

第8章 项目质量管理&#xff08;8.3&#xff09; 文章目录 第8章 项目质量管理&#xff08;8.3&#xff09;8.3 控制质量1. 定义与作用2.输入、输出&#xff0c;工具和技术3. 数据收集 - 核查表&#xff08;工具与技术&#xff09;4. 数据展示 - 帕雷托图&#xff08;工具与技术…...

【笔记】C++操作mysql及相关配置

目录 使用软件版本信息&#xff1a; 1. C配置mysql相关依赖 1.1 下载 1.2 文件配置 1.3 C编译器配置 2、测试程序 使用软件版本信息&#xff1a; Visual Studio 2022Mysql 8.0C Connector库 8.3.0 可直接在https://download.csdn.net/download/Word_And_Me_/90826524下…...

【MapReduce入门】深度解析MapReduce:定义、核心特点、优缺点及适用场景

目录 1 什么是MapReduce&#xff1f; 2 MapReduce的核心特点 2.1 分布式处理 2.2 容错机制 3 MapReduce的完整工作流程 4 MapReduce的优缺点分析 4.1 优势 4.2 局限性 5 MapReduce典型应用场景 5.1 适用场景 5.2 不适用场景 6 MapReduce与其他技术的对比 7 总结 1…...

EMQX v5.0通过连接器和规则同步数据

1 概述 EMQX数据集成功能&#xff0c;帮助用户将所有的业务数据无需额外编写代码即可快速完成处理与分发。 数据集成能力由连接器和规则两部分组成&#xff0c;用户可以使用数据桥接或 MQTT 主题来接入数据&#xff0c;使用规则处理数据后&#xff0c;再通过数据桥接将数据发…...

JCJC 错别字检测自定义词典 API 接口文档 2025-05-13

JCJC 错别字检测自定义词典 API 接口文档 2025-05-13 JCJC 错别字检测系统自定义词典接口全面开放。企业用户和个人付费用户都可以使用接口方式管理自定义词典。 自定义词典包含&#xff1a; 白名单和黑名单两种类型。 也可以登录个人中心&#xff0c;点击左侧边栏导航以 UI …...

Qt 样式表qss学习

语法 /* 语法结构 */ selector { attribute: value }selector&#xff08;选择器&#xff09; selector&#xff08;选择器&#xff09;&#xff1a;指定要应用样式的控件类型或特定控件。例如&#xff1a; QWidget&#xff1a;所有QWidget及其子类。QPushButton&#xff1a;…...

Linux文件编程——读写结构体、链表等其他类型的数据

在 Linux 文件编程中&#xff0c; open、read、write、close等函数&#xff0c;本质上的读写内容是一个无类型的指针&#xff0c;所以其也可以读写整型、数组、结构体、链表等不同类型的数据。 SYNOPSIS #include <unistd.h>ssize_t write(int fd, const void *buf, siz…...

离散制造企业WMS+MES+QMS+条码管理系统高保真原型全解析

在离散型制造企业的生产过程中&#xff0c;库存管理混乱、生产进度不透明、质检流程繁琐等问题常常成为制约企业发展的瓶颈。为了帮助企业实现全流程数字化管控&#xff0c;我们精心打造了一款基于离散型制造企业&#xff08;涵盖单件生产、批量生产、混合生产模式&#xff09;…...

Datawhale PyPOTS时间序列5月第1次笔记

课程原地址&#xff1a; https://github.com/WenjieDu/PyPOTS&#xff08;Package地址&#xff09; https://github.com/WenjieDu/BrewPOTS/tree/datawhale/202505_datawhale&#xff08;Tutorial地址&#xff09; 2.1 PyPOTS简介 PyPOTS 是一个专为处理部分观测时间序列&a…...

linux 抓包工具tcpdump使用小记(使用时注意权限和系统资源)

tcpdump 是一款强大的网络数据包捕获和分析工具&#xff0c;常用于网络故障排查、协议分析、安全审计等场景。以下是其核心功能、使用方法及常见场景的详细介绍&#xff1a; 1. 基本功能 数据包捕获&#xff1a;监听网络接口&#xff0c;实时捕获传输的数据包。过滤规则&#…...

HTTP和HTTPS模块

一、HTTP 模块 1. 创建 HTTP 服务器 基本服务器示例 const http require(http);const server http.createServer((req, res) > {res.statusCode 200;res.setHeader(Content-Type, text/plain);res.end(Hello World\n); });server.listen(3000, 127.0.0.1, () > {co…...

操作系统导论——第29章 基于锁的并发数据结构

通过锁可以使数据结构线程安全&#xff08;thread safe&#xff09;。当然&#xff0c;具体如何加锁决定了该数据结构的正确性和效率&#xff1f;挑战是&#xff1a; 关键问题&#xff1a;如何给数据结构加锁&#xff1f; 对于特定数据结构&#xff0c;如何加锁才能让该结构功能…...