etcd 是一个分布式,一致性的 k-v 存储系统,用于共享配置和服务发现。etcd 使用 go 语言实现,并经过 Raft 一致性算法处理日志复制以保证强一致性。java
简单: 可以使用 curl 访问的用户 API(HTTP+JSON)
安全: 可选的SSL客户端证书认证
快速: 单实例每秒 1000 次写操做
可靠: 使用Raft保证一致性git
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其余分布式服务注册与发现的方案,好比 Airbnb 的 SmartStack 等相比,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,再也不须要依赖其余工具(好比 ZooKeeper 等)。使用起来也较 为简单。Consul 用 Golang 实现,所以具备自然可移植性(支持 Linux、windows 和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。github
Yahoo贡献给Apache基金会的一个顶级开源项目,基于Paxos算法,是Hadoop和HBase的重要组件。Zookeeper是为分布式应用设计的一个高性能协调服务,提供了以下的通用服务,如命名、配置管理、经过锁和分组服务,封装成简单易用的接口而无需开发人员从头编写代码。能够拿来即用,应用的领域有取得共识、分组管理、领导者选举和协议呈现。还能够按需自定义功能。算法
Zk和etcd的比较:docker
Eureka是Netflix的中间层,用于负载均衡和服务发现。在应用服务中既存有服务器组件,也有智能客户端。服务器和客户端都采用java语言编写,这就意味着理想的应用场景是用于采用java编写的服务,或者是与JVM兼容的语言编写的服务。windows
Eureka服务器用于注册服务。他们推荐在AWS每一个可用的区域运行一个Eureka服务器,经过它来造成聚簇。服务器经过异步模式互相复制各自的状态,这意味着在任意给定的时间点每一个实例关于全部服务的状态是有细微差异的。缓存
服务的注册由客户端组件处理。服务嵌入在客户端应用程序代码中。在运行时,客户端注册服务并周期性的发送心跳来更新它的租约。安全
服务的发现也由智能客户端来处理。它从服务器端检索当前注册的信息并把它们缓存在本地。客户端周期性能刷新它的状态同时处理负载均衡和失效备援。服务器
Eureka在设计时就考虑了失败时的恢复。它依托强一致性提供良好的可用性,可在运行在多种不一样的失败场景中。若是聚簇中有分片,那么Eureka就转入自我保护模式。它容许在分片期间过行服务的发现和注册,当分片结束时,聚簇中的成员会把它们的状态再次合并起来。网络
若是一个服务器出现问题,Eureka不须要任何类型的选举,客户端会自动切换并链接到一个新的Eureka服务器。当它恢复时,能够自动加入Eureka节点集群。并且,按照设计,它能够在零停机的状况下处理更普遍的网络分区问题。在出现网络分区的状况下,Eureka将继续接受新的注册并发布。这能够确保新增服务仍然能够供分区同侧的任意客户端使用。
Eureka有一个服务心跳的概念,能够阻止过时数据:若是一个服务长时间没有发送心跳,那么Eureka将从服务注册中将其删除。但在出现网络分区、Eureka在短期内丢失过多客户端时,它会停用这一机制,进入“自我保护模式”。网络恢复后,它又会自动退出该模式。这样,虽然它保留的数据中可能存在错误,却不会丢失任何有效数据。
Eureka在客户端会有缓存。即便全部Eureka服务器不可用,服务注册信息也不会丢失。缓存在这里是恰当的,由于它只在全部的Eureka服务器都没响应的状况下才会用到。
Eureka就是为服务发现而构建的。它提供了一个客户端库,该库提供了服务心跳、服务健康检查、自动发布及缓存刷新等功能。使用ZooKeeper,这些功能都须要本身实现。
管理简单,很容易添加和删除节点。它还提供了一个清晰简洁的网页,上面列出了全部的服务及其健康情况。
Eureka还提供了REST API,使用户能够将其集成到其它可能的用途和查询机制。
SkyDNS是一个相对新的项目它采用Go语言编写,使用了RAFT用于一致性,并提供了HTTP和DNS两种客户端API.它与Etcd和Spotify的DNS模型有点相似,事实上它采用了和Etcd,go-raft一样的RAFT实现。
SkyDNS服务器聚簇在一块儿,使用RAFT协议,并选择出一个主服务。SkyDNS服务器暴露不一样的结点用于服务注册和发现。
为了注册服务,服务会使用基于HTTP的API建立带有TTL的入口。服务必须周期性地经过心跳报告它们的状态。SkyDNS也使用了SRV记录,但它对记录作了扩展用于支持服务版本、环境和地区。
为了发现,客户端使用DNS并检索它们须要链接的服务的SRV记录。客户端须要实现负载均衡或者失效备援,而且周期性的缓存和刷新服务位置数据。
与Spotify使用DNS不一样的是,SkyDNS支持服务的动态注册,而且可以在不依赖像Zookeeper或者Etcd的状况下动态注册。
若是你使用了docker,skydock,你应当去检查一下你的容器与SkyDNS自动的集成。
总之,SkyDNS是一个混合了传统的(DNS)和新的(Go,RAFT)技术的项目,它值得你去分析一下项目是如何推动的。