这篇文章是Jason Wilder对于常见的服务项目发现ZookeeperDoozerEtcd所写的一篇博客,其原文地址例如以下:Open-Source
Service Discovery

服务发现是大多数分布式系统以及面向服务架构(SOA)的一个核心组成部分。

这个难题,简单来说,能够觉得是:当一项服务存在于多个主机节点上时,client端怎样决策获取对应正确的IP和port。

在传统情况下,当出现服务存在于多个主机节点上时,都会使用静态配置的方法来实现服务信息的注冊。可是当大型系统中。须要部署很多其它服务的时候,事情就显得复杂得多。在一个实时的系统中,因为自己主动或者人工的服务扩展,或者服务的新加入部署。还有主机的宕机或者被替换,服务的location信息可能会非常频繁的变化。

在这种场景下,为了避免不必要的服务中断,动态的服务注冊和发现就显得尤为重要。

关于服务发现的话题,已经非常多次被人所提及,并且也的确不断的在发展。

如今,笔者介绍一下该领域内一些open-source或者被常常被世人广泛讨论的解决方式,尝试理解它们究竟是怎样工作的。特别的是,我们会较为专注于每个解决方式的一致性算法,究竟是强一致性,还是弱一致性;执行时依赖。client的集成选择;以后最后这些特性的折中情况。

本文首先从几个强一致性的项目于開始。比方Zookeeper。Doozer,Etcd。这些项目主要用于服务间的协调,同一时候又可用于服务的注冊。

随后。本文将讨论一些在服务注冊以及发现方面比較有意思的项目,比方:Airbnb的SmartStack,Netflix的Eureka,Bitly的NSQ,Serf,Spotify and DNS,最后是SkyDNS。

问题陈述


        在定位服务的时候。事实上会有两个方面的问题:服务注冊(Service Registration)和服务发现(Service Discovery)。
  • 服务注冊—— 一个服务将其位置信息在中心注冊节点注冊的过程。

    该服务通常会将它的主机IP地址以及port号进行注冊,有时也会有服务訪问的认证信息,使用协议,版本,以及关于环境的一些细节信息。

  • 服务发现—— client端的应用实例查询中心注冊节点以获知服务位置的过程。
        每个服务的服务注冊以及服务发现。都须要考虑一些关于开发以及运营方面的问题:
  • 监控—— 当一个已注冊完成的服务失效的时候。怎样处理。一些情况下,在一个设定的超时定时(timeout)后,该服务马上被一个其它的进程在中心注冊节点处注销。这样的情况下,服务通常须要执行一个心跳机制,来确保自身的存活状态。而客户端必定须要能够可靠处理失效的服务。

  • 负载均衡—— 假设多个同样地位的服务都注冊完成,怎样在这些服务之间均衡全部client的请求负载?假设有一个master节点的话。能否够正确处理client訪问的服务的位置。
  • 集成方式—— 信息注冊节点是否须要提供一些语言绑定的支持。比方说。仅仅支持Java?集成的过程是否须要将注冊过程以及发现过程的代码嵌入到你的应用程序中。或者使用一个类似于集成助手的进程?
  • 执行时依赖—— 是否须要JVM,ruby或者其它在你的环境中并不兼容的执行时?
  • 可用性考虑—— 假设系统失去一个节点的话,是否还能正常工作?系统能否够实时更新或升级,而不造成不论什么系统的瘫痪?既然集群的信息注冊节点是架构中的中心部分,那该模块是否会存在单点故障问题?


强一致性的Registries

        首先介绍的三个服务注冊系统都採用了强一致性协议,实际上为达到通用的效果,使用了一致性的数据存储。

虽然我们把它们看作服务的注冊系统,事实上它们还能够用于协调服务来协助leader选举,以及在一个分布式clients的集合中做centralized locking。


Zookeeper


Zookeeper是一个集中式的服务。该服务能够维护服务配置信息。命名空间,提供分布式的同步,以及提供组化服务。Zookeeper是由Java语言实现,实现了强一致性(CP),而且是使用Zab协议在ensemble集群之间协调服务信息的变化。

Zookeeper在ensemble集群中执行3个。5个或者7个成员。众多client端为了能够訪问ensemble。须要使用绑定特定的语言。

这样的訪问形式被显性的嵌入到了client的应用实例以及服务中。

