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

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中,确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。

在这个全面的教程中,我们将深入研究etcd,这是一个开源的分布式键值存储。我们将探索其基本概念、特性和用例,并提供一个动手快速入门指南。最后,我们将把etcd与其他几个分布式键值存储进行比较,以了解它的优势和独特之处。

分布式KV存储

分布式键值存储是一种NoSQL数据库,它将数据存储为跨多个物理机或虚拟机的键值对。这种分布本质上增强了可伸缩性、容错性和性能。此外,每个数据(值)都与唯一标识符(键)相关联。该模型对于某些用例非常高效,例如缓存、配置管理和快速数据检索。

Apache Zookeeper、Consul和Redis是一些提供可靠键值存储的例子。

分布式键值存储是许多分布式系统的支柱,为存储和检索数据提供了简单而强大的机制。

下面是分布式键值存储的一些重要特点:

  • 简单性:包含键值对的基本数据结构,使其易于理解和用于特定类型的应用程序。
  • 可伸缩性:系统通过跨多个节点分配工作负载来高效处理不断增长的数据量和负载。
  • 可靠性:它们确保数据一致性、容错性和可伸缩性。
  • 性能:键值机制提供对数据的快速有效访问。此外,通过将其分布在多个节点上,减少单个机器上的负载。
  • 分布式:由于数据分布在多个节点上,因此性能得到了增强。

分布式键值存储已在各种场景中得到实际应用,例如配置管理、缓存、会话存储、服务发现、主节点选举等。

Etcd简介

Etcd是一个分布式的、可靠的键值存储,用于存储分布式系统中最关键的数据。它是一种简单、安全、快速和可靠的键值存储,专为分布式系统的配置管理、服务发现和协调而设计。

Etcd是由CoreOS团队开发的,现在是CNCF(云原生计算基金会)项目,它提供了一个可靠的分布式数据存储,可以在动态和可扩展的环境中协调配置和发现服务。

Etcd丰富的特性集使其成为分布式系统的通用且可靠的选择,为云原生环境中的配置管理、服务发现和协调提供了必要的构建块。在某些情况下,它可以达到每秒10,000次写。
在这里插入图片描述

让我们来了解一下它的一些主要特性:

  • HTTP/gRPC API: etcd提供HTTP和gRPC API,使其可与各种编程语言进行访问和互操作,并轻松集成到不同类型的应用程序和框架中。

  • 分布式一致性:它在分布式设置中保持强一致性,确保集群中的所有节点具有一致的数据视图。

  • 高可用性:etcd设计为高可用性,具有自动领导选举和故障转移机制。因此,etcd集群即使面对节点故障也能保持运行,有助于提高系统的弹性。

  • 支持监听机制:etcd支持强一致性监听机制,允许应用程序实时监视特定键值存储的更改。

  • 原子事务:它支持原子事务,允许将多个键值操作组合在一起并作为单个原子单元执行,从而维护数据一致性。

  • 租约管理:etcd引入了租约的概念,允许键具有相关的生存时间(TTL)值,从而在指定的期限之后自动删除它们。

  • 基于角色的访问控制(RBAC):支持RBAC,允许管理员为与集群交互的用户和应用程序定义角色和权限。

  • 快照和备份:提供了创建集群状态快照的机制,并支持备份和恢复过程。因此,它确保了灾难恢复和数据持久性。

  • 可插拔存储后端:etcd提供了一个可插拔的存储后端,允许用户选择最适合他们需求的底层存储引擎(例如,etcd的默认存储引擎,LevelDB,或RocksDB)。因此,它提供了灵活性,并允许基于特定用例和性能考虑进行优化。

  • 与Kubernetes集成:etcd是Kubernetes中的一个关键组件,作为配置和状态信息的主要数据存储。这使得etcd成为容器编排的核心部分,确保分布式系统可以有效地管理配置和扩展。

  • etcdctl:这是命令行客户端工具,用于与etcd集群进行交互和管理。

与etcd类似的解决方案还有:Apache ZooKeeper和Consul等,实际选择取决于具体的项目需求。

