etcd

etcd介绍和应用场景

Posted by Liangjf on December 31, 2019

etcd介绍和应用场景

etcd架构

  • 网络层(http(s) server)
  • Raft模块
  • 复制状态机
  • 存储模块

etcd介绍

etcd是和zookeeper“差不多”的分布式的可靠的键值存储,用于存储分布式系统中最关键的数据。一般是用于配置中心,服务注册发现,分布式锁。

etcd是go语言写的,目前应用于很多流行的开源软件,如:

  • Kubernetes(etcd是服务发现和存储集群状态和配置的后端)
  • Rook(etcd是Rook的编排引擎)
  • M3(是Prometheus开发的大型监控平台,使用etcd进行规则存储等功能)
  • OpenStack(etcd作为配置存储、分布式密钥锁定等的可选提供者)

开源看到基本是用于配置中心和分布式一致性的协调者。

简单

etcd是使用很简单,提供了Restful接口和工具来访问etcd,比如可以使用curl工具来测试和使用,这样在平时的开发和线上环境可以很方便,简单的对etcd进行操作。

同时etcd提供了 gRPC 接口,可以通过 Protobuf 和 gRPC 直接对 etcd 中存储的数据进行管理。

键值存储

提供了类linux文件系统的文件组织设计,如

通过这样的文件路径,我们可以有目录,文件等概念,可以实现针对“单个文件”,“整个目录”下的文件来做一些kv处理,比如prefix前缀get等。

watch键变化

观察特定键或目录的变化,并对值的变化做出通知。etcd的watch机制巧妙的借助了go中的chan机制,对于监控的键有变化,其实是通过chan来通知的,因此在监控的时候,我们new出watch的时候,需要对返回的watchChan进行select case的等待chan操作。

在实际应用中,比如不同的app,但是有一些公用的,不经常改变或者想热更的配置,那就就可以使用etcd,app直接在etcd上监听对应的配置key,然后有变化,那么app就会收到变化,在代码中可以做对应的处理。

etcd的特点

  • 简单:支持 REST 风格的 HTTP+JSON API
  • 安全:支持 HTTPS 方式的访问
  • 快速:支持并发 1k/s 的写操作
  • 可靠:支持分布式结构,基于 Raft 的一致性算法

etcd v3相对于etcd v2,多余了支持https访问,支持SSL,所以在安全性方面是优于etcd v2的。

单实例压测并发1K/s ks可能并发看起来不高,但是可以通过负载均衡来达到更高的并发。

可以把etcd的实现分为Raft 协议存储两大模块。这里先不展开raft协议了,后面会单独介绍和分析。

多样化的 API

etcd 多样化的 API:

  • Raft层被其他开源项目 TiKV,CockroachDB重用。
  • KeepAlive 是绑定在 client-agnostic 的 Lease 抽象层。
  • Watch 可以得到连续性的事件,借助chan。
  • 类似 Kafka,能通过 index(版本号) 重新得到原来的消息。
  • 提供 Range query(持久化是Btree)。
  • 提供 Transaction API。
  • 默认提供因果一致性。用户可选串行化隔离

应用场景

  • 场景一:服务发现
  • 场景二:消息发布与订阅
  • 场景三:负载均衡
  • 场景四:分布式通知与协调
  • 场景五:分布式锁、分布式队列
  • 场景六:集群监控与Leader竞选

部署方案

在一个分布式系统中,etcd 往往都扮演了非常重要的地位,很多服务配置发现以及配置的信息都存储在 etcd的,所以整个集群可用性的上限决定 etcd 的可用性,使用 3 ~ 5 个 etcd 节点构成高可用的集群往往都是常规操作。(为什么奇数?因为raft协议)

总结

总的来说,etcd是非常易用,并且应用场景还是挺广的,逐渐的在项目开发中,也引入了etcd用来做配置中心了。更多的坑后面踩到了再分享。