开源分布式键值存储etcd指南

在这个综合教程中,我们将深入研究 etcd,一个开源分布式键值存储。我们将探讨其基本概念、功能和用例,并提供实用的快速入门指南。最后,我们将 etcd 与其他几个分布式键值存储进行比较,以了解其优势和独特的产品。

什么是分布式键值存储?
分布式键值存储是一种 NoSQL 数据库,它将数据存储为跨多个物理机或虚拟机的键值对。

该发行版本质上增强了可扩展性、容错性和性能。此外,每条数据(值)都与唯一的标识符(键)相关联。该模型对于某些用例非常高效,例如缓存、配置管理和快速数据检索。

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

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

以下是分布式键值存储的一些重要关键方面:

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

分布式键值存储在各种场景中都有应用,例如配置管理、缓存、会话存储、服务发现、领导者选举等。

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

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

etcd是用Go开发的,内部使用Raft 共识算法来管理高可用的复制日志。

全球许多公司如百度、华为、Salesforce、Ticketmaster等在生产中使用etcd 。它经常与Kubernetes、Locksmith、Vulcand、Doorman 等应用程序集成。

etcd 丰富的功能集使其成为分布式系统的多功能且可靠的选择,为云原生环境中的配置管理、服务发现和协调提供了基本的构建块。它对分布式一致性、高可用性和强大的数据完整性的承诺使其成为现代、可扩展和弹性应用程序领域的基础组件。

etcd的特点
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 以使其运行。etcd与 Ubuntu、CentOS 和 Windows 等 Linux 发行版兼容。

我们可以从更新 Ubuntu 上的软件包列表开始:
$ sudo apt update

随后,我们可以安装etcd:
$ sudo apt install etcd

同样,在 CentOS 上,我们首先需要启用 EPEL 存储库,然后安装 etcd:
$ sudo yum install epel-release
$ sudo yum install etcd

或者,我们可以访问官方 etcd GitHub 版本页面来下载最新版本。否则,我们可以使用以下命令克隆存储库:
$ git clone -b v3.5.11 https://github.com/etcd-io/etcd.git

为了克隆最新版本,我们可以省略-b v3.5.11标志。

然后,我们可以解压下载的存档并导航到 etcd 目录:
$ tar xvf etcd-v3.5.11-linux-amd64.tar.gz
$ cd etcd

接下来,我们可以运行构建脚本:
$ ./build.sh

我们可以在bin目录下找到二进制文件。然后我们需要将 bin 目录的完整路径添加到我们的路径中:
$ export PATH="$PATH:`pwd`/bin"

这里,pwd是获取当前目录的完整路径名的 UNIX 命令。最后,我们可以通过检查版本来确保我们的PATH包含 etcd:
$ etcd --version

使用配置文件进行配置
我们有多种选项来配置 etcd。但是,在本教程中,我们将创建一个包含基本设置的配置文件。

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

# Example etcd-config.yml
# Node name, a unique identifier, in the etcd cluster
name: node-1
# 存储 etcd 数据的数据目录
data-dir: /var/lib/etcd/default.etcd
# 客户端通信的监听地址
listen-client-urls: http://127.0.0.1:2379,http://<NODE-IP>:2379
# 公布客户通信地址
advertise-client-urls: http:
//<NODE-IP>:2379
# 用于同行通信的监听地址
listen-peer-urls: http:
//<NODE-IP>:2380
# 为对等通讯提供广告地址
initial-advertise-peer-urls: http:
//<NODE-IP>:2380
# 初始群集配置
initial-cluster: node-1=http:
//<NODE-IP>:2380,node-2=http://<NODE-IP>:2380
# etcd 集群的唯一标记
initial-cluster-token: etcd-cluster-1
# 初始群集状态(新群集、现有群集或备用群集)
initial-cluster-state: new
启用共享秘密令牌身份验证
auth-token:
"some-secret-token"
# 使用 RBAC 启用授权
enable-authorization: true
# 启用 etcd 键值存储的自动压缩功能
auto-compaction-mode: periodic
auto-compaction-retention:
"1h"
# 安全通信设置(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