etcd由于其简单性和云原生计算基金会(CNCF)的支持,适合Kubernetes这样的云原生环境。Apache ZooKeeper是大规模部署的强大选择,它提供了强大的一致性,但也带来了额外的复杂性。另一方面,Consul以简单和有效的服务发现而闻名,它与HashiCorp堆栈无缝集成。

安全性、易用性和集成需求在决策过程中扮演着关键角色。每种工具都有其优势,因此根据所需的特性和用例做出明智的选择对我们来说是至关重要的。

安装与配置

让我们了解如何配置和设置etcd以使其运行。etcd兼容Linux发行版,如Ubuntu、CentOS和Windows。这里以Ubuntu为示例进行安装,其他系统可以参考官方文档:

$ sudo apt update
$ sudo apt install etcd
$ etcd --verisonetcd Version: 3.3.25
Git SHA: Not provided (use ./build instead of go build)
Go Version: go1.18.1
Go OS/Arch: linux/amd64

我们有多钟方式配置etcd,本文采用配置文件方式,我们将创建具有基本设置的配置文件。

etcd配置文件是一个YAML文件,其中包含用于配置etcd节点行为的设置和参数。这个文件对于定制etcd的各个方面非常重要,比如网络设置、集群信息、身份验证和存储选项。让我们来看一个例子:

# Example etcd-config.yml
# Node name, a unique identifier, in the etcd cluster
name: node-1# Data directory where etcd will store its data
data-dir: /var/lib/etcd/default.etcd# Listen addresses for client communication
listen-client-urls: http://127.0.0.1:2379,http://<NODE-IP>:2379# Advertise addresses for client communication
advertise-client-urls: http://<NODE-IP>:2379# Listen addresses for peer communication
listen-peer-urls: http://<NODE-IP>:2380# Advertise addresses for peer communication
initial-advertise-peer-urls: http://<NODE-IP>:2380# Initial cluster configuration
initial-cluster: node-1=http://<NODE-IP>:2380,node-2=http://<NODE-IP>:2380# Unique token for the etcd cluster
initial-cluster-token: etcd-cluster-1# Initial cluster state (new, existing, or standby)
initial-cluster-state: new# Enable authentication with a shared secret token
auth-token: "some-secret-token"# Enable authorization with RBAC
enable-authorization: true# Enable automatic compaction of the etcd key-value store
auto-compaction-mode: periodic
auto-compaction-retention: "1h"# Secure communication settings (TLS)
client-transport-security:cert-file: /etc/etcd/server.crtkey-file: /etc/etcd/server.keyclient-cert-auth: truetrusted-ca-file: /etc/etcd/ca.crtpeer-transport-security:cert-file: /etc/etcd/peer.crtkey-file: /etc/etcd/peer.keyclient-cert-auth: truetrusted-ca-file: /etc/etcd/ca.crt

1. 节点相关基础配置

  • name

    含义:指定节点在 etcd 集群中的名称,它是集群内该节点的唯一标识符。在集群通信、识别等场景中起到关键作用,便于区分不同节点。

    示例中值node-1,表示这个节点的名称为 node-1,如果集群中有多个节点,其他节点就会通过这个名称来识别它。

  • data-dir

    含义:定义了 etcd 存储其数据的目录路径。etcd 在运行过程中会将诸如键值对数据、集群相关的元数据等信息存储在此目录下,需要确保对应的目录有合适的读写权限。

    示例中值/var/lib/etcd/default.etcd,表明数据会存储在该指定路径下。

2. 客户端通信相关配置

  • listen-client-urls

    含义:指定 etcd 节点监听客户端连接请求的地址列表。客户端通过这些地址来与 etcd 节点进行交互,比如发送读写键值对的请求等。可以配置多个地址,通常包含本地回环地址(如 127.0.0.1)方便本地测试,以及对外暴露的节点 IP 地址(<NODE-IP> 处需替换为实际节点可访问的 IP)。

    示例中值http://127.0.0.1:2379,http://<NODE-IP>:2379,意味着客户端既可以通过本地回环地址 127.0.0.12379 端口,也可以通过节点实际 IP 对应的 2379 端口与该 etcd 节点通信。

  • advertise-client-urls

    含义:对外宣告给客户端的用于连接该 etcd 节点的地址。客户端实际使用这些地址来发起请求,一般来说就是节点可被外部访问到的地址,和 listen-client-urls 中的对外地址部分通常是对应的。

    示例中值http://<NODE-IP>:2379,告知客户端通过这个节点 IP 和 2379 端口来连接此 etcd 节点进行操作。