服务注冊的实现主要是通过命令空间(namespace)下的ephemeral nodes。ephemeral nodes仅仅有在client建立连接后才存在。

当client所在节点启动之后,该client端会使用一个后台进程获取client的位置信息,并完毕自身的注冊。假设该client失效或者失去连接的时候。该ephemeral
node就从树中消息。

服务发现是通过列举以及查看详细服务的命名空间来完毕的。

Client端收到眼下全部注冊服务的信息,不管一个服务是否不可用或者系统新加入了一个同类的服务。

Client端同一时候也须要自行处理全部的负载均衡工作,以及服务的失效工作。

Zookeeper的API用起来可能并没有那么方便。由于语言的绑定之间可能会造成一些细小的差异。假设使用的是基于JVM的语言的话,Curator Service Discovery Extension可能会对你有帮助。

因为Zookeeper是一个CP强一致性的系统,因此当网络分区(Partition)出故障的时候,你的部分系统可能将出出现不能注冊的情况。也可能出现不能找到已存在的注冊信息,即使它们可能在Partition出现期间仍然正常工作。特殊的是。在不论什么一个non-quorum端,不论什么读写都会返回一个错误信息。

Doozer


Doozer是一个一致的分布式数据存储系统,Go语言实现,通过Paxos算法来实现共识的强一致性系统。这个项目开展了数年之后,停滞了一段时间,并且如今也关闭了一些fork数,使得fork数降至160 。

.不幸的是,如今非常难知道该项目的实际发展状态,以及它是否适合使用于生产环境。

Doozer在集群中执行3,5或者7个节点。和Zookeeper类似,Client端为了訪问集群,须要在自身的应用或者服务中使用特殊的语言绑定。

Doozer的服务注冊就没有Zookeeper这么直接,由于Doozer没有那些ephemeral node的概念。一个服务能够在一条路径下注冊自己,假设该服务不可用的话。它也不会自己主动地被移除。

现有非常多种方式来解决这种问题。一个选择是给注冊进程加入一个时间戳和心跳机制,随后在服务发现进程中处理那些超时的路径,也就是注冊的服务信息,当然也能够通过另外一个清理进程来实现。

服务发现和Zookeeper非常类似。Doozer能够罗列出指定路径下的全部入口,随后能够等待该路径下的随意修改。假设你在注冊期间使用一个时间戳和心跳,你就能够在服务发现期间忽略或者删除不论什么过期的入口,也就是服务信息。

和Zookeeper一样,Doozer是一个CP强一致性系统,当发生网络分区故障时。会导致相同的后果。

Etcd


Etcd是一个高可用的K-V存储系统,主要应用于共享配置、服务发现等场景。

Etcd能够说是被Zookeeper和Doozer催生而出。整个系统使用Go语言实现,使用Raft算法来实现选举一致。同一时候又具有一个基于HTTP+JSON的API。

Etcd,和Doozer和Zookeeper相似,通常在集群中执行3,5或者7个节点。client端能够使用一种特定的语言进行绑定。同一时候也能够通过使用HTTP客户端自行实现一种。

服务注冊环节主要依赖于使用一个key TTL来确保key的可用性。该key TTL会和服务端的心跳捆绑在一起。假设一个服务在更新key的TTL时失败了,那么Etcd会对它进行超时处理。假设一个服务变为不可用状态,client会须要处理这种连接失效。然后尝试另连接一个服务实例。

服务发现环节设计到罗列在一个文件夹下的全部key值。随后等待在该文件夹上的全部变动信息。

因为API接口是基于HTTP的,所以client应用会的Etcd集群保持一个long-polling的连接。

因为Etcd使用Raft一致性协议,故它应该是一个强一致性系统。Raft须要一个leader被选举,然后全部的client请求会被该leader所处理。然而,Etcd似乎也支持从non-leaders中进行读取信息,使用的方式是在读情况下提高可用性的未公开的一致性參数。在网络分区故障期间,写操作还是会被leader处理,并且相同会出现失效的情况。

关于作者:

孙宏亮,DAOCLOUD软件project师。两年来在云计算方面主要研究PaaS领域的相关知识与技术。

坚信轻量级虚拟化容器的技术,会给PaaS领域带来深度影响,甚至决定未来PaaS技术的走向。

转载请注明出处。

本文很多其它出于我本人的理解,肯定在一些地方存在不足和错误。