让我们了解有关此配置的一些重要注意事项:
  • 添加 TLS 证书:安全配置(客户端传输安全性和对等传输安全性)是可选的,但建议用于生产部署,以提供加密通信。
  • 添加 RBAC:基于角色的访问控制通过根据用户角色和权限控制对 etcd 操作的访问来添加一层安全性。
  • 启用自动压缩:通过定期(每小时)删除不必要的数据来帮助管理 etcd 数据存储的大小。

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

 启动 etcd 并与之交互
我们可以使用以下命令以指定的配置启动 etcd:
$ ./etcd --config-file=etcd-config.yml

此外,我们可以使用 etcdctl 命令行工具与 etcd 进行交互,该工具专为与 etcd 集群交互和管理而设计。它方便管理员和开发人员直接从命令行对etcd集群执行各种操作。

让我们通过几个例子来理解:

我们可以设置一个键值对:

$ etcdctl put mykey "Hello, etcd!"

在这里,mykey是密钥,“Hello, etcd!” 是对应的值。随后,我们可以检索mykey的值:

$ etcdctl get mykey
mykey
Hello, etcd!

要查看mykey的更改,我们可以简单地执行以下操作:
$ etcdctl watch mykey

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

需要注意的是,监视密钥并不能阻止其被删除。监视是观察变化的机制,而不是控制或限制变化的机制。

最后,我们可以使用以下命令来检查etcd集群的健康状况:
$ etcdctl endpoint health

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

代码示例
要使用 Java 与 etcd 交互,我们可以使用 Java 客户端库,例如jetcd或etcd4j。在我们的示例中,我们将使用jetcd,因为它是 etcd v3 的官方 Java 客户端。

jetcd基于 Java 11 构建。它促进所有基于密钥的 etcd 请求并提供 SSL 安全性。此外,它允许定义多个连接 URL,并提供同步和异步 API,使我们能够灵活地选择最适合我们的应用程序的编程模型。

我们可以将jetcd-core 依赖项添加到我们的项目中,如下所示:

<dependency>
    <groupId>io.etcd</groupId>
    <artifactId>jetcd-core</artifactId>
    <version>0.7.7</version>
</dependency>

现在,让我们看一个基本示例,演示使用jetcd进行放置、检索和删除操作:

public class JetcdExample {
    public static void main(String[] args) {
        String etcdEndpoint = "http://localhost:2379";
        ByteSequence key = ByteSequence.from(
"/mykey".getBytes());
        ByteSequence value = ByteSequence.from(
"Hello, etcd!".getBytes());
        try (Client client = Client.builder().endpoints(etcdEndpoint).build()) {
            KV kvClient = client.getKVClient();
            
           
// Put a key-value pair
            kvClient.put(key, value).get();
            
           
// 使用 CompletableFuture 返回值
            CompletableFuture<GetResponse> getFuture = kvClient.get(key);
            GetResponse response = getFuture.get();
            
           
// Delete the key
            kvClient.delete(key).get();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

与 Apache Zookeeper 和 Consul 的比较

领导选举    

  • etcd:领导者选举是 Raft 共识中固有的。节点参与选举以选出领导者。    
  • Zookeeper:通过Zab协议进行中心化领导人选举。节点选举一个协调操作的领导者。  
  • Consul: 基于Raft的领导选举。每个Consul服务器都参与Raft共识算法进行领导者选举。

领导者特征  :

  • etcd:领导者拥有决策和协调集群的权力。  
  • Zookeeper: 领导者管理分布式系统的状态并协调行动。  
  • Consul: 领导者负责集群协调和决策。

一致性:

  • etcd:一致性强  
  • Zookeeper:一致性强
  • Consul:最终一致

etcd 具有简单性和云原生计算基础 (CNCF) 支持,适合 Kubernetes 等云原生环境。Apache ZooKeeper 是大规模部署的可靠选择,它提供了很强的一致性,但也增加了复杂性。另一方面,Consul 以简单和有效的服务发现而闻名,与 HashiCorp 堆栈无缝集成。

安全性、易用性和集成要求在决策过程中发挥着关键作用。每种工具都有其优点,因此根据所需的功能和用例做出明智的选择对我们来说至关重要。