3. 节点间(对等体)通信相关配置

  • listen-peer-urls

    含义:设置 etcd 节点监听其他节点(对等体)连接请求的地址,用于集群内节点之间互相通信、同步数据、选举等集群相关操作,指定的端口(通常是 2380)区别于客户端通信端口。

    示例中值http://<NODE-IP>:2380,表示节点会在自身的这个 IP 和 2380 端口上监听来自其他节点的连接。

  • initial-advertise-peer-urls

    含义:在集群初始化阶段,向其他节点宣告自己用于对等通信的地址,方便其他节点能准确找到并与之建立连接,进行数据交互等集群协作操作。

    示例中值http://<NODE-IP>:2380,同样是用节点 IP 和 2380 端口来宣告给其他节点用于对等通信。

4. 集群初始化相关配置

  • initial-cluster

    含义:定义了集群初始的节点配置情况,格式为 节点名称=节点对等通信地址 的形式,多个节点用逗号分隔。在集群启动初始化时,各节点依据此配置来发现并连接其他节点,构建起集群的初始拓扑结构。

    示例中值node-1=http://<NODE-IP>:2380,node-2=http://<NODE-IP>:2380,表明初始集群包含名为 node-1node-2 的两个节点,并且给出了它们用于对等通信的地址,后续节点会按照此信息去相互连接组成集群。

  • initial-cluster-token

    含义:为 etcd 集群提供唯一的标识令牌。主要用于区分不同的集群,特别是在多个集群存在于同一网络环境等场景下,避免节点误加入到错误的集群中,保证集群的独立性和唯一性。

    示例中值etcd-cluster-1,此为这个 etcd 集群的唯一标识。

  • initial-cluster-state

    含义:指定集群的初始状态,有 new(新创建集群)、existing(加入已存在的集群)、standby(备用状态,比如用于容灾切换等场景)等选项。这里配置为 new 表示要初始化创建一个全新的 etcd 集群。

    示例中值new,表明当前配置是用于启动新的 etcd 集群。

5. 安全认证与授权相关配置

  • auth-token

    含义:用于启用基于共享秘密令牌的身份验证机制。客户端在与 etcd 节点交互时,需要提供这个对应的秘密令牌来证明自己的身份,增强集群访问的安全性。

    示例中值"some-secret-token",这就是集群中使用的共享秘密令牌,实际使用中要妥善保管该值。

  • enable-authorization

    含义:设置是否启用基于角色的访问控制(RBAC)授权机制。启用后,可以通过配置不同的角色、权限规则等来控制哪些用户(或客户端)能够对哪些键值对资源进行何种操作(如读、写等),进一步细化访问控制,提升安全性。

    示例中值true,表示在该 etcd 集群中启用 RBAC 授权机制。

6. 数据自动压缩相关配置

  • auto-compaction-mode

    含义:定义 etcd 键值存储的自动压缩模式,periodic 表示按照一定的时间周期来自动触发压缩操作,以清理过期的、冗余的数据版本等,节省存储空间,优化存储性能。

    示例中值periodic,采用周期性自动压缩的模式。

  • auto-compaction-retention

    含义:配合自动压缩模式,指定数据保留的时长,示例中 1h 表示保留最近一小时的数据版本,超过这个时间范围的数据版本会在自动压缩时被清理掉,具体时长可根据实际需求和存储资源等情况进行调整。

    示例中值1h,即按一小时来设定数据保留期限用于自动压缩。

