etcd v3基本知识概览

etcd

命令行 v3 api

  • 设置键、修改键

    1
    etcdctl put /maple value
  • 删除键

    1
    2
    3
    4
    etcdctl del /maple

    #删除所有/test前缀的节点
    etcdctl del /test --prefix
  • 查询Key

    1
    2
    3
    4
    5
    etcdctl get /test/ok
    # 前缀查询
    etcdctl get /test/ok --prefix
    # 查询所有键
    etcdctl --prefix --keys-only=true get /
  • watch key

    1
    2
    3
    4
    etcdctl watch /maple/services

    #watch子节点
    etcdctl watch /maple/services --prefix
  • 申请租约、授权租约

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 申请租约
    etcdctl lease grant 40
    lease 4e5e5b853f528859 granted with TTL(40s)

    # 授权租约
    etcdctl put --lease=4e5e5b853f528859 /maple/s 123

    # 撤销
    etcdctl lease revoke 4e5e5b853f5286cc

    #租约续约
    etcdctl lease keep-alive 4e5e5b853f52892b

临时节点

在实现服务发现时,我们一般都会用到ZooKeeper的临时节点,只要客户端与ZooKeeper之间的session会话没有中断(过期),那么创建的临时节点就会存在。当客户端掉线一段时间,对应的zk session会过期,那么对应的临时节点就会被自动删除。

在etcd中并没有临时节点的概念,但是支持lease租约机制。

什么叫lease?其实就是etcd支持申请定时器,比如:可以申请一个TTL=10秒的lease(租约),会返回给你一个lease ID标识定时器。你可以在set一个key的同时携带lease ID,那么就实现了一个自动过期的key

etcd中,一个lease可以关联给任意多的Key,当lease过期后所有关联的key都将被自动删除。

  • 那么如何实现临时节点呢?

首先申请一个TTL=Nlease,然后set一个key with lease作为自己的临时节点,在程序中定时的为lease(租约)进行续约,也就是重置TTL=N,这样关联的key就不会过期了。

事件机制

在我们用ZooKeeper实现服务发现时,我们一般会getChildrenAndWatch来获取一个目录下的所有在线节点,这个API会先获取当前的孩子列表并同时注册了一个观察器。每当ZooKeeper发现子节点有变动的时候,就会watch回调给客户端(同时关闭观察器,),此时我们会再次调用getChildrenAndWatch再次获取最新的子节点列表并重新注册观察器。

Zookeeper的事件模型?

简单的来说,ZooKeeper提供了一个原子API,它先获取当前状态,同时注册一个观察器,当后续变化发生时会发送一次通知到客户端:获取并观察->收到变化事件->获取并观察->收到变化事件->……,如此往复。

ZooKeeper的事件模型非常可靠,不会出现发生了更新而客户端不知道的情况,但是特点也很明显:
事件不包含数据,仅仅是通知变化。
多次连续的更新,通知会合并成一个;即,客户端收到通知再次拉取数据,会跳过中间的多个版本,只拿到最新数据。
这些特点并不是缺点,因为一般应用只关注最新状态,并不关注中间的连续变化。

那么etcd的事件模型呢?

在现在,你只需要记住etcd的事件是包含数据的,并且通常情况下连续的更新不会被合并通知,而是逐条通知到客户端。

具体etcd事件模型如何工作,要求对etcd的K-V存储原理先做了解,所以接下来我会结合一些简单的源码,说一下etcd的存储模型,最后再来说它的事件模型。

文章目录
  1. 1. etcd
  2. 2. 命令行 v3 api
    1. 2.1. 临时节点
  3. 3. 事件机制
    1. 3.1. Zookeeper的事件模型?
    2. 3.2. 那么etcd的事件模型呢?
|