闲谈etcd(一)

简介

etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,具有一定的一致性、高性能、高可用的方案。

etcd 提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。etcd 机器之间的通信通过 Raft 算法处理,可以优雅地处理网络分区期间的 leader 选举,以应对机器的故障。

etcd 采用 Go 语言编写,它具有出色的跨平台支持,很小的二进制文件和强大的社区。 类似的 zookeeper,但没有 zookeeper 那么重,功能也没有覆盖那么多。

etcd 比较多的应用场景是用于服务注册与发现,除此之外,也可以用于键值对存储,应用程序可以读取和写入 etcd 中的数据。

使用场景

键值对存储

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

etcd采用kv型数据存储,一般情况下比关系型数据库快。支持动态存储(内存)以及静态存储(磁盘)。

存储方式,采用类似目录结构。分布式存储,可集成为多节点集群。

只有叶子节点才能真正存储数据,叶子节点的父节点一定是目录,目录不能存储数据。

etcd leader 的延迟是要跟踪的最重要的指标,并且内置仪表板具有专用于此的视图。在我们的测试中,严重的延迟会在集群内造成不稳定,因为 Raft 的速度仅与大多数机器中最慢的机器一样快。我们可以通过适当地调整群集来缓解此问题。etcd 已在具有高度可变网络的云提供商上进行了预调。

服务注册与发现

服务注册与发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。从本质上说,服务发现就是要了解集群中是否有进程在监听 UDP 或者 TCP 端口,并且通过名字就可以进行查找和链接。

基于 Raft 算法(目前最稳定、功能丰富的共识算法之一)的 etcd 天生就是强一致性、高可用的服务存储目录。用户可以在 etcd 中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达到监控健康状态的效果。

通过在 etcd 指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,可以在每个服务机器上都部署一个 Proxy 模式的 etcd,这样就可以确保访问 etcd 集群的服务都能够互相连接。

消息发布与订阅

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

 

应用中用到的一些配置信息放到etcd上进行集中管理。应用在启动的时候主动从etcd获取一次配置信息,在etcd节点上注册一个Watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的。

分布式通知与协调

构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。通过etcd中的Watcher机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更做到实时处理。

不同系统都在etcd上对同一个目录进行注册,同时设置Watcher观测该目录的变化(如果对子目录的变化也有需要,可以设置递归模式),当某个系统更新了etcd的目录,那么设置了Watcher的系统就会收到通知,并作出相应处理。

通过etcd进行低耦合的心跳检测。检测系统和被检测系统通过etcd上某个目录关联而非直接关联起来,这样可以大大减少系统的耦合性。

通过etcd完成系统调度。某系统由控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台做的一些操作,实际上是修改了etcd上某些目录节点的状态,而etcd就把这些变化通知给注册了Watcher的推送系统客户端,推送系统再作出相应的推送任务。

分布式锁

因为etcd使用Raft算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。

保持独占即所有获取锁的用户最终只有一个可以得到。etcd为此提供了一套实现分布式锁原子操作CAS(CompareAndSwap)的API。通过设置prevExist值,可以保证在多个节点同时去创建某个目录时,只有一个成功。而创建成功的用户就可以认为是获得了锁。

控制时序,即所有想要获得锁的用户都会被安排执行,但是获得锁的顺序也是全局唯一的,同时决定了执行顺序。etcd为此也提供了一套API(自动创建有序键),对一个目录建值时指定为POST动作,这样etcd会自动在目录下生成一个当前最大的值为键,存储这个新的值(客户端编号)。同时还可以使用API按顺序列出所有当前目录下的键值。此时这些键的值就是客户端的时序,而这些键中存储的值可以是代表客户端的编号。

为什么用etcd而不用ZooKeeper?

etcd实现的这些功能,ZooKeeper都能实现。那么为什么要用etcd而非直接使用ZooKeeper?

  1. ZooKeeper的部署维护复杂,管理员需要掌握一系列的知识和技能。而Paxos强一致性算法也是素来以复杂难懂而闻名于世。ZooKeeper的使用也比较复杂,需要安装客户端,官方只提供了Java和C两种语言的接口。
  2. Java编写,Java本身就偏向于重型应用,它会引入大量的依赖。而运维人员则普遍希望保持强一致、高可用的机器集群尽可能简单,维护起来也不易出错。
  3. 发展缓慢,由于基金会庞大的结构以及松散的管理导致项目发展缓慢。

相比ZooKeeper,etcd有以下优点:

  1. 简单。使用Go语言编写部署简单。使用HTTP作为接口使用简单,使用Raft算法保证强一致性让用户易于理解。
  2. 数据持久化,etcd默认数据一更新就进行持久化。
  3. 安全,etcd支持SSL客户端安全认证。
  4. 发展迅速,etcd正处于高速迭代开发中。

etcd现在还没有经过大型项目长时间的检验,但是目前CoreOS、Kubernetes和CloudFoundry等知名项目均在生产环境中使用了etcd。所以总的来说,etcd值得去学习和尝试的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值