etcd简介

etcd 是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。在很多分布式系统架构中得到了广泛的应用,它内部采用 raft协议 作为一致性算法,基于Go语言实现。其主要功能有服务注册与发现、消息发布与订阅、负载均衡、分布式通知与协调、分布式锁、分布式队列、集群监控与 leader 选举等。

主要具有以下几个特点:

  • 简单:安装配置简单,易于部署,易使用。基于 HTTP+JSON 的 API 让你用 curl 就可以轻松使用。
  • 安全:支持 SSL 证书验证。
  • 键值对存储:将数据存储在分层组织的目录中,如同在标准文件系统中。
  • 监测变更:监测特定的键或目录以进行更改,并对值的更改做出反应。
  • 快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作。
  • 可靠:采用raft算法,实现分布式系统数据的可用性和一致性。

存储特点

etcd 是一个 键值存储 的组件,其他的应用都是基于其键值存储的功能展开。etcd 的存储有如下特点:

  • 采用kv型数据存储,一般情况下比关系型数据库快。
  • 支持动态存储(内存)以及静态存储(磁盘)。
  • 分布式存储,可集成为多节点集群。
  • 存储方式,采用类似目录结构。
    • 只有叶子节点才能真正存储数据,相当于文件。
    • 叶子节点的父节点一定是目录,目录不能存储数据。

etcd应用场景

etcd 的场景默认处理的数据都是系统中的控制数据。所以etcd在系统中的角色不是其他NoSQL产品的替代品,更不能作为应用的主要数据存储。etcd中应该 尽量只存储系统中服务的配置信息,对于应用数据只推荐把数据量很小,但是更新和访问频次都很高的数据存储在etcd中。

服务发现(Service Discovery)

服务发现要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。

要解决服务发现的问题,需要具备下面三种必备属性:

  1. 一个强一致性、高可用的服务存储目录。 基于Ralf算法的etcd天生就是这样一个强一致性、高可用的服务存储目录。
  2. 一种注册服务和监控服务健康状态的机制。 用户可以在etcd中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达到监控健康状态的效果。
  3. 一种查找和连接服务的机制。 通过在 etcd 指定的主题(由服务名称构成的服务目录)下注册的服务也能在对应的主题下查找到。
images
images

消息发布与订阅

在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。