Docker入门与实战——Etcd(高可用的键值数据库)

发布时间:2026/10/20 2:18:47
Docker入门与实战——Etcd(高可用的键值数据库) Etcd高可用的键值数据库1、安装和使用Etcd1.1、二进制文件方式1.1.1、下载和安装1.1.2、使用Etcd1.2、Docker镜像方式下载1.3、数据目录1.4、服务启动参数1.4.1、通用参数1.4.2、节点参数1.4.3、集群参数1.4.4、安全参数2、使用客户端命令2.1、数据类操作2.1.1、put2.1.2、get2.1.3、del2.1.4、watch2.2、非数据类操作2.2.1、alarm2.2.2、auth2.2.3、check2.2.4、endpoint2.2.5、lease2.2.6、member2.2.7、role2.2.8、snapshot2.2.9、user2.2.10、其他命令3、Etcd集群管理3.1、构建集群3.1.1、静态配置3.1.2、动态发现3.2、集群配置优化3.2.1、时钟同步3.2.2、心跳消息间隔和选举间隔3.2.3、快照频率3.2.4、修改节点3.2.5、节点恢复3.2.6、重启集群Etcd是一个开源的分布式键值存储系统由CoreOS团队发起旨在为分布式系统尤其是微服务架构提供配置数据共享和服务发现功能。该项目实现了高可用性、一致性和容错性被广泛应用于Kubernetes、CloudFoundry、CoreOS Fleet和Salesforce等项目中也适用于许多其他分布式系统应用场景。本章将详细介绍Etcd的相关知识包括安装和使用以及集群管理等。笔者将介绍如何使用Etcd进行数据操作以及如何优化和维护Etcd集群同时还将展示Etcd提供的一些实用功能如数据监听、快照和服务发现等。通过本章的学习读者将能够充分了解Etcd的特性和应用场景从而更好地应用Etcd解决分布式系统中的配置管理和服务发现等问题。Etcd的目标是构建一个高可用的分布式键值(key-value)仓库遵循Apache v2许可基于Go语言实现。对分布式系统来说实现信息的共识是最基本的问题之一只有在此基础上才能实现对服务配置信息的管理、服务的发现、更新、同步等。解决这些问题需要使用一套能保证一致性的分布式数据系统比如传统的ApacheZooKeeper项目采用了ZooKeeper Atomic Broadcast简化版的Paxos算法来实现数据的强一致性。与ZooKeeper项目类似Etcd也是为集群环境设计的但它采用了更为简洁的Raft共识算法同样可以实现数据的强一致性并支持集群节点状态管理和服务自动发现等功能。Etcd项目在github.com/coreos/etcd进行维护最新为3.x系列版本。它已经成为Kubernetes集群配置管理的核心组件之一并被广泛应用于其他分布式系统中。Etcd的设计灵感来源于Apache ZooKeeper项目和doozer项目doozer是一个一致性分布式数据库实现主要面向少量数据​。在设计Etcd时团队特别考虑了以下四个方面。简单支持RESTful API和gRPC API用户可以轻松地与Etcd进行交互。安全通过使用TLS方式实现安全连接保障数据的安全性。快速支持每秒万次的并发写操作超时时间在毫秒级别。可靠支持分布式架构基于Raft共识算法实现一致性确保数据的可靠性和一致性。在使用Etcd进行服务配置信息管理和服务发现时通常需要在多个节点上启动多个Etcd实例并将它们添加为一个集群。同一个集群中的Etcd实例之间会自动进行通信和同步以保持彼此之间信息的一致性。这样分布在集群节点上的应用都可以获取到一致的信息从而保证整个分布式系统的正常运行和服务可用性。同时Etcd还支持动态添加和移除节点以适应集群规模的变化。1、安装和使用EtcdEtcd基于Go语言实现因此用户可以从项目主页https://github.com/coreos/etcd下载源代码自行编译也可以下载编译好的二进制文件甚至直接使用制作好的Docker镜像文件来体验。下面分别讲解基于二进制文件和Docker镜像这两种方式安装Etcd步骤都十分简单。1.1、二进制文件方式1.1.1、下载和安装编译好的二进制文件都可以在github.com/coreos/etcd/releases页面找到用户可以选择需要的版本或通过下载工具下载。例如下面的命令使用curl工具下载压缩包并将它解压到本地解压后可以看到若干二进制文件和文档文件其中etcd是主服务文件etcdctl是提供给用户的命令客户端etcdutl是工具文件其他的都是文档文件。注意某些版本中还含有etcd-migrate二进制文件可以协助进行旧版本的迁移。通过下面的命令将所需要的二进制文件都放到系统可执行路径/usr/local/bin/下至此Etcd安装完成。1.1.2、使用Etcd下面将先以单节点模式为例讲解Etcd支持的功能和操作。可通过如下命令查看etcd的版本信息接下来直接执行etcd命令这将启动一个服务节点监听本地的2379客户端请求端口和2380其他节点连接端口​显示类似下面这样的信息使用自带的etcdctl命令进行查看实际上是封装了RESTAPI调用​也可以通过REST API直接查看集群健康状态通过etcdctl命令设置和获取键值也十分方便例如设置键值对testkey:“hello world”至此键值对已经设置成功了。也可以通过REST API访问本地2379端口的方式来进行操作例如读写testkey的值注意此时键值需要采用 base64编码格式testkey和hello world对应的base64编码分别为dGVzdGtleQ和aGVsbG8gd29ybGQ此外Etcd还提供了gRPC API可以通过它进行更高性能的读写操作。1.2、Docker镜像方式下载Etcd官方并未提供指定镜像目前有多家厂商提供了EtcdDocker镜像以Bitnami镜像为例可以通过下面的命令启动Etcd服务监听本地的2379和2380端口1.3、数据目录作为数据库最重要的自然是数据存放位置。Etcd默认创建的本地数据目录为${name}.etcd其中${name}为节点别名。默认情况下本地数据路径为default.etcd。用户也可以通过–data-dir选项来指定本地数据存放的位置下面的命令指定Etcd节点别名为test数据存放目录为test.etcd查看数据目录下的内容其中snap目录下将定期记录节点的状态快照信息wal目录下则记录数据库的操作日志信息可以通过–wal-dir参数来指定将信息存放到特定目录​。1.4、服务启动参数Etcd服务启动的时候支持一些参数用户可以通过这些参数来调整服务和集群的行为。另外参数可以通过环境变量的形式传入命名全部为大写并且加ETCD_前缀例如ETCD_NAME‘etcd-cluster’。主要参数包括通用参数、节点参数、集群参数和安全参数。1.4.1、通用参数这些参数主要与节点自身配置有关主要包括-config-file服务配置文件路径。-name default设置成员节点的别名建议为每个成员配置可识别的名称。-data-dir ${name}.etcd数据存储的目录。-wal-dir 指定wal(write-ahead-log)目录存有数据库操作日志。-snapshot-count 10000设置提交多少次事务当前表示10000次就出发一次快照。-max-snapshots 5设置最多保留多少个快照0表示无限制。-max-snapshots 5设置最多保留多少个快照0表示无限制。-max-wals 5设置最多保留多少个wal文件0表示无限制。1.4.2、节点参数这些参数与节点行为有关主要包括-heartbeat-interval 100心跳时间间隔单位为毫秒(ms)默认为100ms。-election-timeout 1000​重新选举时间间隔单位为毫秒。-listen-peer-urls http://localhost:2380Peer消息的监听服务地址列表。-listen-client-urls http://localhost:2379客户端请求的监听地址列表。-cors 跨域资源访问的控制白名单。-quota-backend-bytes 0后端存储报警的阈值。-max-txn-ops 128一次事务中允许的最多操作个数默认为128。-max-request-bytes 1572864允许接收的客户端请求的最大字节数。-grpc-keepalive-min-time 5s客户端向服务端检测存活的最小等待时间默认为5秒。-grpc-keepalive-interval 2h服务端检测客户端存活的等待时间默认为2小时0表示禁用。-grpc-keepalive-timeout 20s关闭一条不响应的gRPC连接的额外等待时间默认为20秒0表示禁用。1.4.3、集群参数这些参数与集群行为有关主要包括-initial-advertise-peer-urls http://localhost:2380广播到集群中本成员的Peer监听通信地址。-initial-cluster defaulthttp://localhost:2380初始的集群启动配置。-initial-cluster-state new初始化集群状态默认为new也可以指定为existing表示加入一个已有集群中。-initial-cluster-token etcd-cluster启动集群时指定集群口令只有拥有相同令牌的节点才能加入同一集群。-advertise-client-urls http://localhost:2379广播到集群中本成员的监听客户端请求的地址。-discovery 通过自动探测方式发现集群成员的地址指定用于探测的地址。-discovery-proxy 使用代理进行探测服务。-discovery-srv 用于启动集群的DNS服务域。-strict-reconfig-check true默认启用严格检查当某个重新配置请求可能导致多数失败时则拒绝。-auto-compaction-retention 0自动进行键值历史压缩的保留长度单位为小时0表示不启用。-auto-compaction-mode periodic自动进行压缩的模式如periodic定期或revision版本号​。-enable-v2 true是否接受v2版本的客户端接入。-debug false是否开启调试信息。-log-package-levels 记录日志的级别如DEBUG或INFO。-log-output default日志输出的目标。-force-new-cluster false强制创建一个新的单节点集群。1.4.4、安全参数这些参数主要用于指定通信时的TLS证书、密钥配置包括-peer-trusted-ca-file 与节点通信时信任的TLS CA根证书文件路径。-peer-cert-allowed-cn 连接到节点时客户端证书的通用名称。-peer-cert-allowed-hostname 对等成员访问时允许的主机名。-peer-client-cert-auth false是否启用对等成员节点客户端认证。-peer-trusted-ca-file 对等成员节点的信任CA文件路径。-peer-auto-tls false当-peer-key-file和-peer-cert-file未指定时是否使用自动生成的TLS证书。-peer-crl-file 对等成员之间证书撤销列表文件路径。-cipher-suites 支持的密码学协议族。-host-whitelist 服务端不安全时允许来自客户端的访问默认为全部。2、使用客户端命令etcdctl是Etcd官方的命令行客户端支持一些基于RESTAPI封装好的命令供用户直接与Etcd服务交互无须调用API。推荐读者在刚接触Etcd时通过etcdctl命令来熟悉功能。Etcd项目二进制发行包中包含etcdctl工具用户也可以从github.com/coreos/etcd/releases手动下载。etcdctl的命令格式为全局选项主要包括-cacert指定用于校验服务器TLS证书的CA证书。-cert使用指定的TLS证书来识别安全客户端。-command-timeout5s命令超时时间。-debug输出调试信息显示执行命令时发起的请求。-dial-timeout2s客户端连接的拨号超时时间。-discovery-srv value,-d value通过域名查询来探测集群成员信息。-discovery-srv-name使用DNS Discovery时需要查询的服务名称。-endpoints[127.0.0.1:2379]​集群中成员gRPC地址列表多个成员用逗号隔开。-insecure-discovery[true]​接受非安全的集群节点。-insecure-skip-tls-verify[false]​跳过服务器证书验证注意此选项仅用于测试目的​。-insecure-transport[true]​禁用客户端连接的传输安全性。-keepalive-time2s客户端连接的心跳间隔时间。-key使用此TLS密钥文件标识安全客户端。-password用于身份验证的密码如果使用此选项则-user选项不应包括密码​。-user用于身份验证的用户名和密码如果未提供密码则提示输入​。-w,-write-outsimple设置输出格式(fields、json、protobuf、simple、table)。支持的命令大致分为数据类操作和非数据类操作两类。Etcd作为一个分布式数据库采用了与ZooKeeper类似的文件目录结构数据类操作基本围绕文件即某个键或目录进行。对比Linux的文件和目录操作命令可以发现两者之间的相似性。数据类操作命令主要包括del删除指定的键或键范围[keyrange_end)。get获取键或键范围。put将给定的键放入存储中。watch在键或前缀上观察事件流。非数据类操作主要是Etcd提供的系统配置、权限管理等包括如下命令alarm解除或列出警报。auth身份认证相关命令。check检查负载和性能状态。compaction压缩Etcd中的事件历史记录。defrag对指定端点的Etcd成员存储进行碎片整理。elect观察和参与领导者选举。endpoint输出指定端点的状态信息。lease管理租约包括创建、保持、列出、撤销等。lock获取命名锁。make-mirror在目标Etcd集群上创建镜像。member添加、删除、更新、列出成员或提升成员权限。move-leader将领导权转移给另一个Etcd集群成员。role角色管理包括添加、删除、获取、授权、列出。snapshot快照管理包括创建、恢复快照等。txn在一个事务中处理所有请求。user用户的添加、删除、获取、角色授予、列出、密码更新、撤销。下面分别介绍各个操作命令的主要用法和功能。2.1、数据类操作数据类操作主要涉及对键值和目录的生命周期管理。Etcd为用户提供了非常灵活的键组织方式。用户可以指定单层级的键例如testkey这些键会直接存储在根目录/下面。同时用户也可以指定层次化的目录结构例如cluster1/node2/testkeyEtcd会创建相应的目录结构并在其中存储键值。这种方式类似于ZooKeeper的目录结构。2.1.1、put该命令用于将某个键的值存储为给定值。命令格式为etcdctl put [options] key value [flags]​其中value也可通过标准输入给出。示例如下支持的选项包括-ignore-lease[false]​使用当前的租约更新键。-ignore-value[false]​使用当前的值更新键。-lease0要附加到键的租约ID用十六进制表示​。-prev-kv[false]​在修改之前返回前一个键值对。2.1.2、get该命令用于获取指定键或一组范围内的键的值。命令格式为etcdctl get [options] key [range_end]​ [flags]​示例如下支持的选项为-consistencyl线性化(l)或可串行化(s)。-count-only[false]​仅获取数量。-from-key[false]​获取大于或等于给定键的键。-h,-help[false]​获取帮助。-keys-only[false]​仅获取键。-limit0限制返回结果的个数。-order结果的顺序如ASCEND升序或DESCEND降序​默认为ASCEND​。-prefix[false]​获取匹配前缀的键的值。-print-value-only[false]​在使用simple输出格式时仅输出值。-rev0指定键值修订版本。-sort-by指定排序指标包括CREATE、KEY、MODIFY、VALUE或VERSION。2.1.3、del该命令用于删除某个键值或给定范围内的键值成功则结果返回1。命令格式为del [options] key [range_end]​ [flags]​示例如下支持的选项为-from-key[false]​删除大于或等于给定键的键。-h,-help[false]​获取del命令的帮助信息。-prefix[false]​删除匹配给定前缀的键。-prev-kv[false]​在删除前返回被删除的键值对。-range[false]​删除一段范围内的键。2.1.4、watch该命令用于监测一个键值的变化一旦键值发生更新就会输出最新的值并退出。命令格式为etcdctl watch [options] ​[key orprefix]​ [range_end]​ [--] ​[exec-command arg1arg2...]​[flags]​例如当用户更新testkey键值为Helloworld时通过watch监测到对应事件支持的选项包括-i,-interactive[false]​交互模式。-prefix[false]​如果设置了前缀则监测前缀。-prev-kv[false]​获取事件发生前的前一个键值对。-progress-notify[false]​从服务器获取周期性的监测进度通知。-rev0开始监测的版本号。2.2、非数据类操作非数据类操作不直接对数据本身进行管理而是负责围绕集群自身的一些配置。2.2.1、alarm该命令用于管理警报包括2个子命令disarm解除所有警报。list列出所有警报。2.2.2、auth该命令用于设置是否启用访问验证包括3个子命令disable禁用认证。enable启用认证。status返回认证状态。例如在root用户创建后启用认证2.2.3、check该命令用于检查Etcd集群的负载和性能包括2个子命令datascale检查给定服务器端点上不同工作负载的数据存储器使用情况。perf检查Etcd集群的性能。例如下面的命令会运行一分钟的性能测试给出结果2.2.4、endpoint该命令用于输出指定端点的状态信息包括3个子命令hashkv为-endpoints中的每个端点输出键值历史哈希。health检查-endpoints标志中指定的端点的健康状况。status输出-endpoints标志中指定的端点的状态。例如下面的命令可以获取默认节点的状态2.2.5、lease该命令用于管理租约包括创建、保持、列出、撤销等有5个子命令grant创建租约。keep-alive保持租约活动更新​。list列出所有活动租约。revoke撤销租约。timetolive获取租约信息。例如下面的命令将获取默认节点的状态2.2.6、member该命令用于添加、删除、更新、列出节点成员或提升集群中节点成员的权限包括5个子命令add将成员添加到集群中。list列出集群中的所有成员。promote在集群中提升非投票成员权限。remove从集群中删除成员。update更新集群中的成员。例如下面的命令将获取集群中的所有节点2.2.7、role该命令用于角色管理包括添加、删除、获取、授权、列出有5个子命令add添加新角色。delete删除角色。get获取角色的详细信息。grant-permission将键授权给角色。list列出所有角色。默认带有root、user、guest三种角色。root为全局最高权限user可以对其拥有的前缀空间进行读写guest可以对其拥有的前缀空间进行读操作。2.2.8、snapshot该命令用于快照管理包括恢复、存储有2个子命令snapshot restore将Etcd成员快照恢复到Etcd目录。snapshot save将Etcd节点后端快照存储到给定文件中。例如下面的命令将保存快照到指定数据文件2.2.9、user该命令用于进行用户的添加、删除、获取、角色授予、列出、密码更新、撤销包括一系列子命令add添加新用户。delete删除用户。get获取用户的详细信息。grant-role将角色授予用户。list列出所有用户。passwd更改用户密码。revoke-role从用户中撤销角色。默认情况下需要先创建启用root用户作为Etcd集群的最高权限管理员创建一个testuser用户会提示输入密码分配某些已有角色给用户2.2.10、其他命令compaction压缩Etcd中的事件历史记录。defrag对指定端点的Etcd成员存储进行碎片整理。elect观察和参与领导者选举。lock获取命名锁。make-mirror在目标Etcd集群上创建镜像。move-leader将领导权转移给另一个Etcd集群成员。txn在一个事务中处理所有请求。3、Etcd集群管理Etcd的集群采用典型的主-从模型通过Raft协议来保证在一段时间内有一个节点为主节点其他节点为从节点。一旦主节点发生故障其他节点就可以自动重新选举出新的主节点。与其他分布式系统类似集群中的节点个数推荐为奇数个最少为3个。此时quorum为2节点数越多可提供的冗余性越多但同时会带来写数据性能的下降。注意quorum是分布式系统中很重要的概念代表一个集群工作需要正常投票的节点个数的最小值通常为集群的一半再加1。3.1、构建集群构建集群的关键是让节点知道自己加入的集群信息以及其他节点的访问信息。Etcd支持两种模式来构建集群静态配置和动态发现。3.1.1、静态配置顾名思义静态配置就是提取、写好集群中的有关信息。例如假设读者想要用三个节点来构建一个集群地址如表所示。首先在各个节点上将地址和别名信息添加到/etc/hosts可以通过如下命令启动各个节点上的Etcd服务分别命名为n1、n2和n3。在节点1上执行在节点2上执行在节点3上执行用户也可以将这些配置信息加入本地配置文件例如/etc/etcd/etcd.conf.yml​Etcd启动时会自动读取成功后可以在任一节点上通过etcdctl来查看当前集群中的成员信息3.1.2、动态发现静态配置的方法虽然简单但是如果节点信息需要变动就需要手动进行修改。很自然地可以通过动态发现的方法让集群自动更新节点信息。CoreOS提供了一个公开的Etcd发现服务地址为https://discovery.etcd.io。使用该服务十分简单。首先为要创建的集群申请唯一的发现地址需要提供集群中的节点个数作为参数返回的地址就是该集群要实现动态发现的唯一地址。然后分别在各个节点上指定服务发现地址信息替代原先动态指定的节点列表。在节点1上执行在节点2上执行在节点3上执行当然用户也可以配置私有的服务。另外一种实现动态发现的机制是为每个节点指定同一个子域的域名然后通过域名发现来自动注册。例如三个节点的域名分别为n1.mycluster.com、n2.mycluster.com和n3.mycluster.com则启动参数中的集群节点列表信息可以替换为–discovery-srv mycluster.com。3.2、集群配置优化影响集群性能的因素可能有很多包括时钟同步、心跳消息间隔和选举间隔、快照频率、修改节点、节点恢复、重启集群等需要通过优化配置尽量减少这些因素的影响。3.2.1、时钟同步对于分布式集群来说各个节点上的时钟同步十分重要过大的时钟误差可能会导致Raft协议的异常。因此各个节点要启动同步时钟协议。以Ubuntu系统为例可以启动NTP服务用户也可以修改/etc/ntp.conf文件来指定NTP服务器地址建议对多个节点采用统一的配置。3.2.2、心跳消息间隔和选举间隔Etcd集群配置中的心跳消息间隔和选举间隔是两个关键因素。心跳消息间隔表示主节点发送心跳消息通知从节点自己的存活状态的时间间隔。选举间隔表示从节点没有收到心跳消息时等待超时后发起选举成为主节点的时间间隔。通常选举间隔应该比心跳消息间隔长一般建议设置为心跳消息间隔的5倍以上。时间间隔越短节点恢复的速度越快但会占用更多的计算和网络资源。在默认情况下Etcd集群的心跳消息间隔为100ms选举间隔为1s。选举间隔的上限为50s但完全没必要设置得这么长。这个配置适用于本地局域网环境但对于跨网段的情况需要根据节点之间的网络延迟(RTT)进行适当的调整。可以在启动服务时通过-heartbeat-interval和-election-timeout参数来指定。例如一般情况下跨数据中心的集群可以配置为也可以通过环境变量指定对于跨地域的网络例如东西半球的数据中心的网络延迟往往在数百毫秒​还可以适当延长。3.2.3、快照频率Etcd会定期地将数据的修改存储为快照默认情况下每进行10000次修改才会存储一个快照。在存储的时候会有大量数据进行写入影响Etcd的性能。建议将这个值调整得小一些例如每提交2000个事务就做一次快照也可通过环境变量指定3.2.4、修改节点无论是添加、删除还是迁移节点都要一个一个地进行并且确保先修改配置信息包括节点广播的监听地址、集群中节点列表等​然后再进行操作。例如要删除多个节点当有主节点要被删除时需要先删除一个等集群中状态稳定新的主节点重新生成后再删除另外的节点。在迁移或替换节点时先将节点从集群中删除等集群状态重新稳定后再添加新的节点。当然使用旧节点的数据目录文件会加快新节点的同步过程但是要保证这些数据是完整的且是比较新的。3.2.5、节点恢复Etcd集群中的节点会通过数据目录来存放修改信息和集群配置。一般来说当某个节点出现故障时本地数据已经过期甚至格式被破坏。如果只是简单地重启进程则容易造成数据不一致。这个时候保险的做法是先删除该节点清空数据目录再重新作为空节点加入。Etcd提供了–strict-reconfig-check选项确保当集群状态不稳定时拒绝对配置状态的修改。例如工作中节点数没达到quorum或者同时提交多个集群成员变更操作。3.2.6、重启集群极端情况下集群中大部分节点都出现问题时需要重启整个集群。这个时候最保险的做法是先找到一个数据记录完整且比较新的节点以它为唯一节点创建新的集群随后将其他节点逐个添加进来在添加过程中注意随时检查状态保证集群的稳定性。这样做的好处是可以确保数据记录的完整性同时还可以避免数据冲突和丢失等问题。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询