etcd从入门到实践:单机与高可用部署全解析

etcd基本知识:分布式键值存储的核心

etcd是一个高可用的分布式键值存储系统,由CoreOS团队开发,现已成为Cloud Native Computing Foundation(CNCF)的毕业项目。其设计初衷是为分布式系统提供可靠的配置管理和服务发现功能,尤其在Kubernetes集群中作为核心组件存储集群状态和元数据。

核心特性与设计原理

etcd的核心特性包括:

  1. 强一致性:基于Raft共识算法,确保在任何时候集群中多数节点存活时数据的一致性。
  2. 高可用性:支持多节点部署,自动处理节点故障和领导选举。
  3. 键值存储:提供简单的键值对存储接口,支持TTL(生存时间)和目录操作。
  4. Watch机制:允许客户端监听键值变化,实现实时通知。
  5. 事务支持:通过Multi-version Concurrency Control(MVCC)实现乐观并发控制。

Raft协议是etcd实现一致性的关键。与Paxos相比,Raft通过明确的领导选举(Leader Election)、日志复制(Log Replication)和安全性(Safety)机制,提供了更易理解的实现。在etcd中,Raft确保:

  • 只有一个领导节点处理写请求。
  • 日志按顺序复制到多数节点。
  • 领导选举需要多数票才能生效。

数据模型与存储结构

etcd的数据模型是分层的键空间,类似于文件系统目录结构。例如:

  1. /registry/pods/default/nginx-1234
  2. /registry/services/default/nginx

每个键值对包含:

  • Key:字符串类型的路径。
  • Value:任意字节序列(通常为JSON或Protocol Buffers编码)。
  • Lease:可选的TTL,用于自动过期。
  • Revision:全局递增的版本号,用于Watch和事务。

底层存储使用boltdb(现改为bbolt),一个嵌入式的键值数据库,提供ACID事务支持。etcd通过MVCC实现历史版本查询,每个修改操作生成一个新的修订版本(revision),客户端可以指定revision读取历史数据。

单机部署:快速上手etcd

单机部署适用于开发测试环境或低可用性要求的场景。以下是基于Linux系统的详细步骤:

1. 下载与安装

从GitHub Release页面下载最新稳定版etcd:

  1. wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
  2. tar -xzf etcd-v3.5.0-linux-amd64.tar.gz
  3. cd etcd-v3.5.0-linux-amd64

2. 启动etcd服务

单机模式最简单的启动方式:

  1. ./etcd --advertise-client-urls http://127.0.0.1:2379 \
  2. --listen-client-urls http://127.0.0.1:2379 \
  3. --listen-peer-urls http://127.0.0.1:2380

参数说明:

  • --advertise-client-urls:客户端访问的地址。
  • --listen-client-urls:etcd监听客户端连接的地址。
  • --listen-peer-urls:节点间通信的地址(单机时可忽略)。

3. 验证服务

使用etcdctl(v3版本)测试服务:

  1. export ETCDCTL_API=3
  2. ./etcdctl --endpoints=http://127.0.0.1:2379 put foo bar
  3. ./etcdctl --endpoints=http://127.0.0.1:2379 get foo

输出应为:

  1. foo
  2. bar

4. 配置文件方式

创建/etc/etcd/etcd.conf.yml

  1. name: 'default'
  2. data-dir: '/var/lib/etcd'
  3. listen-client-urls: 'http://0.0.0.0:2379'
  4. advertise-client-urls: 'http://127.0.0.1:2379'

启动服务:

  1. ./etcd --config-file /etc/etcd/etcd.conf.yml

高可用部署:构建生产级etcd集群

生产环境必须部署高可用etcd集群,通常3或5个节点组成。以下是基于3节点的详细步骤:

1. 节点规划

假设3个节点:

  • Node1: 192.168.1.10
  • Node2: 192.168.1.11
  • Node3: 192.168.1.12

2. 生成TLS证书(推荐)

etcd集群间通信和客户端访问应使用TLS加密。使用cfssl生成证书:

  1. # 生成CA
  2. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  3. # 生成节点证书
  4. echo '{"CN":"node1","hosts":[""],"key":{"algo":"rsa","size":2048}}' > node1.json
  5. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer node1.json | cfssljson -bare node1

为每个节点重复此过程,修改CNhosts

3. 启动etcd集群

在Node1上启动:

  1. ./etcd --name node1 \
  2. --initial-advertise-peer-urls https://192.168.1.10:2380 \
  3. --listen-peer-urls https://192.168.1.10:2380 \
  4. --listen-client-urls https://192.168.1.10:2379,http://127.0.0.1:2379 \
  5. --advertise-client-urls https://192.168.1.10:2379 \
  6. --initial-cluster node1=https://192.168.1.10:2380,node2=https://192.168.1.11:2380,node3=https://192.168.1.12:2380 \
  7. --initial-cluster-token etcd-cluster-1 \
  8. --initial-cluster-state new \
  9. --cert-file=/path/to/node1.pem \
  10. --key-file=/path/to/node1-key.pem \
  11. --peer-cert-file=/path/to/node1.pem \
  12. --peer-key-file=/path/to/node1-key.pem \
  13. --trusted-ca-file=/path/to/ca.pem \
  14. --peer-trusted-ca-file=/path/to/ca.pem

Node2和Node3类似,修改--name、IP和证书路径。

4. 验证集群状态

在任一节点执行:

  1. export ETCDCTL_API=3
  2. export ETCDCTL_ENDPOINTS=https://192.168.1.10:2379,https://192.168.1.11:2379,https://192.168.1.12:2379
  3. export ETCDCTL_CACERT=/path/to/ca.pem
  4. export ETCDCTL_CERT=/path/to/client.pem
  5. export ETCDCTL_KEY=/path/to/client-key.pem
  6. ./etcdctl member list
  7. ./etcdctl endpoint status

输出应显示3个健康节点。

5. 运维与故障处理

节点故障恢复

  1. 停止故障节点etcd服务。
  2. 在其他节点执行:
    1. ./etcdctl member remove <member-id>
  3. 准备新节点,使用相同证书和--initial-cluster参数(包含新节点)。

数据备份与恢复

使用etcdctl snapshot save备份:

  1. ./etcdctl snapshot save backup.db

恢复时启动临时etcd:

  1. ./etcd --name restore --data-dir /tmp/restore \
  2. --initial-cluster restore=http://127.0.0.1:2380 \
  3. --initial-advertise-peer-urls http://127.0.0.1:2380 \
  4. --snapshot backup.db

性能调优

关键参数:

  • --quota-backend-bytes:设置存储配额(默认2GB)。
  • --snapshot-count:触发快照的日志条数(默认10000)。
  • --heartbeat-interval--election-timeout:Raft超时设置(默认100ms和1000ms)。

总结与最佳实践

  1. 节点数量:生产环境至少3节点,5节点更安全。
  2. 磁盘选择:使用SSD,避免网络存储(如NFS)。
  3. 监控指标:通过/metrics端点监控:
    • etcd_server_leader_changes_seen_total:领导切换次数。
    • etcd_disk_wal_fsync_duration_seconds:WAL同步延迟。
  4. 客户端配置
    • 使用连接池重用客户端。
    • 设置合理的超时(如--dial-timeout=5s)。
  5. 版本升级:遵循官方升级指南,通常需要滚动升级。

etcd作为分布式系统的核心组件,其稳定性和性能直接影响上层应用的可靠性。通过理解其核心原理,掌握单机和高可用部署方法,开发者能够构建出健壮的分布式系统基础设施。