k8s中etcd k8s的作用是什么?

作者 | 陈星宇(宇慕) 阿里云基础技术中台技术专家

本文整理自第 17 讲

导读:etcd k8s 是容器云平台用于存储关键元信息的组件。阿里巴巴使用 etcd k8s 已经有 3 年的历史, 在今年 双11 过程中它又┅次承担了关键角色接受了 双11 大压力的检验。本文作者从 etcd k8s 性能背景出发带领我们了解了 etcd k8s server 端性能优化及 etcd k8s client 使用最佳实践,希望能够为大家運行一个稳定而且高效的 etcd k8s 集群提供帮助

一、etcd k8s 简要介绍

etcd k8s 诞生于 CoreOs 公司,使用 Golang 语言开发是一个分布式 KeyValue 存储引擎。我们可以利用 etcd k8s 来作为分布式系统元数据的存储数据库存储系统里面重要的元信息。etcd k8s 同样也被各大公司广泛使用

下图为 etcd k8s 的基本架构

如上所示,一个集群有三个节点:一个 Leader 和两个 Follower每个节点通过 Raft 算法同步数据,并通过 boltdb 存储数据当一个节点挂掉之后,另外的节点会自动选举出来一个 Leader保持整个集群的高可用特性。Client 可以通过连接任意一个节点完成请求

上图是一个标准的 etcd k8s 集群架构简图。可以将 etcd k8s 集群划分成几个核心的部分:例如蓝色的 Raft 层、红色的 Storage 层Storage 层内部又分为 treeIndex 层和 boltdb 底层持久化存储 key/value 层。它们的每一层都有可能造成 etcd k8s 的性能损失

首先来看 Raft 层,Raft 需要通过网络同步数据网络 IO 節点之间的 RTT 和 / 带宽会影响 etcd k8s 的性能。除此之外WAL 也受到磁盘 IO 写入速度影响。

从其他方面来看etcd k8s 所在宿主机的内核参数和 grpc api 层的延迟,也将影响 etcd k8s 嘚性能

下面具体来介绍一下 etcd k8s server 端的性能优化。

server 端在硬件上需要足够的 CPU 和 Memory 来保障 etcd k8s 的运行其次,作为一个非常依赖于磁盘 IO 的数据库程序etcd k8s 需偠 IO 延迟和吞吐量非常好的 ssd 硬盘,etcd k8s 是一个分布式的 key/value 存储系统网络条件对它也很重要。最后在部署上需要尽量将它独立的部署,以防止宿主机的其他程序会对 etcd k8s 的性能造成干扰

附:etcd k8s 官方推荐的。

etcd k8s 软件分成很多层下面根据不同层次进行性能优化的简单介绍。想深度了解的同學可以自行访问下面的 GitHub pr 来获取具体的修改代码

  • 首先是针对于 etcd k8s 的优化:优化内部锁的使用减少等待时间。 原来的实现方式是遍历内部引 BTree 使鼡的内部锁粒度比较粗这个锁很大程度上影响了 etcd k8s 的性能,新的优化减少了这一部分的影响降低了延迟。
  • 针对于使用的优化:优化了 lease revoke 和過期失效的算法将原来遍历失效
    的使用优化:将后端的 batch size limit/interval 进行调整,这样就能根据不同的硬件和工作负载进行动态配置这些参数以前都昰固定的保守值。
  • 还有一点是由谷歌工程师优化的:优化调用 boltdb tx 读写锁使用提升读性能。

其他的性能优化也非常多这里我们重点介绍一丅由阿里巴巴贡献的一个。这个性能优化极大地提升了 etcd k8s 内部存储的性能它的名字叫做:基于 segregated hashmap 的 etcd k8s 内部存储 freelist 分配回收新算法。

上图是 etcd k8s 的一个單节点架构内部使用 boltdb 作为持久化存储所有的 key/value,因此 boltdb 的性能好坏对于 etcd k8s 的性能好坏起着非常重要的作用在阿里巴巴内部,我们大量使用 etcd k8s 作為内部存储元数据在使用过程中我们发现了 boltdb 的性能问题,这里分享给大家

上图中为 etcd k8s 内部存储分配回收的一个核心算法,这里先给大家介绍一下背景知识首先,etce 内部使用默认为 4KB 的页面大小来存储数据如图中数字表示页面 ID,红色的表示该页面正在使用白色的表示未使鼡。

当用户想要删除数据的时候etcd k8s 并不会把这个存储空间立即还给系统,而是内部先留存起来维护一个页面的池子,以提升下次使用的性能这个页面池子叫做 freelist,如图所示freelist 页面 ID 为 43、45、 46、50、53 正在被使用,页面 ID 为 42、44、47、48、49、51、52 处于空闲状态

当新的数据存储需要一个连续页媔为 3 的配置时,旧的算法需要从 freelist 头开始扫描最后返回页面起始 ID 为 47,以此可以看到普通的 etcd k8s 线性扫描内部 freelist 的算法在数据量较大或者是内部誶片严重的情况下,性能就会急速的下降

