Kubernetes外部etcd集群的快速Docker Compose 部署
一、背景
在高可用 Kubernetes 部署中,需要单独部署外部 etcd 集群,而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。
二、etcd简介
etcd 是一个高可用的分布式键值存储系统,主要用于存储和管理配置信息、服务发现信息以及其他重要的元数据。etcd 是由 CoreOS 开发的,基于 Raft 共识算法来保证数据的一致性和可靠性。
2.1 etcd 关键特点
- 分布式:etcd 运行在多个节点上,通过 Raft 协议确保数据一致性。
- 高可用性:即使部分节点出现故障,etcd 也能继续提供服务。
- 一致性保证:使用 Raft 协议来确保数据的一致性,支持强一致性读写。
- 键值存储:数据以键值对的形式存储,适合存储配置和元数据。
- 支持事务:支持原子操作,如事务操作来保证数据的正确性。
2.2 etcd 主要功能
- 分布式键值存储:etcd 是一个高可用的分布式键值存储系统,支持高效的键值对存储和读取,并提供强一致性保证。
- 一致性保证:etcd 使用 Raft 协议确保数据一致性,即使部分节点故障,数据仍然保持一致。
- 高可用性:etcd 通过数据复制到多个节点提供高可用性和容错能力,只要大多数节点正常,数据依然可用。
- 事务支持:etcd 支持原子操作和事务,确保对多个键值对的更改安全一致。
- 观察和通知:etcd 支持事件监听和观察功能,客户端可以订阅键值变化,适合动态配置更新。
- 持久化存储:etcd 将数据持久化到磁盘,确保在节点重启或故障时数据不丢失。
- 分布式锁:etcd 提供分布式锁,支持节点间的协调和同步,常用于确保资源唯一性或任务协调。
- 范围查询:etcd 支持对键值对的范围查询,便于批量检索数据。
- API 接口:etcd 提供 HTTP/gRPC API,支持基本的 CRUD 操作、事务和观察功能。
这些功能使 etcd 成为一个强大且可靠的分布式键值存储系统,适合用于需要高一致性和高可用性的场景,特别是在 Kubernetes 这样的集群管理系统中。
2.3 etcd 在 Kubernetes 中使用场景
在 Kubernetes (K8S) 集群中,etcd 扮演着至关重要的角色。它主要用于存储和管理 Kubernetes 的所有集群状态信息和配置数据。以下是 etcd 在 Kubernetes 中的一些关键使用场景:
- 集群状态存储:Kubernetes 的所有集群状态、配置信息、资源定义等都存储在 etcd 中。包括 Pod、Service、ConfigMap、Secret 等对象的状态和配置都被存储在 etcd 中。
- 高可用性配置:提供高可用性和容错能力,保证即使在集群中的一些节点失效的情况下,Kubernetes 也能继续运行和提供服务。
- 数据一致性保证: 使用 Raft 协议确保数据的一致性,这对于 Kubernetes 来说是非常重要的,因为它需要确保所有操作和状态在集群中的一致性。
- 服务发现:Kubernetes 的服务发现机制依赖于 etcd 存储服务的状态和信息。etcd 记录服务的 IP 地址和端口信息,允许其他组件进行服务发现。
- 动态配置管理:Kubernetes 使用 etcd 来管理配置变化,比如部署新的应用版本或调整资源配置。etcd 的事务支持使得配置更改能够被安全地提交和应用。
- 审计和恢复:etcd 的持久化存储允许 Kubernetes 在发生故障或恢复操作时能够重建集群状态。etcd 的备份和恢复机制是确保 Kubernetes 集群数据安全的重要手段。
三、使用docker-compose快速部署etcd
- 参考官方文档:https://github.com/etcd-io/etcd/releases
3.1 etcd单节点部署
PS: 请勿在K8S 集群中的机器上 使用docker-compose 去部署etcd ,可能会存在子网冲突; 在条件允许的情况下,我们还是申请机器去单独部署etcd
3.1.1 环境准备
机器IP | 主机名 | etcd版本 | docker 版本 | docker-compose版本 |
---|---|---|---|---|
172.22.33.213 | etcd | v3.3.8 | 20.10.18 | v2.10.2 |
3.1.2 创建etcd 工作目录,编写docker-compose 文件
- ETCD_NAME 每个节点的 etcd 服务名称
- ETCD_ADVERTISE_CLIENT_URLS 填写每个 etcd 容器所在节点对外提供服务的 IP
- ETCD_INITIAL_ADVERTISE_PEER_URLS 填写每个 etcd 容器所在节点对外提供服务的 IP
- **ETCD_INITIAL_CLUSTER:**ETCD 集群配置包含所有节点的名称和
ETCD_INITIAL_ADVERTISE_PEER_URLS
地址,我这里目前就一个节点 - ETCD_INITIAL_CLUSTER_STATE:
new
: 用于首次创建全新 etcd 集群,节点将根据初始配置启动集群。existing
: 用于扩展、重启或恢复已有的集群,节点将尝试加入现有集群,而不是重新初始化
$ mkdir -p /home/application/etcd/{data,config}$ cat >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.213:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.213:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd=http://172.22.33.213:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=infovolumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridge
EOF
3.1.3 创建并启动 etcd 服务
$ cd /home/application/etcd/
$ docker-compose up -d
$ docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
etcd "/usr/local/bin/etcd" etcd running 0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp
3.1.4 etcd 服务可用性测试
为了测试 etcd 服务的可用性,需要安装 etcd 客户端工具用于验证测试。
$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
$ tar -xf etcd-v3.5.15-linux-amd64.tar.gz
$ cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
$ chmod +x /usr/local/bin/etcdctl#使用 etcdctl 工具快速检查指定的 etcd 节点(或节点集)的健康状态$ etcdctl --endpoints=172.22.33.213:2379 --write-out=table endpoint health+--------------------+--------+------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+--------------------+--------+------------+-------+
| 172.22.33.213:2379 | true | 3.035915ms | |
+--------------------+--------+------------+-------+#使用 etcdctl 工具查看指定 etcd 节点(或节点集)当前的详细状态信息$ etcdctl --endpoints=172.22.33.213:2379 --write-out=table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.22.33.213:2379 | 8e9e05c52164694d | 3.3.8 | 26 MB | true | false | 2 | 659422 | 0 | |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+#使用 etcdctl 工具验证测试 member$ etcdctl --endpoints=172.22.33.213:2379 --write-out=table member list
+------------------+---------+------+-----------------------+---------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+------+-----------------------+---------------------------+------------+
| 8e9e05c52164694d | started | etcd | http://localhost:2380 | http://172.22.33.213:2379 | false |
+------------------+---------+------+-----------------------+---------------------------+------------+# etcdctl 工具验证测试数据读写
$ etcdctl --endpoints=172.22.33.213:2379 put srebro.cn yyds
OK
$ etcdctl --endpoints=172.22.33.213:2379 get srebro.cn
srebro.cn
yyds
3.2 etcd集群部署
PS: 请勿在K8S 集群中的机器上 使用docker-compose 去部署etcd集群 ,可能会存在子网冲突; 在条件允许的情况下,我们还是申请机器去单独部署etcd集群
3.2.1 环境准备
机器IP | 主机名 | etcd版本 | docker 版本 | docker-compose版本 |
---|---|---|---|---|
172.22.33.210 | etcd-01 | v3.3.8 | 20.10.18 | v2.10.2 |
172.22.33.211 | etcd-02 | v3.3.8 | 20.10.18 | v2.10.2 |
172.22.33.212 | etcd-03 | v3.3.8 | 20.10.18 | v2.10.2 |
3.2.2 修改主机名,添加hosts解析
在每台主机上执行
设置主机名:
$ hostnamectl set-hostname etcd-01
$ hostnamectl set-hostname etcd-02
$ hostnamectl set-hostname etcd-03#在所有节点添加hosts:
$ cat >> /etc/hosts << EOF
172.22.33.210 etcd-01
172.22.33.212 etcd-02
172.22.33.212 etcd-03
EOF
3.2.3 创建etcd 工作目录,编写docker-compose 文件
172.22.33.210 etcd-01 主机上
每个节点内容不一样,需要分别编写。
mkdir -p /home/application/etcd/{data,config}cat >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd01- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.210:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.210:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=infovolumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridge
EOF
172.22.33.211 etcd-02 主机上
每个节点内容不一样,需要分别编写。
mkdir -p /home/application/etcd/{data,config}cat >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd02- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.211:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.211:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=infovolumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridge
EOF
172.22.33.212 etcd-03 主机上
每个节点内容不一样,需要分别编写。
mkdir -p /home/application/etcd/{data,config}cat >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'services:etcd:container_name: etcdimage: quay.srebro.site/coreos/etcd:v3.3.8environment:- ETCD_NAME=etcd03- ETCD_DATA_DIR=/var/etcd- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379- ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.212:2379- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster- ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380- ETCD_INITIAL_CLUSTER_STATE=new- ETCD_LOGGER=zap- ETCD_LOG_LeveL=infovolumes:- /home/application/etcd/data:/var/etcd- "/etc/localtime:/etc/localtime:ro"ports:- 2379:2379- 2380:2380restart: alwaysnetworks:default:name: etcd-tierdriver: bridgeEOF
3.2.4 创建并启动 etcd 服务
每台机器依次启动etcd 服务
$ cd /home/application/etcd/
$ docker-compose up -d
$ docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
etcd "/usr/local/bin/etcd" etcd running 0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp
3.2.5 etcd 集群服务可用性测试
为了测试 etcd 集群服务的可用性,需要安装 etcd 客户端工具用于验证测试。
$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
$ tar -xf etcd-v3.5.15-linux-amd64.tar.gz
$ cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
$ chmod +x /usr/local/bin/etcdctl#使用 etcdctl 工具快速检查指定的 etcd 节点(或节点集)的健康状态$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table endpoint health+--------------------+--------+------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+--------------------+--------+------------+-------+
| 172.22.33.210:2379 | true | 3.035915ms | |
| 172.22.33.211:2379 | true | 3.035915ms | |
| 172.22.33.212:2379 | true | 3.035915ms | |
+--------------------+--------+------------+-------+#使用 etcdctl 工具查看指定 etcd 节点(或节点集)当前的详细状态信息$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.22.33.210:2379 | 8e9e05c52164694d | 3.3.8 | 26 MB | true | false | 2 | 659422 | 0 | |
| 172.22.33.211:2379 | 0e95c521fdoi69ac | 3.3.8 | 26 MB | false| false | 2 | 659422 | 0 | |
| 172.22.33.212:2379 | pe9e05dfbrt64680 | 3.3.8 | 26 MB | false| false | 2 | 659422 | 0 | |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+#使用 etcdctl 工具验证测试 member$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table member list
+------------------+---------+------+-----------------------+---------------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+------+-----------------------+---------------------------+------------+
| 8e9e05c52164694d | started | etcd | http://localhost:2380 | http://172.22.33.210:2379 | true |
| 0e95c521fdoi69ac | started | etcd | http://localhost:2380 | http://172.22.33.211:2379 | false|
| pe9e05dfbrt64680 | started | etcd | http://localhost:2380 | http://172.22.33.212:2379 | false|
+------------------+---------+------+-----------------------+---------------------------+------------+# etcdctl 工具验证测试数据读写
$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 put srebro.cn hello
OK
$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 get srebro.cn
srebro.cn
hello
四、kubeadm 使用集群外etcd,部署K8S集群
kubeadm 安装过程省略,直接贴上kubeadm-init.yaml 配置文件;主要查看etcd 那块的配置;
另外需要注意,ETCD 集群 与 apiservice 之间通信,是否采用TLS 加密,我上面部署的etcd集群实则是没有采用TLS 加密的
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: 35sesk.5tm3tqc66tzlse8cttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 172.22.33.220bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/cri-dockerd.sockimagePullPolicy: IfNotPresentname: k8s-master01taints:- effect: NoSchedulekey: node-role.kubernetes.io/master
---
apiServer:certSANs:- kubernetes- kubernetes.default- kubernetes.default.svc- kubernetes.default.svc.cluster.local- 172.22.33.220- 112.11.11.11- k8s.srebro.cntimeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.22.33.220:6443
controllerManager: {}
dns: {}
etcd:external:endpoints:- "http://172.22.33.210:2379"- "http://172.22.33.211:2379"- "http://172.22.33.212:2379"
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.24.9
networking:dnsDomain: cluster.localpodSubnet: 10.244.0.0/16serviceSubnet: 10.96.0.0/12
scheduler: {}
- 不使用TLS 加密 ,需要配置如下内容:
- 如果需要使用TLS 加密 ,需要配置如下内容:
相关文章:
Kubernetes外部etcd集群的快速Docker Compose 部署
一、背景 在高可用 Kubernetes 部署中,需要单独部署外部 etcd 集群,而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。 二、etcd简介 etcd 是一个高可用的分布式键值存储系统,主要用于存储和管理配…...
docker的目录挂载与卷映射
文章目录 一、目录挂载背景定义使用 二、卷映射背景定义区别使用docker对卷的操作 一、目录挂载 背景 上一文,我们提了docker exec进入容器修改页面很麻烦,所以在这里,我们学习一个新的容器使用方法,叫“目录挂载” 定义 长话…...
十三种物联网/通信模块综合对比——《数据手册--物联网/通信模块》
物联网/通信模块 名称 功能 应用场景 USB转换模块 用于将USB接口转换为其他类型的接口,如串口、并口等,实现不同设备之间的通信。 常用于计算机与外部设备(如打印机、扫描仪等)的连接,以及数据传输和设…...
IntelliJ IDEA 中安装和使用通义灵码 AI 编程助手教程
随着人工智能技术的发展,AI 编程助手逐渐成为提升开发效率的强大工具。通义灵码是阿里云推出的一款 AI 编程助手,它能够帮助开发者实现智能代码补全、代码解释、生成单元测试等功能,极大地提升了编程效率和代码质量。 IntelliJ IDEA 是一款广…...
工业 IOT 平台重塑锂电龙头数字化未来
在 “双碳” 目标驱动下,新能源锂电池产业正经历前所未有的扩张期。作为全球原材料领域的龙头企业,某锂电巨头在国内布局的多个生产基地却陷入 “成长的烦恼”:车间里工人忙着手工录入数据,设备运行状态靠纸质报表传递,…...
蓝牙连接hci 命令和事件的交互
参考:在HCI层看蓝牙的连接过程_hci 获取蓝牙pin码-CSDN博客 我这边查看的是core 5.2 一、数据交互流程 1、ACL连接建立后的可选流程 参考蓝牙core5.2: vol2 --> PartF --> 4 1.1 AUTHENTICATION REQUESTED Authentication can be explicitly executed at …...
Maven超级详细安装部署
1.到底什么是Maven?搞清楚这个 Maven 是一个项目管理工具,主要用于 Java 项目的构建、依赖管理和文档生成。 它基于项目对象模型(POM),通过 pom.xml 文件定义项目的配置。 (简单说破:就是工程…...
OSPF不规则区域和LSA
OSPF不规则区域 1.远离骨干的非骨干区域 R1-R4四台路由器能够正常学习到彼此路由,但是R5不行,因为R5是非法ABR 解决方法: 1使用Tunnel隧道将AR4连接到骨干区域 (1) 使用隧道解决不规则区域的问题 a.可能造成选路不…...
深入了解 UI 咨询公司:数字化时代的品牌助推器
在数字化浪潮席卷全球的当下,用户界面(UI)设计已然成为企业在激烈市场竞争中脱颖而出的关键因素。UI 咨询公司应运而生,凭借其专业的知识与技能,为企业的数字化转型和品牌建设提供强大助力。 UI 咨询公司的重要性 提…...
网络建设与运维神州数码DCN sFlow网络流量信息协议
简介 用于监控网络流量信息的协议。 主要操作:由被监视的交换机,路由器把被监控的数据通过采样,统计等操作发送到用于监控的用户端分析器,由分析器对收到的数据进行用户所要求的分析,从而达到监控网络的目的。 各 sFlo…...
NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)
多重背包 多重背包问题有两种解法: 按照背包问题的常规分析⽅式,仿照完全背包,第三维枚举使⽤的个数;利⽤⼆进制可以表⽰⼀定范围内整数的性质,转化成01 背包问题。 ⼩建议:并不是所有的多重背包问题都能…...
vue2添加背景水印-手动实现(无组件模式)
1. App.vue <template><div id"app" class"app"><router-view></router-view></div> </template><script> export default {mounted() {this.updateWatermark();// 监听路由变化this.$router.afterEach(() >…...
华为数通Datacom认证考试难度怎么样?
华为数通Datatcom认证是华为针对数据通信领域推出的技术认证体系,分为HCIA(初级)、HCIP(中级)、HCIE(专家级)三个等级,考试难度逐级递增,对考生的理论知识和实践能力…...
一文读懂WPF系列之常用控件以及样式
WPF控件 控件分类概览常用控件常用控件代码示例和效果 样式与模板应用样式定义方式行内样式页面/窗口级资源样式(Local Resource)应用程序全局资源独立资源字典(ResourceDictionary)控件模板(ControlTemplate&…...
代码随想录算法训练营第十四天
LeetCode题目: 513. 找树左下角的值112. 路径总和106. 从中序与后序遍历序列构造二叉树 其他: 今日总结 往期打卡 513. 找树左下角的值 跳转: 513. 找树左下角的值 学习: 代码随想录公开讲解 问题: 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边…...
国产信创数据库:PolarDB 分布式版 V2.0,支持集中分布式一体化
阿里云PolarDB数据库管理软件(分布式版)V2.0 ,安全可靠的集中分布式一体化数据库管理软件。点此查看详情https://www.aliyun.com/activity/database/polardbx-v2?spma2c6h.13046898.publish-article.8.44146ffaE0lEWT 立即咨询专家…...
【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本+制作1图2图6图
背景需求: 我觉得这个代码里面的输入信息分离太远(42行和241行),想重新优化一下 【教学类-102-05】蛋糕剪纸图案(留白边、沿线剪)04——Python白色(255)图片转为透明png再制作“点状边框和虚线边框”-CSDN博客文章浏览阅读864次,点赞14次,收藏27次。【教学类-102-0…...
基于VSCode的Qt开发‘#include ui_test.h’报错没有该文件
笔者在基于VSCode进行Qt开发时,test.ui文件是在Qt软件中绘制的,导致本项目无法使用这个ui文件,报错如标题。事实上,本工程中也确实没有生成这个头文件。出现这个错误的原因是ui文件没有被编译为c头文件。 要生成 ui_test.h 文件&…...
微信小程序跳2
// 图片压缩 compressImage (image {}, options {}) { return new Promise((resolve, reject) > { const { width 0 } image const { compressAfterSizeFlag false, scaleFlag false, scaleTargetWidth 768 } options // 超过100k压缩 const maxFileSizeLimit 100 …...
如何将excel数据快速导入数据库
最近老是收到一些手工数据,并且需要关联分析,就想到如何快速将数据导入数据库后关联查询输出结果,下面是一段将excel数据写入mysql的脚本,欢迎大家提出优化意见相互学习。 import os import pandas as pd import pymysql import …...
C++之多态
文章目录 一、多态的概念 多态的定义与类型 二、多态的实现 三、虚函数 虚函数的概念 虚函数的重写/覆盖 协变 析构函数的重写/覆盖 override,final关键字 override final 纯虚函数与抽象类 三个概念辨析 四、多态实现的原理 虚函数表指针 动态绑定与静态绑定 …...
从PDF中提取表格:以GB/T2260—2007为例
文章目录 先说结论前因后果思路1、PDF2CSV2、PDF2MD → MD2CSV3、针对不同表格的两种思路1) 竖形三线表2)五元素为一组 还没结束批量处理1、分割markdown文档2、跳过另一种格式的文档 总结一下 先说结论 结论就是,博主用了一天的时间去研究如…...
日常记录-群晖nas的docker注册表被墙,用Mac电脑的docker拉取镜像并安装到nas中
文章目录 前言一、拉取镜像二、安装到nas中总结 前言 群晖nas的docker注册表被墙,用Mac电脑的docker拉取镜像并安装到nas中 一、拉取镜像 群晖nas的架构师x86,Mac电脑的架构师arm。 在mac电脑中执行命令: # 镜像拉取 docker pull --platf…...
DeepSeek:重构办公效率的AI新范式
目录 一、效率跃迁的三重引擎 二、效率提升的量级突破 三、智能办公的范式转移 四、未来办公的效率奇点 当企业主面对堆积如山的文件审批、跨时区协作的沟通损耗、重复机械的数据整理时,是否想过这些场景正在吞噬团队的生产力?据麦肯锡研究显示&…...
AI小程序+SpringAI+管理后台+源码+支持动态添加大模型+支持动态添加AI应用
前言 今天给大家介绍一款 前端由uniapp开发的小程序,完美在小程序上运行,对话采用流式对话。后端由springbootspringai开发的应用软件源码。 功能简介 支持在管理后台动态新增“DeepSeek”,“openai”,“千帆”,“智…...
RAG的实现快速示例
RAG(Retrieval-Augmented Generation)其实就是结合了检索与生成,核心流程分为 检索(Retrieval) 和 生成(Generation) 两大阶段,通过外部知识库增强生成式模型的准确性和可靠性。 流程其实也很简单,如下图: 关于RAG的基本概念的介绍,可以参考: RAG(检索增强生成)快…...
利用 PHP 爬虫获取京东商品详情 API 返回值说明及代码示例
在电商领域,京东作为国内知名的电商平台,提供了丰富的商品信息。通过调用京东商品详情 API,我们可以获取商品的详细信息,如商品标题、价格、图片、描述等。这些信息对于数据分析、价格监控、商品推荐等场景具有重要价值。本文将详…...
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
在深度学习工程实践中,当训练大型模型或处理大规模数据集时,上述错误信息对许多开发者而言已不陌生。这是众所周知的 CUDA out of memory错误——当GPU尝试为张量分配空间而内存不足时发生。这种情况尤为令人沮丧,特别是在已投入大量时间优化…...
大模型基础知识扫盲
1 模型量化: 是什么:大模型量化是一种“压缩”技术,把模型里高精度的数字(比如32位浮点数)简化成低精度的数字(比如8位定点数)。 有什么用:它让模型占的空间更小,跑起来…...
《穿透表象,洞察分布式软总线“无形”之奥秘》
分布式系统已成为众多领域的关键支撑技术,而分布式软总线作为实现设备高效互联的核心技术,正逐渐走入大众视野。它常被描述为一条“无形”的总线,这一独特属性不仅是理解其技术内涵的关键,更是把握其在未来智能世界中重要作用的切…...
Python Cookbook-5.13 寻找子序列
任务 需要在某大序列中查找子序列。 解决方案 如果序列是字符串(普通的或者Unicode),Python 的字符串的 find 方法以及标准库的re模块是最好的工具。否则,应该使用Knuth-Morris-Pratt算法(KMP): def KnuthMorrisPratt(text,pattern): 在序列text中找…...
(自用)蓝桥杯准备(需要写的基础)
要写的文件 led_app lcd_app key_app adc_app usart_app scheduler LHF_SYS一、外设引脚配置 1. 按键引脚 按键引脚配置如下: B1:PB0B2:PB1B3:PB2B4:PA0 2. LCD引脚 LCD引脚配置如下: GPIO_Pin_9 /* …...
STM32Cubemx-H7-14-Bootloader(上)-ST和串口烧录
前言 本文主要研究,如果把ST单片机的SWDIO和SWDCLK引脚改成推挽输出后,我们又应该怎么重新烧录,以及如何使用串口下载。 当没有设置STlink烧录为引脚或者设置成其他功能的时候 如果想恢复,那么就在烧录之前,一直按住…...
“深入浅出:Java中的Lambda表达式及其应用“
前言 Lambda表达式是Java 8引入的一项强大特性,它允许以更加简洁的方式表示匿名函数。Lambda表达式不仅让代码更加简洁、清晰,而且为函数式编程提供了有力支持,从而提升了Java语言的表达能力。 在本文中,我们将深入浅出地探讨La…...
6.1es新特性解构赋值
解构赋值是 ES6(ECMAScript 2015)引入的语法,通过模式匹配从数组或对象中提取值并赋值给变量。: 功能实现 数组解构:按位置匹配值,如 let [a, b] [1, 2]。对象解构:按属性名匹配值,…...
【从0到1学RabbitMQ】RabbitMQ高级篇
学完基础篇之后我们对用户下单这个业务进行了改造,我们可以吧用户支付这个业务抽出来,放入队列当中去执行。如下图: 但是这里我们思考一下,如果MQ通知失败了,支付服务中支付流水显示支付成功,而交易服务中…...
200 smart pid
PID整定控制面板-S7-200 SMART 跟我学/跟我做之PID功能-系列课程-西门子1847工业学习平台官网 使用西门子200SMART进行PID调节 PID自整定 PID调节技巧_哔哩哔哩_bilibili S7-200 SMART PID PID常见问题...
AI制作PPT,如何轻松打造高效演示文稿
AI制作PPT,如何轻松打造高效演示文稿!随着信息化时代的到来,PPT已经成为了几乎所有职场人士、学生、讲师的必备工具。每个人都希望自己的PPT既有创意,又能高效展示信息。而在如今的科技背景下,AI的出现彻底改变了PPT的…...
如何用postman做接口自动化测试?
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 本文适合已经掌握 Postman 基本用法的读者,即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本࿱…...
day29-贪心__134. 加油站__135. 分发糖果__860.柠檬水找零__406.根据身高重建队列
134. 加油站 这道题的贪心方法相当的巧妙。 首先,我们可以通过gas[i] - cost[i]得到第i个站点的净加油量(耗油量),那么如果我们现在考虑一个从某点a到某点b,那么如果a-》b范围之间的gas[i] - cost[i]存在负数,那么说明无法从a作…...
聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作
在多线程编程中,线程之间的同步和通信是一个常见的需求。例如,我们可能需要一个子线程完成某些任务后通知主线程,并由主线程执行特定的动作。本文将基于一个示例程序,详细讲解如何使用 AutoResetEvent 来实现这种场景。 示例代码…...
C# 组件的使用方法
类 Stopwatch 计算时间 Stopwatch sw new Stopwatch(); sw.Start(); // 要执行的代码块 Thread.Sleep(2000);sw.ElapsedMilliseconds // 消耗时间 Console.WriteLine(sw.ElapsedMilliseconds);组件 ListView 属性设置 外观 - View - Details 行为 - Columns -(…...
Python常用排序算法
1. 冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的元素,如果他们的顺序错误就交换他们。 def bubble_sort(arr):# 遍历所有数组元素for i in range(len(arr)):# 最后i个元素是已经排序好的for j in range(0, …...
HTML5 服务器发送事件(Server-Sent Events)
1. 引言 HTML5 服务器发送事件(Server-Sent Events,SSE)是一种基于 HTTP 的服务器推送技术,允许服务器主动向客户端(如浏览器)发送实时更新。SSE 适用于单向通信场景,如新闻推送、实时价格更新…...
【C++游戏引擎开发】第12篇:GLSL语法与基础渲染——从管线结构到动态着色器
一、OpenGL渲染管线解密 1.1 OpenGL渲染管线流程图 #mermaid-svg-GrAgLUat95CVZKm0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GrAgLUat95CVZKm0 .error-icon{fill:#552222;}#mermaid-svg-GrAgLUat95CVZKm0 .e…...
阿里云负载均衡可以抗ddos吗
本文深度解析阿里云负载均衡的DDoS防护机制,通过实测数据验证其基础防御能力边界,揭示需结合云盾高防IP实现TB级流量清洗的工程实践。结合2023年Memcached反射攻击事件,提供混合云架构下的多层级防御方案设计指南。 云原生负载均衡的基础防护…...
动手学习:路径规划原理及常用算法
一、路径规划的基本原理 路径规划(Path Planning)是机器人导航的核心任务,目标是为机器人找到一条从起点到终点的无碰撞路径,同时满足约束条件(如最短路径、最优能耗、安全性等)。在人形机器人场景中&…...
Web前端性能指标Web3D性能优化
性能指标&评估方式 在Web3D性能优化之前,先了解性能指标&评估方式 前端性能指标评估与监测工具可分为以下几类,结合不同场景和需求,开发者可选择适合的工具进行性能优化: 一、浏览器内置工具 Chrome DevTools Performance 面板:记录运行时性能,分析CPU、内存使…...
Mujoco xml <option>
xml option option总起例子timestep(一般会用到)gravity(一般会用到)windmagneticdensityviscosityo_margino_solref, o_solimpo_frictionintegrator(一般会用到)cone(一般会用到)jacobian(一般会用到)solver(一般会用到)iterations(一般会用到)tolerance(一般会用到)noslip_it…...
如何用 nvm alias default 18.20.8 实现全局 Node.js 版本管理?一篇保姆级指南!!!
📝 如何用 nvm alias default 18.20.8 实现全局 Node.js 版本管理?一篇保姆级指南 🚀 1. 核心命令解析 🔍 nvm alias default 18.20.8 是 nvm 管理工具中用于设置全局默认 Node.js 版本的核心命令。它的作用是将指定版本锁定为所…...