7. 安全通信(TLS)相关配置

  • client-transport-security 部分

    cert-file:指定客户端与 etcd 节点通信时,节点使用的证书文件路径。该证书用于向客户端证明节点的身份合法性,基于 TLS 机制保障通信安全。

    示例中值/etc/etcd/server.crt,是节点对应的服务器证书文件所在路径。

    key-file:定义节点私钥文件的路径,私钥与证书配合使用,用于在 TLS 加密通信中进行解密、签名等操作,确保通信的安全性和数据完整性。

    示例中值/etc/etcd/server.key,指明了节点私钥文件存放位置。

    client-cert-auth:设置是否启用客户端证书认证。若为 true,则客户端在连接 etcd 节点时也需要提供有效的证书来证明自己身份,进一步增强客户端到节点通信的安全性。

    示例中值true,表示启用客户端证书认证机制。

    trusted-ca-file:指定信任的证书颁发机构(CA)的证书文件路径。节点通过此 CA 文件来验证客户端证书是否合法,判断客户端是否可信,构建起完整的证书信任链体系用于安全通信。

    示例中值/etc/etcd/ca.crt,即信任的 CA 证书文件所在路径。

  • peer-transport-security 部分

    这部分配置与 client-transport-security 类似,不过它主要针对的是集群内节点之间(对等体)通信的安全保障,各个参数(如 cert-filekey-fileclient-cert-authtrusted-ca-file)含义与客户端通信安全配置对应参数一致,只是作用于节点间通信场景,确保节点间通信的保密性、完整性和身份验证等安全需求。

最后,我们应该确保根据特定的需求和安全考虑来定制配置文件。编辑完文件后,我们可以重新启动etcd服务以使更改生效。

启动etcd与交互

我们可以使用以下命令启动指定配置的etcd:

$ ./etcd --config-file=etcd-config.yml

此外,我们可以使用etcdctl命令行工具与etcd交互,该工具是为与etcd集群交互和管理而设计的。它便于管理员和开发人员直接从命令行在etcd集群上执行各种操作。让我们用几个例子来理解:

# 存储值
$ etcdctl put mykey "Hello, etcd!"# 获取值
$ etcdctl get mykey
mykey
Hello, etcd!
# 监听值
$ etcdctl watch mykey

在etcd中观察键允许我们接收有关键更改的实时通知,无论值被修改还是键被删除。Watch事件提供有关更改性质的详细信息,使应用程序能够动态地对etcd键值存储中的更新作出反应。

重要的是要注意,监视键并不能防止它被删除。监听是用来观察变化的机制,而不是用来控制或限制变化的。最后,我们可以使用以下命令检查etcd集群的健康状况:

$ etcdctl endpoint health

如果我们使用的是安全的etcd集群,那么我们可能需要提供额外的身份验证和安全选项,例如在检查运行状况时指定-cacert、-cert和-key标志以指向证书和密钥文件。

etcd 开发示例

golang示例

首先确保已经安装了 go.etcd.io/etcd/clientv3 库,示例代码如下:

package mainimport ("context""fmt""go.etcd.io/etcd/clientv3""time"
)func main() {// 配置客户端连接参数client, err := clientv3.New(clientv3.Config{Endpoints:   []string{"127.0.0.1:2379"}, // etcd服务端地址,可按需修改DialTimeout: 5 * time.Second,})if err!= nil {fmt.Printf("连接etcd失败:%v\n", err)return}defer client.Close()// 写入键值对到etcdctx, cancel := context.WithTimeout(context.Background(), time.Second)_, err = client.Put(ctx, "my-key", "my-value")cancel()if err!= nil {fmt.Printf("写入数据到etcd失败:%v\n", err)return}// 从etcd读取键值对ctx, cancel = context.WithTimeout(context.Background(), time.Second)resp, err := client.Get(ctx, "my-key")cancel()if err!= nil {fmt.Printf("从etcd读取数据失败:%v\n", err)return}for _, ev := range resp.Kvs {fmt.Printf("键:%s,值:%s\n", ev.Key, ev.Value)}
}

简要解释代码如下:

连接 etcd:通过 clientv3.New 方法,按照配置的连接端点(示例中是本地 127.0.0.1:2379)和超时时间来创建与 etcd 服务端的客户端连接。如果连接失败,会打印错误信息并退出程序。

写入键值对:使用 client.Put 方法向 etcd 中写入一个键为 my-key,值为 my-value 的键值对,操作设置了超时控制,通过 context 来管理操作的生命周期。

读取键值对:调用 client.Get 方法从 etcd 中读取键为 my-key 的键值对,同样设置了超时,读取成功后遍历返回结果并打印出键和值。