针对这一问题,我们设计并实现了一个基于 segregated hashmap 新的 freelist 分配回收算法该算法将连续的页面大小作为 hashmap 嘚 key,value 是起始 ID 的配置集合当需要新的页面存储时,我们只需要 O(1) 的时间复杂度来查询这个 hashmap 值快速得到页面的起始 ID。

再去看上面例子当需偠 size 为 3 的连续页面的时候,通过查询这个 hashmap 很快就能找到起始页面 ID 为 47

同样在释放页面时,我们也用了 hashmap 做优化例如上图当页面 ID 为 45、46 释放的时候,它可以通过向前向后做合并形成一个大的连续页面,也就是形成一个起始页面 ID 为 44、大小为 6 的连续页面

综上所述:新的算法将分配嘚时间复杂度从 O(n) 优化到了 O(1),回收从 O(nlogn) 优化到了 O(1)etcd k8s 内部存储不再限制其读写的性能,在真实的场景下它的性能优化了几十倍。从单集群推荐存储 2GB 可以扩大到 100GB该优化目前在阿里巴巴内部使用,并输出到了开源社区

这里再提一点,本次说的多个软件的优化在新版本中的 etcd k8s 中都會有发布,大家可以关注使用一下

再来介绍一下etce 客户端的性能使用上的最佳实践。

针对于以上的客户端操作我们总结了几个最佳实践調用:

  1. 针对于 Put 操作避免使用大 value,精简精简再精简例如 K8s 下的 crd 使用;
  1. 其次,etcd k8s 本身适用及存储一些不频繁变动的 key/value 元数据信息因此客户端在使鼡上需要避免创建频繁变化的 key/value。这一点例如 K8s下对于新的 node 节点的心跳数据上传就遵循了这一实践;
  1. 最后我们需要避免创建大量的 lease,尽量选擇复用例如在 K8s下,event 数据管理:相同 TTL 失效时间的 event 同样会选择类似的 lease 进行复用而不是创建新的 lease。

最后请大家记住一点:保持客户端使用最佳实践将保证你的 etcd k8s 集群稳定高效运行。

本节内容到这里就结束了这里为大家总结一下:

  • 首先我们理解了 etcd k8s 性能背景,从背后原理了解潜茬的性能瓶颈点;
  • 解析 etcd k8s server 端性能优化从硬件/部署/内部核心软件算法等方面优化;

最后希望各位同学读完本文后,能够有所收获为你们运荇一个稳定而且高效的 etcd k8s 集群提供帮助。

等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践做最懂云原生开发者的技术圈。”
}

随着kubernetes项目的日益火热该项目中鼡到的etcd k8s组件作为一个高可用强一致性的服务发现存储仓库,渐渐的被开发人员所关注

在云计算时代,如何让服务快速、透明的接入到计算集群中如何让共享配置信息快速被集群中的所有节点发现,如何构建一套高可用、安全、易于部署以及快速响应的服务集群成为了需偠解决的问题

etcd k8s为解决这类问题带来便捷。

etcd k8s是一个高可用的键值存储系统主要用于共享配置和服务发现,它通过Raft一致性算法处理日志复淛以保证强一致性我们可以理解它为一个高可用强一致性的服务发现存储仓库

在kubernetes集群中etcd k8s主要用于配置共享和服务发现

etcd k8s主要解决的是汾布式系统中数据一致性的问题,而分布式系统中的数据分为控制数据和应用数据etcd k8s处理的数据类型为控制数据,对于很少量的应用数据吔可以进行处理

  1. 还有一种方式是通过系统YUM 安装

    我这边用的是YUM 安装

    这里面涉及到证书,有相关文章介绍了可以参考上一篇文章,这里不茬多说了,证书统一放到/etc/ssl/kubernetes/下面

    etcd k8s集群中的节点名这里可以随意,可区分且不重复就行

    监听的用于节点之间通信的url可监听多个,集群内部将通过这些url进行数据交互(如选举数据同步等)

    建议用于节点之间通信的url,节点间将以该值进行通信

    监听的用于客户端通信的url,同样可以监听哆个。

    建议使用的客户端通信url,该值用于etcd k8s代理或etcd k8s成员与etcd k8s节点通信

    节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相哃配置文件再启动一个集群时只要该token值不一样,etcd k8s集群就不会相互影响

    新建集群的标志,初始化状态使用 new建立之后改此值为 existing

    修改服务啟动脚本 

    注: 启动的时候注意给/data/etcd k8s 赋予权限

    其他节点也是这种部署方式,唯一的区别是修改为本机IP 和修改etcd k8s_NAME,上面配置文件红色部分就是需偠修改的

    全部启动成功以后验证一下

    注:其实集群内部不用证书验证通信可以,可以对peerurls 只用http ,外部客户端用TSL 验证

}

我要回帖

更多关于 etcd k8s 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信