目录
Etcd、Eureka、Consul、Zookeeper 的比较
Etcd
服务注册与发现的必要:
etcd简介
etcd分布式一致性算法
etcd应用场景
etcd安装
服务注册与发现实例(go语言)
服务注册的简单实现1:
服务注册的简单实现2:
都是key-value存储,redis 可以代替 etcd吗?
为什么选择Etcd而不选择Zookeeper
附录
附录1:etcd基本使用(数据库CURD和持久化等)
数据库操作
非数据库操作
附录2:etcd应用场景
5.1服务发现
5.2消息发布与订阅
5.3负载均衡
5.4分布式通知与协调
5.5分布式锁
5.6分布式队列
5.7集群监控与LEADER竞选
附录3:ETCD 词汇表
Etcd、Eureka、Consul、Zookeeper 的比较
etcd除了受到Zookeeper与doozer启发而催生的项目,还拥有与之类似的功能外,更具有以下4个特点:
- 简单:基于HTTP+JSON的API让你用curl命令就可以轻松使用。
- 安全:可选SSL客户认证机制。
- 快速:每个实例每秒支持一千次写操作。
- 可信:使用Raft算法充分实现了分布式。
至于为什么不用zookeeper或者eureka等,除了根据项目考虑之外,就看个人喜好了,如果有哪位大佬知道更多内容,麻烦也在留言区告知小编一下,万分感谢!
以下是常用的服务发现产品之间的比较:
Feature | Consul | zookeeper | etcd | euerka |
---|---|---|---|---|
服务健康检查 | 服务状态,内存,硬盘等 | (弱)长连接,keepalive | 连接心跳 | 可配支持 |
多数据中心 | 支持 | — | — | — |
kv存储服务 | 支持 | 支持 | 支持 | — |
一致性 | raft | paxos | raft | — |
cap | ca | cp | cp | ap |
使用接口(多语言能力) | 支持http和dns | 客户端 | http/grpc | http(sidecar) |
watch支持 | 全量/支持long polling | 支持 | 支持 long polling | 支持 long polling/大部分增量 |
自身监控 | metrics | — | metrics | metrics |
安全 | acl /https | acl | https支持(弱) | — |
spring cloud集成 | 已支持 | 已支持 | 已支持 | 已支持 |
https://blog.csdn.net/qq_34395857/article/details/89212566
zookeeper 实现一个简单的服务注册与发现:https://www.cnblogs.com/chinxi/p/12994321.html
Etcd
服务注册与发现的必要:
讲一个很简单的场景,一般服务端架构最前面是 一台网关 ,网关后面是 n 台运行着一样的 服务 的机器。 客户端一般就是访问网关 ,然后 网关 就把流量 转发到 后面的 服务器上。那么我们来考虑这么一个问题,后面 服务器 信息处理不过来的时候,我们需要加机器。最low的方法就是 加上一台服务器,然后 修改网关服务器的配置表 加上 新加的 服务器的IP 和端口,然后重启网关。还有就是 当 后面的 服务器万一 down 了,网关是不知道的,还会把 流量转发到 down的 服务器上,造成 服务的不可用。
要解决上面这个问题就需要 [服务注册与发现] 如etcd 这类产品了,etcd 是一个 分布式 的高一致性的 键值存储系统。我们每次网关 后面加一个服务,只需要向etcd 注册 该服务(其实就是 存一个值)然后向etcd 发送心跳,当etcd 没有检测到心跳就会 把这个键值对 删了(这整个动作是etcd里的租约模式),网关那边 就只需要 watch 这个 key ,就能够知道 所有服务的所有动态了。
链接:https://www.jianshu.com/p/7c0d23c818a5
etcd简介
etcd是一个开源的分布式键值对存储工具。在每个coreos节点上面运行的etcd,共同组建了coreos集群的共享数据总线。etcd可以保证coreos集群的稳定,可靠。当集群网络出现动荡,或者当前master节点出现异常时,etcd可以优雅的进行master节点的选举工作,同时恢复集群中损失的数据。
etcd为分布式系统提供可靠的键值存储。可以用在系统的降级处理、服务的发现、配置的共享等多个方面。而Etcd的底层数据存储上与一个NoSQL的数据库基本没有差别,但更准确的说法说是一个高可用的键值存储系统,并且etcd提供了TTL和订阅与发布(Subscript/Public)功能。与一般的NoSQL数据库不同,Etcd在设计的初衷主要用于是共享配置和服务发现(比noSQL 开发了一些面向服务发现的接口,提供面向服务发现的逻辑和协议),它的灵感来自于ZooKeeper和Doozer。(Etcd是CoreOS生态系统中处于连接各个节点通信和支撑集群服务协同运作的核心地位的模)
etcd有如下的特点:
- 简单:安装配置简单,API丰富(支持http,jason),提供HTTP API进行交互,使用也很简单
- 安全:支持SSL证书验证
- 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
- 可靠:采用raft算法,实现分布式系统数据的可用性和一致性
通过http轮询,监听网络变化
etcd分布式一致性算法
etcd使用的分布式一致性算法是Raft协议:
https://www.bilibili.com/video/BV1yJ411P76f?from=search&seid=5674215994201741363
etcd应用场景
etcd应用场景有服务发现、消息发布与订阅、负载均衡、分布式通知与协调、分布式锁、分布式队列、集群监控与LEADER竞选,详细见文章末尾附录。
etcd应用比较多的应用场景是用于服务发现,服务发现(Service Discovery)要解决的是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接。
从本质上说,服务发现就是要了解集群中是否有进程在监听upd或者tcp端口,并且通过名字就可以进行查找和链接。
要解决服务发现的问题,需要下面三大支柱,缺一不可。
- 一个强一致性、高可用的服务存储目录。
基于Ralf算法的etcd天生就是这样一个强一致性、高可用的服务存储目录。
- 一种注册服务和健康服务健康状况的机制。
用户可以在etcd中注册服务,并且对注册的服务配置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
- 一种查找和连接服务的机制。
通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。
(还可以在每个服务机器上都部署一个proxy模式的etcd,这样就可以确保访问etcd集群的服务都能够互相连接。)
链接:https://www.jianshu.com/p/f68028682192
etcd安装
etcd在生产环境中一般推荐集群方式部署。本文定位为入门,主要讲讲单节点安装和基本使用。
etcd目前默认使用2379端口提供HTTP API服务,2380端口和peer通信(这两个端口已经被IANA官方预留给etcd);在之前的版本中可能会分别使用4001和7001,在使用的过程中需要注意这个区别。
因为etcd是go语言编写的,所以设备上应该先部署goland环境:https://blog.csdn.net/bandaoyu/article/details/107721973
安装好goland环境后,安装只需要下载对应的二进制文件,并放到合适的路径就行。
下载软件包
$ wget https://github.com/coreos/etcd/releases/download/v3.1.5/etcd-v3.1.5-linux-amd64.tar.gz
$ tar xzvf etcd-v3.1.5-linux-amd64.tar.gz
$ mv etcd-v3.1.5-linux-amd64 /opt/etcd
解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端。
$ ls /opt/etcd/etcd-v3.1.5-linux-amd64/
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
如果在测试环境,启动一个单节点的etcd服务,只需要运行etcd命令就行。
$ cd /opt/etcd/etcd-v3.1.5-linux-amd64/
$ ./etcd
输出:
$ ./etcd 2017-04-10 11:46:44.772465 I | etcdmain: etcd Version: 3.1.5 2017-04-10 11:46:44.772512 I | etcdmain: Git SHA: 20490ca 2017-04-10 11:46:44.772607 I | etcdmain: Go Version: go1.7.5 2017-04-10 11:46:44.772756 I | etcdmain: Go OS/Arch: linux/amd64 2017-04-10 11:46:44.772817 I | etcdmain: setting maximum number of CPUs to 2, total number of available CPUs is 2 2017-04-10 11:46:44.772851 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd 2017-04-10 11:46:44.773298 I | embed: listening for peers on http://localhost:2380 2017-04-10 11:46:44.773583 I | embed: listening for client requests on localhost:2379 2017-04-10 11:46:44.775967 I | etcdserver: name = default 2017-04-10 11:46:44.775993 I | etcdserver: data dir = default.etcd 2017-04-10 11:46:44.776167 I | etcdserver: member dir = default.etcd/member 2017-04-10 11:46:44.776253 I | etcdserver: heartbeat = 100ms 2017-04-10 11:46:44.776264 I | etcdserver: election = 1000ms 2017-04-10 11:46:44.776270 I | etcdserver: snapshot count = 10000 2017-04-10 11:46:44.776285 I | etcdserver: advertise client URLs = http://localhost:2379 2017-04-10 11:46:44.776293 I | etcdserver: initial advertise peer URLs = http://localhost:2380 2017-04-10 11:46:44.776306 I | etcdserver: initial cluster = default=http://localhost:2380 2017-04-10 11:46:44.781171 I | etcdserver: starting member 8e9e05c52164694d in cluster cdf818194e3a8c32 2017-04-10 11:46:44.781323 I | raft: 8e9e05c52164694d became follower at term 0 2017-04-10 11:46:44.781351 I | raft: newRaft 8e9e05c52164694d [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0] 2017-04-10 11:46:44.781883 I | raft: 8e9e05c52164694d became follower at term 1 2017-04-10 11:46:44.795542 I | etcdserver: starting server... [version: 3.1.5, cluster version: to_be_decided] 2017-04-10 11:46:44.796453 I | etcdserver/membership: added member 8e9e05c52164694d [http://localhost:2380] to cluster cdf818194e3a8c32 2017-04-10 11:46:45.083350 I | raft: 8e9e05c52164694d is starting a new election at term 1 2017-04-10 11:46:45.083494 I | raft: 8e9e05c52164694d became candidate at term 2 2017-04-10 11:46:45.083520 I | raft: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2 2017-04-10 11:46:45.083598 I | raft: 8e9e05c52164694d became leader at term 2 2017-04-10 11:46:45.083654 I | raft: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2< |