赞
踩
etcd是 CoreOS基于Raft开发的分布式key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。
在分布式系统中,如何管理节点间的状态一直是一个难题,etcd 像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。
为什么要做分布式存储呢?就是数据安全的要求,如果是单节点的键值对存储很简单就能够实现,但是如果单节点出现了故障,那么数据就会丢失,对于这种场景你要保证数据的安全,就需要不停的去备份数据,比如对数据时效性不高可能每天备份一下数据,数据丢失的话就损失一天的数据。
现在对数据的时效性越来越高了,分布式存储就解决了这样一个问题,一个节点可能出现故障那么我们能不能组成一个集群,组成一个集群让我的数据冗余备份,一个节点有问题,其他节点还有最新的数据,那么可以很快的在不影响业务的前提下面恢复数据,这样就保证了数据的安全性。
一但是分布式系统就设计到如何保证的数据一致性,所以对etcd来说,最核心的就是如何保证数据的一致性,这个一致性的指导理论就是raft协议。
raft是一个标准的一致性协议,etcd是实现了这个协议的,所以etcd是一个分布式的键值存储。
etcd还提供了监听的能力,通常数据库可以get一个值,它返回给你就结束了,但是对于etcd来说可以通过watch的命令,就相当于给我一个http request,但是多加一个参数,比如watch的参数,但是etcd的行为就不一样了,除了将当前的数据返回给你,还会保持这个长连接,之后这个对象所有的变更,他都会以事件的形式通知给你,这样保证你不需要做轮询,就能够关注到所有对象的变更。
它的主要功能除了键值对存储,监听机制,还有一个续约机制,它里面有lease对象,这个lease对象允许你在写键值的时候给键值对一个生命周期,比如给30s的生命周期,要保证键值对一直有效就要去一直续约,如果超过30s没有续约,这个键值对就会消失。
它有lease的机制,续约机制一般用在什么场景下?用于服务发现的场景,比如spring cloud,跑一个应用实例,有一个注册中心,当应用实例运行完之后就要去注册中心把自己注册上,但是注册的时间是有时效性的比如30s,作为客户端如何保证自己是活着的,这就需要不停的去续约,一旦续约没有完成,比如中间网络中断,那么之前的键值就失效了,所以它很自然的就落在了服务发现的场景,我写一个键值对注册自己,并且不停的续约,如果续约不成功,那么键值对失效。
通过这种机制就可以发现整个集群里面的service。
基于监听机制的分布式异步系统
etcd是一个键值存储的组件,其他的应用都是基于其键值存储的功能展开。
k v存储轻量级,那么可以按照键值快速的去做索引,因为只有一个列,不像数据库,很多列,很多行,查询起来开销非常的大。
存储方式,采用类似目录结构(B+tree)。
有一个服务注册中心,这里都有服务提供者和服务消费者,服务提供者比如说提供了web服务,我将自己的ip和服务名称写到etcd里面,通过续约的机制写进去,通过lease的机制写进去,通过心跳来保持这个续约有效,如果中间链路或者自身出现了问题,那么租约就失败了。
另外一边服务消费者,他就去服务注册中心发现服务,服务有哪些endpoint,只要在服务注册中心里面服务发现这个查询能够发现的这些endpoint,那就说明它是当前的有效的服务提供者,那么就可以产生绑定关系。
消费者要相信etcd会将失效的服务提供者,也就是没有及时续约的,那些提供者的ip都会自动拿掉,通过这种场景就可以做服务注册和发现。
etcd既然支持watch的机制,支持保持长连接通过event的方式来推送消息,那么它本身就是消息注册中心,消费方要去查询某个对象,比如查询某个键值,在查询的时候同时返回当前的值给我,并且我要持续监听,这是查询的一个请求,etcd就会将当前的键值value传给消费者,并且长连接会一直保持。
那么这个时候生产者可能会去更新当前主键的键值,所有这些变化,增删改,在etcd里面做的修改,etcd都会以消息的机制,比如说发add modify和delete的event给消费者,消费者接收到这些事件之后就可以去做对应的配置操作。
目前有很多支持etcd 的库和客户端工具
模糊查询,查询所有的以斜杠开头/ key的值
只想看key,不想看value
也可以通过watch的操作来检测一些对象的变化,watch所有以斜杠为开头的这种键值,它的变化情况。
TTL(Time To Live)指的是给一个key设置一个有效期,到期后这个key 就会被自动删掉,这在很多分布式锁的实现上都会用到,可以保证锁的实时有效性。
在etcd里面有支持一个对象叫做lease,创建lease对象,并且可以为它设置生命周期,比如30s,当我去写入一个键值的时候,那么可以将这个键值对和这个lease对象产生绑定关系,如果这个对象没有renew,到了它的租约,整个key-value就消失了。
Atomic Compare-and-Swap(CAS)指的是在对key进行赋值的时候,客户端需要提供一些条件,当这些条件满足后,才能赋值成功。
这些条件包括∶
这样的话,key 的设置是有前提的,需要知道这个key当前的具体情况才可以对其设置。
在谈数据一致性的时候,构建一致性系统的时候,一般会使用cas机制,很多cpu指令支持cas机制,当我去修改某个内存值的时候,可以带着一个条件去修改,当前提条件满足的时候修改操作才会被执行。
它通过单条指令对数据修改,而且在做数据的修的时候可以给它加预触发的条件,cas在etcd选主被广泛采用。
正是上面所有的这些机制使得etcd变为非常流行的框架。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。