etcd应用

etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如果让服务快速透明地接入到计算集群中。如果让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。
etcd:A highly-available key value store for shared configuration and service discovery.
实际上,etcd作为一个受到zk和docker启发而催生的项目,除了拥有与之类似的功能外,更具有以下4个特点。
(1)简单:基于HTTP+JSON的API让你用curl命令就可以轻松使用。
(2)安全:可选SSL客户认证机制
(3)快速:每个实例每秒支持一千多写操作
(4)可信:使用Raft算法充分实现了分布式

分布式系统中的数据分为控制数据和应用数据。使用etcd的场景处理的数据默认为控制数据,对于应用数据,只推荐处理数据量很小,但是更新访问频繁的情况。

1. 服务发现

服务发现(Service Discovery)要解决的是分布式系统中最常用的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。从本质上说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以进行查找和连接。要解决服务发现的问题,需要有三大支柱:
(1)一个强一致性、高可用的服务存储目录。基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录。
(2)一种注册服务和监控服务健康状态的机制。用户可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果
(3)一种查找和连接服务的机制。通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,可以在每个服务器上部署一个proxy模式的etcd,这样就可以确保能访问etcd集群的服务都能互相连接。

下面我们一起看服务发现对应的具体应用场景。
(1)微服务协同工作架构中,服务动态添加。
多种微服务共同协作,构成一个功能相对强大的架构的案例越来越多。透明化的动态添加这些服务的需求也日益强烈。通过服务发现机制,在etcd中注册某个服务名字的目录,在该目录下存储可用的服务节点的IP。在使用服务的过程中,只要从服务目录下查找可用的服务节点进行使用即可。
(2)PaaS平台中应用多实例与实力故障重启透明化。
PaaS平台中的应用一般都有多个实例,通过域名,不仅可以透明地对多个实例进行访问,而且还可以实现负载均衡。但是应用的某个实例随时都有可能故障重启,这时就需要动态地配置域名解析中的信息。通过etcd的服务发现功能就可以轻松解决这个动态配置的问题。

2. 信息发布与订阅

在分布式系统中,最为适用的组件见通信方式是消息发布与订阅机制。具体而言,即构建一个配置共享中心,数据提供者在这个配置中心发布信息,而信息使用者则订阅他们关心的主题,一旦相关主题有信息发布,就会实时通知订阅者。通过这种方式可以实现分布式系统配置的集中式管理与实时动态更新。
(1)应用中用到的一些信息存放在etcd上进行集中管理。这类场景的使用方式通常是这样的:应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的。
(2)分布式搜索服务中,索引的源信息和服务器集群的节点状态信息存放在etcd中,供各个客户端订阅使用。使用etcd的key TTL供可以确保机器状态是实时更新的。
(3)分布式日志收集系统。这个系统的核心工作是收集分布在不同机器上的日志。收集器通常按照应用(或主题)来分配收集任务单元,因此可以在etcd上创建一个以应用(或主题)命名的目录P,并将这个应用相关的所有机器IP,以子目录的形式存储在目录P下,然后设置一个递归的etcd Watcher,递归式地监控应用目录下所有信息的变动。这样就试下了在机器IP(信息)发生变动时,能够实时通知收集器调整任务分配。
(4)系统中信息需要动态自动获取与人工干预修改信息请求内容的情况。通常的解决方案是对外暴露接口,来获取一些运行时的信息或提交修改的请求,而引入etcd之后,只需要将这些信息存放到指定的etcd目录中,即可通过HTTP接口直接被外部访问。

3. 负载均衡

本节的负载均衡指软负载均衡。在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。这样的实现虽然会导致一定程度上数据写入性能的下降,但是却能实现数据访问时的负载均衡。因为每个对等服务节点上都存有完整的数据,所以用户的访问流量就可以分流到不同的机器上。
(1)etcd本身分布式架构存储的信息访问支持负载均衡。etcd集群化以后,每个etcd的核心节点都可以处理用户的请求。所以,把数据量小但是访问频繁的消息数据直接存储到etcd中也是个不错的选择。
(2)利用etcd维护一个负载均衡节点表。etcd可以监控一个集群中多个节点的状态,当有一个请求发过来后,可以轮询式地把请求转发给存活着的多个节点。

4. 分布式通知与协调

与消息发布和订阅有些相似。两者都使用了etcd的watcher机制,通过注册于异步通知截止,实现分布式环境下不同系统之间的通知与协调,从而对数据变更进行实时处理。实现方式通常为:不同系统都在etcd上对同一个目录进行注册,同时设置watcher监控该目录的变化,当某个系统更新了etcd的目录,那么设置了watcher的系统就会收到通知,并作出相应处理。
(1)通过etcd记性低耦合的心跳检测。检测系统和被检测系统通过etcd上某个目录关联而非直接关联起来,这样可以大大减少系统的耦合性。
(2)通过etcd完成系统调度。某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台做的一些操作,实际上只需要修改etcd上某些目录节点的状态,而etcd就会自动把这些变化通知给注册了watcher的推送客户端,推送系统再做出相应的推送任务。
(3)通过etcd完成工作汇报。大部分类似的任务分发系统,子任务启动后,到etcd来注册一个临时工作目录,并且定时将自己的精度进行汇报(将精度写入到这个临时目录),这样任务管理者就能够实时知道任务进度。

5. 分布式锁

因为etcd使用Raft算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。
(1)保持独占,即所有试图获取锁的用户最终只有一个可以得到。etcd为此提供了一套实现分布式锁原子操作CAS的API。通过设置prevExist值,可以保证在多个节点同时创建某个目录时,只有一个成功,而该用户即可认为是获得了锁。
(2)控制时序,即所有试图获取锁的用户都会进入等待队列,获得锁的顺序是全局唯一的,同时决定了队列执行顺序。etcd为此也提供了一套API。

6. 分布式队列

 

posted @ 2019-06-26 10:47  小路不懂2  阅读(774)  评论(0编辑  收藏  举报