技术分享| Etcd如何实现分布式负载均衡及分布式通知与协调
Etcd 是一个高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。Etcd比较多的应用场景是用于服务注册与发现(前面文章已经介绍过),除此之外,也可用于键值对存储,应用程序可以读取和写入 Etcd中的数据(类似于内存数据库redis),还可用于分布式系统系统的消息发布与订阅,分布式的通知与协调,以及分布式系统中的负载均衡等等。
消息发布与订阅
在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
应用中用到的一些配置信息放到 Etcd 上进行集中管理。这类场景的使用方式通常是这样:应用在启动的时候主动从 Etcd 获取一次配置信息,同时,在 Etcd 节点上注册一个Watcher并等待,以后每次配置有更新的时候,Etcd 都会实时通知订阅者,以此达到获取最新配置信息的目的。
分布式搜索服务中,索引的元信息和服务器集群机器的节点状态存放在Etcd中,供各个客户端订阅使用。使用Etcd的key TTL功能可以确保机器状态是实时更新的。
分布式通知与协调
这里讲的分布式通知与协调,与消息发布和订阅有些相似。在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
这里用到了 Etcd 中的 Watcher 机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更做到实时处理。实现方式通常是这样:不同系统都在 Etcd 上对同一个目录进行注册,同时设置 Watcher 观测该目录的变化(如果对子目录的变化也有需要,可以设置递归模式),当某个系统更新了 Etcd 的目录,那么设置了 Watcher 的系统就会收到通知,并作出相应处理。
分布式通知与协调的原理及方法:
- 通过Etcd进行低耦合的心跳检测。检测系统和被检测系统通过Etcd上某个目录关联而非直接关联起来,这样可以大大减少系统的耦合性。
- 通过Etcd完成系统调度。某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台做的一些操作,实际上只需要修改Etcd上某些目录节点的状态,而Etcd就会自动把这些变化通知给注册了Watcher的推送系统客户端,推送系统再做出相应的推送任务。
- 通过Etcd完成工作汇报。大部分类似的任务分发系统,子任务启动后,到Etcd来注册一个临时工作目录,并且定时将自己的进度进行汇报(将进度写入到这个临时目录),这样任务管理者就能够实时知道任务进度。
负载均衡
在分布式系统中,为了保证服务的高可用以及数据的一致性,通常都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。这样的实现虽然会导致一定程度上数据写入性能的下降,但是却能实现数据访问时的负载均衡。因为每个对等服务节点上都存有完整的数据,所以用户的访问流量就可以分流到不同的机器上。
Etcd自己的负载均衡:
Etcd本身分布式架构存储的信息访问支持负载均衡。Etcd集群化以后,每个Etcd的核心节点都可以处理用户的请求。所以,把数据量小但是访问频繁的消息数据直接存储到Etcd中也是个不错的选择,如业务系统中常用的二级代码表。二级代码表的工作过程一般是这样,在表中存储代码,在Etcd中存储代码所代表的具体含义,业务系统调用查表的过程,就需要查找表中代码的含义。所以如果把二级代码表中的小量数据存储到Etcd中,不仅方便修改,也易于大量访问。
Etcd给其他应用提供负载均衡功能:
利用Etcd维护一个负载均衡节点表。Etcd可以监控一个集群中多个节点的状态,当有一个请求发过来后,可以轮询式地把请求转发给存活着的多个节点。类似KafkaMQ,通过Zookeeper来维护生产者和消费者的负载均衡。同样也可以用Etcd来做Zookeeper的工作。