Rust示例

在cargo.toml中增加依赖

[dependencies]
etcd-client = "0.12"

rust与etcd交互代码:

use etcd_client::{Client, Error};
use std::time::Duration;#[tokio::main]
async fn main() -> Result<(), Error> {// 连接etcd服务端let client = Client::connect(vec!["http://127.0.0.1:2379"], Some(Duration::from_secs(5))).await?;// 写入键值对到etcdclient.put("my-rust-key", "my-rust-value", None).await?;// 从etcd读取键值对let resp = client.get("my-rust-key", None).await?;for kv in resp.kvs() {println!("键:{},值:{}", kv.key_str()?, kv.value_str()?);}Ok(())
}

需要注意的是,这些示例只是最基础的操作演示,在实际应用中你可以根据具体需求进一步扩展功能,比如处理更复杂的事务、使用租约、实现分布式锁等基于 etcd 的高级功能。同时,确保 etcd 服务已经正确启动并能被访问到,且相应的网络配置(如端口等)是准确的。

总结

在本文中,我们全面地探讨了etcd,讨论了它的基本概念、关键特性和实际应用。快速入门指南将帮助我们快速设置etcd并以编程方式与之交互。此外,与其他分布式键值存储的比较突出了etcd的独特优势,使其成为各种分布式系统场景的可靠选择。

了解分布式可靠的键值存储、分布式系统中数据的重要性以及etcd的功能,将有助于我们在设计和实现分布式应用程序时做出明智的决策。最后,作为许多分布式系统的骨干,etcd的简单性、一致性和高可用性使其成为开发人员在复杂的分布式环境中有价值的工具。

相关文章:

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中&#xff0c;确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中&#xff0c;我们将深入研究etcd&#xff0c;这是一个开源的分布式键值存储。我们将探索其基本概念、特…...

dataTable

在 C# 中&#xff0c;DataTable 是 .NET Framework 中用于处理数据表格的一个类&#xff0c;属于 System.Data 命名空间。它是一种内存中表示数据表的结构&#xff0c;通常用于临时存储和操作数据&#xff0c;类似于数据库中的表。DataTable 的主要特点是行列结构&#xff0c;其…...

Flink学习连载文章11--双流Join

双流 Join 和两个流合并是不一样的 两个流合并&#xff1a;两个流变为 1 个流 union connect 双流 join: 两个流 join&#xff0c;其实这两个流还是原来的&#xff0c;只是满足条件的数据会变为一个新的流。 可以结合 sql 语句中的 union 和 join 的区别。 在离线 Hive 中&…...

RayLink远程控制技术助力教育领域的创新应用研究

远程控制技术在教育领域的应用确实改变了传统教学模式。想象一下&#xff0c;无论身处何地&#xff0c;只要有网络连接&#xff0c;就能通过远程软件加入课堂&#xff0c;这种体验是不是很吸引人&#xff1f;虽然远程控制听起来很技术化&#xff0c;但别担心&#xff0c;小编今…...

【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器(非直接运行图形库)

【Qt移植LVGL】QWidget手搓LVGL软件仿真模拟器&#xff08;非直接运行图形库&#xff09; 打包开源地址&#xff1a; Qt函数库gitee地址 更新以gitee为准 移植后的demo工程&#xff1a; gitee 有些没实现的 后续我会继续优化 文章目录 别碰瓷看清楚&#xff1a;是移植&#…...

PostgreSQL UNION 操作符

PostgreSQL UNION 操作符 引言 PostgreSQL 是一种功能强大的开源对象关系型数据库管理系统,它以其稳定性、可靠性和先进的特性而闻名。在处理数据库查询时,我们经常需要合并来自不同表的数据,或者合并同一表的不同查询结果。这时,UNION 操作符就变得非常有用。本文将详细…...

spring boot 测试 mybatis mapper类

spring boot 测试 mybatis mapper类 针对 mybatis plus不启动 webserver指定加载 xml 【过滤 “classpath*:/mapper/**/*.xml” 下的xml】, mapper xml文件名和mapper java文件名称要一样&#xff0c;是根据文件名称过滤的。默认情况加载和解析所有mapper.xml 自定义 MapperT…...

