Etcd 概要 机制及使用场景

网友投稿 852 2022-10-18

Etcd 概要 机制及使用场景

Etcd 概要 机制及使用场景

Etcd

etcd是 CoreOS基于Raft开发的分布式key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。

在分布式系统中,如何管理节点间的状态一直是一个难题,etcd 像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。

分布式键值对存储∶将数据存储在分层组织的目录中,如同在标准文件系统中(可以将它的key和value他们的映射关系存下来)

为什么要做分布式存储呢?就是数据安全的要求,如果是单节点的键值对存储很简单就能够实现,但是如果单节点出现了故障,那么数据就会丢失,对于这种场景你要保证数据的安全,就需要不停的去备份数据,比如对数据时效性不高可能每天备份一下数据,数据丢失的话就损失一天的数据。

现在对数据的时效性越来越高了,分布式存储就解决了这样一个问题,一个节点可能出现故障那么我们能不能组成一个集群,组成一个集群让我的数据冗余备份,一个节点有问题,其他节点还有最新的数据,那么可以很快的在不影响业务的前提下面恢复数据,这样就保证了数据的安全性。

一但是分布式系统就设计到如何保证的数据一致性,所以对etcd来说,最核心的就是如何保证数据的一致性,这个一致性的指导理论就是raft协议。

raft是一个标准的一致性协议,etcd是实现了这个协议的,所以etcd是一个分布式的键值存储。

监测变更∶监测特定的键或目录以进行更改,并对值的更改做出反应

etcd还提供了监听的能力,通常数据库可以get一个值,它返回给你就结束了,但是对于etcd来说可以通过watch的命令,就相当于给我一个request,但是多加一个参数,比如watch的参数,但是etcd的行为就不一样了,除了将当前的数据返回给你,还会保持这个长连接,之后这个对象所有的变更,他都会以事件的形式通知给你,这样保证你不需要做轮询,就能够关注到所有对象的变更。

简单∶Curl可访问的用户的 API(HTTP+JSON)安全∶可选的 SSL客户端证书认证,保证传输的安全快速∶单实例每秒1000次写操作,2000+次读操作可靠使用 Raft算法保证一致性。

主要功能

基本的 key-value 存储监听机制key 的过期及续约机制,用于监控和服务发现

它的主要功能除了键值对存储,监听机制,还有一个续约机制,它里面有lease对象,这个lease对象允许你在写键值的时候给键值对一个生命周期,比如给30s的生命周期,要保证键值对一直有效就要去一直续约,如果超过30s没有续约,这个键值对就会消失。

原子Compare And Swap和Compare And Delete,用于分布式锁和leader选举

使用场景

可以用于键值对存储,应用程序可以读取和写入etcd 中的数据etcd 比较多的应用场景是用于服务注册与发现

当应用实例运行完之后就要去注册中心把自己注册上,但是注册的时间是有时效性的比如30s,作为客户端如何保证自己是活着的,这就需要不停的去续约,一旦续约没有完成,比如中间网络中断,那么之前的键值就失效了,所以它很自然的就落在了服务发现的场景,我写一个键值对注册自己,并且不停的续约,如果续约不成功,那么键值对失效。

通过这种机制就可以发现整个集群里面的service。

基于监听机制的分布式异步系统

基于监听和消息通知机制,etcd本身就是一个消息中间件了,

键值对存储

etcd是一个键值存储的组件,其他的应用都是基于其键值存储的功能展开。

采用KV 型数据存储,一般情况下比关系型数据库快。

k v存储轻量级,那么可以按照键值快速的去做索引,因为只有一个列,不像数据库,很多列,很多行,查询起来开销非常的大。

支持动态存储(内存)以及静态存储(磁盘)。分布式存储,可集成为多节点集群。

存储方式,采用类似目录结构(B+tree)。

只有叶子节点才能真正存储数据,相当于文件。叶子节点的父节点一定是目录,目录不能存储数据。

服务注册与发现

服务提供者比如说提供了web服务,我将自己的ip和服务名称写到etcd里面,通过续约的机制写进去,通过lease的机制写进去,通过心跳来保持这个续约有效,如果中间链路或者自身出现了问题,那么租约就失败了。

另外一边服务消费者,他就去服务注册中心发现服务,服务有哪些endpoint,只要在服务注册中心里面服务发现这个查询能够发现的这些endpoint,那就说明它是当前的有效的服务提供者,那么就可以产生绑定关系。

消费者要相信etcd会将失效的服务提供者,也就是没有及时续约的,那些提供者的ip都会自动拿掉,通过这种场景就可以做服务注册和发现。

消息发布与订阅

etcd既然支持watch的机制,支持保持长连接通过event的方式来推送消息,那么它本身就是消息注册中心,消费方要去查询某个对象,比如查询某个键值,在查询的时候同时返回当前的值给我,并且我要持续监听,这是查询的一个请求,etcd就会将当前的键值value传给消费者,并且长连接会一直保持。

那么这个时候生产者可能会去更新当前主键的键值,所有这些变化,增删改,在etcd里面做的修改,etcd都会以消息的机制,比如说发add modify和delete的event给消费者,消费者接收到这些事件之后就可以去做对应的配置操作。

第三方库和客户端工具

目前有很多支持etcd 的库和客户端工具

命令行客户端工具etcdctlGo 客户端 go-etcdJava 客户端 jetcdPython客户端 python-etcd

etcd练习

模糊查询,查询所有的以斜杠开头/  key的值

只想看key,不想看value

也可以通过watch的操作来检测一些对象的变化,watch所有以斜杠为开头的这种键值,它的变化情况。

TTL

TTL(Time To Live)指的是给一个key设置一个有效期,到期后这个key 就会被自动删掉,这在很多分布式锁的实现上都会用到,可以保证锁的实时有效性。

在etcd里面有支持一个对象叫做lease,创建lease对象,并且可以为它设置生命周期,比如30s,当我去写入一个键值的时候,那么可以将这个键值对和这个lease对象产生绑定关系,如果这个对象没有renew,到了它的租约,整个key-value就消失了。

CAS

Atomic Compare-and-Swap(CAS)指的是在对key进行赋值的时候,客户端需要提供一些条件,当这些条件满足后,才能赋值成功。

这些条件包括∶

prevExist∶key 当前赋值前是否存在prevValue∶key 当前赋值前的值prevIndex∶key当前赋值前的 Index

这样的话,key 的设置是有前提的,需要知道这个key当前的具体情况才可以对其设置。

在谈数据一致性的时候,构建一致性系统的时候,一般会使用cas机制,很多cpu指令支持cas机制,当我去修改某个内存值的时候,可以带着一个条件去修改,当前提条件满足的时候修改操作才会被执行。

它通过单条指令对数据修改,而且在做数据的修的时候可以给它加预触发的条件,cas在etcd选主被广泛采用。

正是上面所有的这些机制使得etcd变为非常流行的框架。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Smart Location Library:简化定位程序使用
下一篇:Kubernetes 深入理解kubernetes(一)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~