Etcd、Etcdctl 应用实践

2023年 1月 4日 55.3k 0

1. Etcd 基本介绍

Etcd 是一个分布式 Key/Value 的存储系统,通过分布式锁、leader 选举、写屏障(write barriers) 实现了分布式协作,提供高可用、持久化数据存储和检索服务。

  • 工作原理

每个 Etcd 节点都存储了一份完整的数据,任意时刻至多存在一个主节点。主节点处理所有来自客户端的写请求,并且通过 Raft 协议同步到其他节点。

  • 存储原理

Etcd 数据持久化使用 WAL (write ahead log,预写式日志) 格式,在提交之前先写入 WAL,默认每 1W 条记录,做完快照之后,WAL 文件会被删除。Etcd 在内存中,以 B 树对 Key 值建立索引,在磁盘中,以 B+ 树对 Value 进行存储记录历史版本。

2. Etcd 节点数要求

Etcd 节点越多,容错能力越强,写性能越差。官方推荐的 etcd 集群节点数量为 3,5,7。Etcd 集群最少需要 [N/2] + 1 个节点工作,才能保证集群正常。下面是集群节点数和最大容错节点数量对应表:

节点数最大容错
1 0
3 1
4 1
5 2
6 2
7 3
8 3
9 4

奇数个节点与偶数个节点,具有相同的容错能力。

3. 硬件环境要求

3.1 限制 Etcd 性能的因素

Etcd 对内存和 CPU 消耗并不高,足够就行。一次 Etcd 请求的最小时间 = 成员节点之间的网络往返时延 + 收到数据之后进行持久化的时延。因此,Etcd 的性能主要受两方面的约束:

  • 网络
  • 磁盘

多节点的 Etcd 集群成员节点应该尽量部署在同一个数据中心,减少网络时延。同一数据中心内,不同节点的网络情况通常是非常好的,如果需要测试可以使用 pingtcpdump 命令进行分析。下面主要讨论看看推荐的配置和硬盘 IO 测试方法。

3.2 CPU、内存建议配置

Cluster NodeData SizevCPUsMemory (GB)Max concurrent IOPSDisk bandwidth (MB/s)
50 no more than 100 MB 2 8 3600 56.25
250 no more than 500 MB 4 16 6000 93.75
1000 no more than 1 GB 8 32 8000 125
3000 more than 1 GB 16 64 16,000 250

3.3 硬盘 IOPS 测试方法

Etcd 对磁盘写入延时非常敏感,通常要求达到 50 IOPS 以上,对于高负载的集群应该达到 500 IOPS 。常用的磁盘基准测试工具 diskbench 、 fio 。这里以 CentOS 上使用 fio 为例:

  • 查看磁盘信息
1
2
3
4
5
fdisk -l

Disk /dev/vda: 107.4 GB, 107374182400 
...
Disk /dev/vdb: 34.4 GB, 34359738368
  • 安装 fio
1
yum install -y fio
  • io 测试
1
2
3
fio -filename=/dev/vda -direct=1 -iodepth 64 -thread -rw=randwrite  -ioengine=libaio -bs=4K  -numjobs=8 -runtime=120 -group_reporting -name=test1

    write: IOPS=1288, BW=5153KiB/s (5277kB/s)(605MiB/120206msec)
1
2
3
fio -filename=/dev/vda -direct=1 -iodepth 64 -thread -rw=write  -ioengine=libaio -bs=512K  -numjobs=8 -runtime=120 -group_reporting -name=test2

    write: IOPS=102, BW=51.1MiB/s (53.6MB/s)(2453MiB/48023msec)

其中,filename 为测试设备,更多参数可以查看上面的 GitHub 链接。这里得到 IOPS 为 1288,磁盘带宽为 53.6 MB/s 。

4. 安装 Etcdctl

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
export ETCD_VER=v3.4.10
export ETCD_DIR=etcd-download
export DOWNLOAD_URL=https://github.com/coreos/etcd/releases/download

mkdir ${ETCD_DIR}
cd ${ETCD_DIR}
wget ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar -xzvf etcd-${ETCD_VER}-linux-amd64.tar.gz

cp etcd-${ETCD_VER}-linux-amd64/etcdctl /usr/local/bin/

在使用 Etcdctl 过程中,需要节点证书。有两种方式提供证书:

  • 在命令行中
  • 1
    
    ETCDCTL_API=3 etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-node1.pem --key=/etc/ssl/etcd/ssl/node-node1-key.pem endpoint health
    

    这样就要求,每条 Ectdctl 命令都需要加上证书和版本相关参数。

  • 通过环境变量注入
  • 1
    2
    3
    4
    
    export ETCDCTL_API=3
    export ETCDCTL_CACERT=/etc/ssl/etcd/ssl/ca.pem
    export ETCDCTL_CERT=/etc/ssl/etcd/ssl/node-node1.pem
    export ETCDCTL_KEY=/etc/ssl/etcd/ssl/node-node1-key.pem
    

    可以将这些环境变量设置在 /etc/profile 中,然后 source /etc/profile ,就可以直接使用下面的命令进行操作。

    1
    
    etcdctl endpoint health
    

    5. Etcdctl 常见运维操作

    • 获取 etcd 版本
    1
    
    etcdctl  version
    
    • 查看节点
    1
    
    etcdctl member list
    
    • 增删节点

    增加节点

    1
    
    etcdctl member add etcd-member-node  http://192.168.11.102:2383
    

    删除节点

    1
    
    etcdctl member remove 9855cd41eff59e2b
    
    • 备份和恢复

    备份

    1
    
    etcdctl snapshot save snapshot-xxx.db
    

    恢复时,需要停止全部 apiserver、etcd 实例,删除当前的 etcd 数据,然后拷贝备份数据到每个 etcd 节点上,执行命令

    1
    
    etcdctl snapshot restore snapshot-xxx.db
    
    • 查看集群状态
    1
    
    etcdctl endpoint health
    
    • 增删改查

    具体某个 Key

    1
    
    etcdctl get /registry/namespaces/default
    

    根据前缀查询

    1
    
    etcdctl get / --prefix --keys-only
    

    增加/修改

    1
    
    etcdctl put key newVaule
    
    1
    
    etcdctl del key
    

    6. 参考

    • https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/hardware.md

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论