马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在分布式体系的复杂天下中,确保有用的数据管理至关紧张。分布式可靠的键值存储在维护跨分布式情况的数据同等性和可伸缩性方面起着关键作用。
在这个全面的教程中,我们将深入研究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 --verison
- etcd 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.crt
- key-file: /etc/etcd/server.key
- client-cert-auth: true
- trusted-ca-file: /etc/etcd/ca.crt
- peer-transport-security:
- cert-file: /etc/etcd/peer.crt
- key-file: /etc/etcd/peer.key
- client-cert-auth: true
- trusted-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.1 的 2379 端口,也可以通过节点实际 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-1 和 node-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-file、key-file、client-cert-auth、trusted-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 main
- import (
- "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()
- // 写入键值对到etcd
- ctx, 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?;
- // 写入键值对到etcd
- client
- .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的简朴性、同等性和高可用性使其成为开发职员在复杂的分布式情况中有代价的工具。
|