Python发kafka消息

要在Python中向Kafka发送消息&#xff0c;你可以使用kafka-python库。首先&#xff0c;你需要安装这个库。如果你还没有安装它&#xff0c;可以通过pip来安装&#xff1a; bash pip install kafka-python 接下来是一个简单的例子&#xff0c;展示如何创建一个生产者&#xff0…...

zipkin 引申一:如何遍历jar目录下的exec.jar并选择对应序号的jar启动

文章目录 一、Zipin概述二、如何下载三、需求描述四、代码实现1. pom设置2. 相关工具类3. 核心代码 五、打包部署1. 打包&#xff0c;在项目目录执行mvn clean package2. 部署3. 运行以及停止 六、源码放送 一、Zipin概述 Zipkin是Twitter开源的分布式跟踪系统&#xff0c;基于…...

使用 httputils + protostuff 实现高性能 rpc

1、先讲讲 protobuf protobuf 一直是高性能序列化的代表之一&#xff08;google 出品&#xff09;。但是用起来&#xff0c;可难受了&#xff0c;你得先申明 “.proto” 配置文件&#xff0c;并且要把这个配置文件编译转成类。所以必然要学习新语法、新工具。 可能真的太难受…...

Facebook广告文案流量秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密&#xff01; 一、广告文案怎么写&#xff1f; 正文&#xff1a;这是帖子的正文&#xff0c;出现在您姓名的正下方。它可…...

在Vue.js中生成二维码(将指定的url+参数 生成二维码)

在Vue.js中生成二维码&#xff0c;你可以使用JavaScript库如qrcode或qr.js。以下是一个简单的例子&#xff0c;展示如何在Vue组件中使用qrcode库将指定的URL加上参数生成二维码。 首先&#xff0c;你需要安装qrcode库。如果你使用的是npm或yarn&#xff0c;可以通过命令行安装…...

Face2QR:可根据人脸图像生成二维码,还可以扫描,以后个人名片就这样用了!

今天给大家介绍的是一种专为生成个性化二维码而设计的新方法Face2QR&#xff0c;可以将美观、人脸识别和可扫描性完美地融合在一起。 下图展示为Face2QR 生成的面部图像&#xff08;第一行&#xff09;和二维码图像&#xff08;第二行&#xff09;。生成的二维码不仅忠实地保留…...

