当前位置:   article > 正文

Etcd 概要 机制及使用场景_etcd通知机制

etcd通知机制

Etcd


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

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

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

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

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

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

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

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

etcd还提供了监听的能力,通常数据库可以get一个值,它返回给你就结束了,但是对于etcd来说可以通过watch的命令,就相当于给我一个http 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 比较多的应用场景是用于服务注册与发现

 它有lease的机制,续约机制一般用在什么场景下?用于服务发现的场景,比如spring cloud,跑一个应用实例,有一个注册中心,当应用实例运行完之后就要去注册中心把自己注册上,但是注册的时间是有时效性的比如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 的库和客户端工具

  • 命令行客户端工具etcdctl
  • Go 客户端 go-etcd
  • Java 客户端 jetcd
  • Python客户端 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变为非常流行的框架。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/568577
推荐阅读
相关标签
  

闽ICP备14008679号