希望本文可以对接触服务发现的人有些帮助,假设你对这方面感兴趣,并有更好的想法和建议,也请联系我。

我的邮箱:allen.sun@daocloud.io
新浪微博:@莲子弗如清


欢迎关注Docker源代码分析公共数量

开源服务发现项目Zookeeper,Doozer,Etcd的更多相关文章

  1. 开源的服务发现项目Zookeeper,Doozer,Etcd - 木精灵的技术博客 - CSDN博客

    开源的服务发现项目Zookeeper,Doozer,Etcd - 木精灵的技术博客 - CSDN博客   http://blog.csdn.net/shlazww/article/details/38 ...

  2. 服务发现:Zookeeper vs etcd vs Consul 参考自http://dockone.io/article/667

    服务发现:Zookeeper vs etcd vs Consul [编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预 ...

  3. 服务发现:Zookeeper vs etcd vs Consul

    [编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务 ...

  4. 服务发现:Zookeeper vs etcd vs Consul_转

    转自:https://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=208173179&idx=1&sn=392c17b136c2 ...

  5. 阿里开源服务发现组件 Nacos快速入门

    最近几年随着云计算和微服务不断的发展,各大云厂商也都看好了微服务解决方案这个市场,纷纷推出了自己针对微服务上云架构的解决方案,并且诞生了云原生,Cloud Native的概念. 云原生是一种专门针对云 ...

  6. 服务发现框架选型: Consul、Zookeeper还是etcd ?

    背景 本文并不介绍服务发现的基本原理.除了一致性算法之外,其他并没有太多高深的算法,网上的资料很容易让大家明白上面是服务发现.想直接查看结论的同学,请直接跳到文末.目前,市面上有非常多的服务发现工具, ...

  7. 服务发现框架选型,Consul还是Zookeeper还是etcd

    背景 本文并不介绍服务发现的基本原理.除了一致性算法之外,其他并没有太多高深的算法,网上的资料很容易让大家明白上面是服务发现. 想直接查看结论的同学,请直接跳到文末. 目前,市面上有非常多的服务发现工 ...

  8. Zookeeper vs. etcd

    etcd是go语言实现的. 对比,可以参考这篇文章: http://studygolang.com/articles/4837 <服务发现:Zookeeper vs etcd vs Consul ...

  9. 使用Python进行分布式系统协调 (ZooKeeper/Consul/etcd)

    来源:naughty 链接:my.oschina.net/taogang/blog/410864 笔者之前的博文提到过,随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式 ...

随机推荐

  1. 详细说明XML分解(两)—DOM4J

    第一部分关于博客XML三接口,同时也为学习DOM4J该分析工具做准备.一般解析器基本上都实现了DOM和SAX这两组接口,DOM4J自然也不例外..DOM4J仅仅是经常使用解析器的当中一种,只是既然是实 ...

  2. 《Java程序书面采访猿收藏》之 instanceof的作用是什么

    instanceof它是Java二元运算语言,它的作用是推断对象变量引用被指向的类型是一类(或接口.抽象类.父亲)示例.即,对象是否是它的一个实例离开它的类的权.返回boolean数据类型. 常见的使 ...

  3. effective c++ 条款3 use const whereever you can

    1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello& ...

  4. Directx11学习笔记【十六】 光照模型的实现

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5579289.html 在之前的场景绘制中我们都是给每个顶点指定了单 ...

  5. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  6. 【DataStructure】Some useful methods about linkedList(三)

    Method 4: Gets the value of element number i For example, if list is {22, 33, 44, 55, 66, 77, 88, 99 ...

  7. 【C语言探索之旅】 第三课:你的第一个程序

    内容简介 1.课程大纲 2.第一部分第三课:你的第一个程序 3.第一部分第四课预告:变量的世界 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个 ...

  8. axWindowsMediaPlayer1获取音频长度

    OpenFileDialog openFileDialog1 = new OpenFileDialog { InitialDirectory = "c:\\", Filter = ...

  9. 每天进步一点点——Linux文件锁编程flock

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/30083015 1. 场景概述     在多线程开发中.相互排斥锁能够用于对临界资源的保护,防 ...

  10. Chapter 1 Securing Your Server and Network(5):使用SSL加密会话

    原文:Chapter 1 Securing Your Server and Network(5):使用SSL加密会话 原文出处:http://blog.csdn.net/dba_huangzj/art ...