etcd 的性能怎么样?需要优化吗?
作者 | 陈星宇(宇慕) 阿里云基础技术中台技术专家
关注“Go语言中文网”公众号,回复关键词“入门”,即可下载从零入门 K8s 系列文章 PPT。
导读:etcd 是容器云平台用于存储关键元信息的组件。阿里巴巴使用 etcd 已经有 3 年的历史, 在今年 双11 过程中它又一次承担了关键角色,接受了 双11 大压力的检验。本文作者从 etcd 性能背景出发,带领我们了解了 etcd server 端性能优化及 etcd client 使用最佳实践,希望能够为大家运行一个稳定而且高效的 etcd 集群提供帮助。
etcd 简要介绍
理解 etcd 性能
etcd 性能优化 -server 端
1. etcd server 性能优化-硬件部署
server 端在硬件上需要足够的 CPU 和 Memory 来保障 etcd 的运行;
其次,作为一个非常依赖于磁盘 IO 的数据库程序,etcd 需要 IO 延迟和吞吐量非常好的 ssd 硬盘,etcd 是一个分布式的 key/value 存储系统,网络条件对它也很重要;
最后在部署上,需要尽量将它独立的部署,以防止宿主机的其他程序会对 etcd 的性能造成干扰。
2. etcd server 性能优化-软件
首先是针对于 etcd 的内存索引层:优化内部锁的使用减少等待时间。原来的实现方式是遍历内部引 BTree 使用的内部锁粒度比较粗,这个锁很大程度上影响了 etcd 的性能,新的优化减少了这一部分的影响,降低了延迟;
针对于lease 规模使用的优化:优化了 lease revoke 和过期失效的算法,将原来遍历失效 list 时间复杂度从 O(n) 降为 O(logn),解决了 lease 规模化使用的问题;
最后是针对于后端 boltdb的使用优化:将后端的 batch size limit/interval 进行调整,这样就能根据不同的硬件和工作负载进行动态配置,这些参数以前都是固定的保守值;
还有一点是由谷歌工程师优化的完全并发读特性:优化调用 boltdb tx 读写锁使用,提升读性能。
3. 基于 segregated hashmap 的 etcd 内部存储 freelist 分配回收新算法
etcd 性能优化 -client 端
针对于 Put 操作避免使用大 value,精简精简再精简,例如 K8s 下的 crd 使用;
其次,etcd 本身适用及存储一些不频繁变动的 key/value 元数据信息。因此客户端在使用上需要避免创建频繁变化的 key/value。这一点例如 K8s下对于新的 node 节点的心跳数据上传就遵循了这一实践;
最后,我们需要避免创建大量的 lease,尽量选择复用。例如在 K8s下,event 数据管理:相同 TTL 失效时间的 event 同样会选择类似的 lease 进行复用,而不是创建新的 lease。
本文总结
首先我们理解了 etcd 性能背景,从背后原理了解潜在的性能瓶颈点; 解析 etcd server 端性能优化,从硬件/部署/内部核心软件算法等方面优化; 了解 etcd client 使用最佳实践;
推荐阅读
站长 polarisxu
自己的原创文章
不限于 Go 技术
职场和创业经验
Go语言中文网
每天为你
分享 Go 知识
Go爱好者值得关注