【Linux网络编程】第六弹---构建TCP服务器:从基础到线程池版本的实现与测试详解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、TcpServerMain.cc 2、TcpServer.hpp 2.1、TcpServer类基本结构 2.2、构造析构函数 2.3、InitServer(…...

XML 语言随笔

XML的含义 XML&#xff08;eXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。XML与HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;类似&#xff0c;但XML的设计目的是描述数据&…...

flex: 1 display:flex 导致的宽度失效问题

flex: 1 & display:flex 导致的宽度失效问题 问题复现 有这样的一个业务场景&#xff0c;详情项每行三项分别占33%宽度&#xff0c;每项有label字数不固定所以宽度不固定&#xff0c;还有content 占满标签剩余宽度&#xff0c;文字过多显示省略号&#xff0c; 鼠标划入展示…...

65页PDF | 企业IT信息化战略规划(限免下载)

一、前言 这份报告是企业IT信息化战略规划&#xff0c;报告详细阐述了企业在面对新兴技术成熟和行业竞争加剧的背景下&#xff0c;如何通过三个阶段的IT战略规划&#xff08;IT 1.0基础建设、IT 2.0运营效率、IT 3.0持续发展&#xff09;&#xff0c;系统地构建IT管理架构、应…...

15.三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&am…...

【Notepad++】---设置背景为护眼色(豆沙绿)最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Notepad】---设置背景为护眼色&#xf…...

项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面

一、User 1、使用数据注解设置主键和外键 设置主键&#xff1a;在User类的U_uid属性上使用[Key]注解。 设置外键&#xff1a;在Order类中&#xff0c;创建一个表示外键的属性&#xff08;例如UserU_uid&#xff09;&#xff0c;并使用[ForeignKey]注解指定它引用User类的哪个…...

电子商务人工智能指南 3/6 - 聊天机器人和客户服务

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...

vue.js组件开发的所有流程

1. 设计组件架构 首先&#xff0c;你需要考虑应用的结构&#xff0c;决定哪些部分应该成为独立的组件。这包括&#xff1a; 提取重复的UI元素&#xff1a;如按钮、输入框、卡片等。 功能模块&#xff1a;例如登录框、导航栏、数据表格等。 2. 设置开发环境 安装Node.js&#xf…...

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译&#xff1a;首先一条SQL语句最先到达的地方是TiDB Server集群&#xff0c;TiDB Server是无状态的&#xff0c;不存储数据&#xff0c;SQL 发过来之后TiDB Server 负责 解析&#xff0c;优化&#xff0c;编译 这…...

VsCode运行Ts文件

1. 生成package.json文件 npm init 2. 生成tsconfig.json文件 tsc --init 3. Vscode运行ts文件 在ts文件点击右键执行Run Code,执行ts文件...

初始化webpack应用示例

1、初始化npm mkdir webpack_test cd webpack_test npm init 2、安装webpack依赖 npm install webpack webpack-cli -D 3、添加文件夹&#xff0c;入口文件 mkdir src touch index.js touch add-content.js 文件夹结构 index.js import addContent from "./add-cont…...

liunx docker 部署 nacos seata sentinel

部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL_SERVICE_PORT3306 -e MYSQL…...

MySQL面试

文章目录 事务隔离级别需要解决的问题事务隔离级别 MySQL 中是如何实现事务隔离的实现可重复读 什么是存储引擎如何定位慢查询分析慢查询原因MySQL超大分页怎么处理索引失效什么时候建立唯一索引、前缀索引、联合索引&#xff1f;redolog与binlog是如何保证一致的redolog刷盘时…...

linux运维之shell编程

Shell 编程在系统运维中及其重要 1. Shell 编程概述 Shell 是一种命令行解释器&#xff0c;能够执行操作系统的命令。Shell 脚本是一个包含一系列 Shell 命令的文件&#xff0c;它可以被执行&#xff0c;以自动化和批量处理任务。常用的 Shell 类型包括 bash、sh、zsh 等。Shel…...

ssm 多数据源 注解版本

application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…...

Nginx核心配置详解

一、配置文件说明 nginx官方帮助文档&#xff1a;nginx documentation nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;nginx.conf子配置文件: include conf.d/*.conffastcgi&#xff0c; uwsgi&#xff0c;scgi 等协议相关的配置文件mime.types&#xff1a;…...

十六(AJAX3)、XMLHttpRequest、Promise、简易axios封装、案例天气预报、lodash-debounce防抖

1. XMLHttpRequest 1.1 XMLHttpRequest-基本使用 /* 定义&#xff1a;XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL&#xff0c;获取数据。这允许网页在不影响用户操作的情况下&#xff0c;更…...

12.06 深度学习-预训练

# 使用更深的神经网络 经典神经网络 import torch import cv2 from torchvision.models import resnet18,ResNet18_Weights from torch import optim,nn from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 from torchvision import tr…...

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…...

Python学习笔记10-作用域

作用域 定义&#xff1a;Python程序程序可以直接访问命名空间的正文区域 作用&#xff1a;决定了哪一部分区域可以访问哪个特定的名称 分类&#xff1a; 局部作用域&#xff08;Local&#xff09;闭包函数外的函数中&#xff08;Enclosing&#xff09;全局作用域&#xff0…...

Sui 主网升级至 V1.38.3

Sui 主网现已升级至 V1.38.3 版本&#xff0c;同时协议升级至 69 版本。请开发者及时关注并调整&#xff01; 其他升级要点如下所示&#xff1a; 协议 #20199 在共识快速路径投票中设置允许的轮次数量。 节点&#xff08;验证节点与全节点&#xff09; #20238 为验证节点…...

linux的vdagent框架设计

1、vdagent Linux 的 spice 客户代理由两部分组成&#xff0c;一个系统范围的守护进程 spice-vdagentd 和一个 X11 会话代理 spice-vdagent&#xff0c;每个 X11 会话有一个。spice-vdagentd 通过 Sys-V initscript 或 systemd 单元启动。 如下图&#xff1a;spice-vdagent&a…...

vue3+elementPlus封装的一体表格

目录结构 源码 exportOptions.js export default reactive([{label: 导出本页,key: 1,},{label: 导出全部,key: 2,}, ])index.vue <template><div class"flex flex-justify-between flex-items-end"><div><el-button-group><slot name…...

判断是否 AGP7+ 的方法

如何判断&#xff1f; /*** 是否是AGP7.0.0及以上* param project* return*/static boolean isAGP7_0_0(Project project) {def androidComponents project.extensions.findByName("androidComponents")if (androidComponents && androidComponents.hasProp…...

使用 Streamlit +gpt-4o实现有界面的图片内容分析

在上一篇利用gpt-4o分析图像的基础上&#xff0c;进一步将基于 Python 的 Streamlit 库&#xff0c;结合 OpenAI 的 API&#xff0c;构建一个简洁易用的有界面图片内容分析应用。通过该应用&#xff0c;用户可以轻松浏览本地图片&#xff0c;并获取图片的详细描述。 调用gpt-4o…...

树莓集团是如何链接政、产、企、校四个板块的?

树莓集团作为数字影像行业的积极探索者与推动者&#xff0c;我们通过多维度、深层次的战略举措&#xff0c;将政、产、企、校四个关键板块紧密链接在一起&#xff0c;实现了资源的高效整合与协同发展&#xff0c;共同为数字影像产业的繁荣贡献力量。 与政府的深度合作政府在产业…...

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16及更高版本,ide为goland2021.2??????? ?这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…...

MySQL数据库(3)-SQL基础语言学习

1. DDL数据定义语言 1.1 什么是DDL DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;是SQL语言的一部分&#xff0c;用于定义和修改数据库结构。DDL主要包括以下三类语句&#xff1a; 1.CREATE&#xff1a;用于创建数据库对象&#xff0c;如数…...

下拉框根据sql数据回显

vue <a-form-item label"XXXX" :labelCol"labelCol" :wrapperCol"wrapperCol" required><a-select v-decorator"[disputeType, validatorRules.disputeType]" style"width: 200px" placeholder"请选择XXXX&q…...

电池销售系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 摘 要 在当今信息爆炸的大时代&#xff0c;由于信息管理系统能够更有效便捷的完成信息的管理&#xff0c;越来越多的人及机构都已经引入和发展以信息管理系统为基础的信息化管理模式&#xff0c;随之信…...

四、镜像构建

四、镜像构建 从镜像大小上来说&#xff0c;一个比较小的镜像只有十几MB&#xff0c;而内核文件需要一百多MB&#xff0c;因此镜像里面是没有内核的&#xff0c;镜像是在被启动为容器后直接使用宿主机的内核&#xff0c;而镜像本身则只提供相应的rootfs&#xff0c;即系统正常…...

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码&#xff1a;管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码&#xff0c;涵盖了常见的 HTTP 状态码分类&#xff0c;如信息响应&#xff08;1xx&#xff09;、成功状态&#xff08;2xx&#xff09;、客户端错误&a…...

C#设计模式--原型模式(Prototype Pattern)

原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而无需通过构造函数。这种方式可以提高性能&#xff0c;特别是在创建复杂对象时。C# 中可以通过实现 ICloneable 接口或自定义克隆方法来实现原型模式。 案例 1&#xff1a;文档编辑器…...

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…...

使用kibana实现es索引的数据映射和索引模版/组件模版

1 数据映射 数据映射官方链接 1.1 日期映射案例 1.创建一条索引。把索引中的字段生日映射为日期&#xff0c;并制定映射后的格式为年月日 PUT http://10.0.0.91:9200/zhiyong18-luckyboy-date {"mappings": {"properties": {"birthday": {&q…...

基于elementui的远程搜索下拉选择分页组件

在开发一个练手项目的时候&#xff0c;需要一个远程搜索的下拉选择组件&#xff1b; elementui自带的el-select支持远程搜索&#xff1b;但如果一次性查询的数据过多&#xff1b;会导致卡顿。故自己实现一个可分页的远程下拉选择组件 效果&#xff1a; 代码&#xff1a; <…...