ETCD-基础学习使用

ETCD 从入门到精通-深入浅出ETCD系列文章 ETCD 是一个开源的分布式键值存储系统(Key-Value Store),由 CoreOS 团队开发并捐赠给云原生计算基金会(CNCF)。它的设计目标是提供高可用性和强一致性的分布式数据管理服务,常用于分布式系统的配置管理、服务发现、分布式锁等场景。核心特点简单性:基于 HTTP/JSON 或 gRPC 的 API 设计。强一致性:使用 Raft 共识算法保证数据一致性。高可用性:支持多节点集群部署,容忍部分节点故障。持久化存储:数据默认持久化到磁盘,支持快照和恢复。 阅读详情


base

  1. 分布式架构系统面临一些与生俱来的问题
    1. 比如部署复杂、响应时间慢、运维复杂
    2. 最根本的是多个节点之间的数据共享问题
  2. 要解决这个问题有两种
    1. 自己实现一个可靠的共享存储
    2. 依赖一个可靠的共享存储服务
  3. etcd是一款分布式存储中间件,使用Go语言编写。并通过Raft一致性算法处理和确保分布式一致性,解决了分布式系统中数据一致性的问题
  4. etcd 常用语微服务架构中的服务注册与发现中心,相较于ZooKeeper部署更简单,而且具有数据持久化、支持SSL客户端安全认证的独特优势
  5. etcd中涉及了数据一致性、多版本并发控制、watch监控、磁盘IO读写等知识点,深入学习etcd可以帮助我们从开源项目中学习底层原理,进一步提高分布式架构设计的能力
  6. etcd作为云原生架构中重要的基础组件,各个微服务之间通过etcd保证调用的可用性和正确性,其他许多知名项目(包括Kubernetes、CoreDNS和TiKV等),也都依赖etcd来实现可靠的分布式数据存储
  7. etcd在提供分布式键-值存储方面发挥着关键作用,其存储功能不仅具有很高的可用性,而且能够满足大规模Kubernetes集群所提出的强一致性要求。
  8. etcd作为一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据协助分布式集群的正常运转
  9. 目前 etcd 可以存储百万到千万级别的 key。
  10. 单实例(V3)支持每秒10KQps
  11. etcd可以扮演两大角色:
    1. 持久化的键值存储系统
    2. 分布式系统数据一致性服务提供者

why

  1. 从本质上来讲,云原生中的微服务应用属于分布式系统的一种落地实践
  2. 最常见的、最大的难点就是数据存储不一致的问题,多个服务实例自身的数据或者获取到的数据各不相同
  3. CAP原理 只能3选2,并且P是必须要满足的
    1. Consistency(一致性)、Availability(可用性) 和 Partition tolerance(分区容错性)
      1. 数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。
      2. 为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。
      3. 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值,即写操作之后的读操作,必须返回该值。(分为弱一致性、强一致性和最终一致性)
      4. 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
      5. 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
    2. 分区容错P:
      1. 分区容错就是各分区断开也提供服务(网络原因)(所以一定要进行复制日志)?
      2. 分区不容错,就是在产生分区的时候,各个分区都不能对外提供服务。像这个例子中,ClientA通过ServerB访问分布式系统,ServerB发现访问不到ServerC和ServerD了,就认为系统发生了故障,这个时候就给ClientA返回一个错误,告诉它“我现在找不到C、D了,我不能为你提供服务”,同样的ClientB也会在访问这个分布式系统时得到相同的结果。
      3. 具有分区容错性的话,在产生分区的时候,各个分区将各自对外提供服务。像这个例子中,ClientA通过ServerB访问这个分布式系统,ServerB同样发现ServerC和ServerD访问不到了,但它将不再在意ServerC和ServerD的意见了,它只需要问问ServerA的意见,然后就成功给ClientA返回结果。同样的ClientB在通过ServerD访问这个分布式系统也能成功得到结果,这个结果只征询了ServerC和ServerD的意见,不会在意ServerA和ServerB的意见。
      4. 以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
    3. 取舍
      1. CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。
      2. CP without A:如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。

what

  1. ETCD : etc是放linux全局环境配置文件,d就是服务的意思,etcd就是全局配置服务中心。 : A highly-available key value store for shared configuration and service discovery. 即一个用于配置共享和服务发现的键值存储系统。

  2. etcd归根结底是一个存储组件,且可以实现配置共享和服务发现

  3. 一款实现了元数据信息可靠存储的组件-etcd可集中管理配置信息

  4. 完成CAP理论中的CP指标

  5. 术语

    术语描述备注
    RaftRaft算法,etcd实现一致性的核心etcd有etcd-raft模块
    FollowerRaft中的从属节点竞争Leader失败
    LeaderRaft中的领导协调节点,用于处理数据提交Leader节点协调整个集群
    Candidate候选节点当Follower接收Leader节点的消息超时会转变为Candidate
    NodeRaft状态机的实例Raft中涉及多个节点
    Memberetcd实例,管理若对应的Node节点可处理客户端请求
    Peer同一个集群中的另一个Member其他成员
    Clusteretcd集群拥有多个etcd Member
    Lease租期key设置的租期,过期删除
    Watch监测机制监控键值对的变化
    Term任期某个节点成为Leader,到下一次竞选的时间
    WAL预写式日志用于持久化存储的日志格式
    Client客户端向etcd发起请求的客户
  6. 简单、存储、Watch机制、安全通信、高性能、一致可靠

  7. 提供服务注册与发现、键值对存储、消息发布与订阅、分布式锁,都是在基于基础组件实现。

  8. 核心架构
    在这里插入图片描述

    1. etcd server:对外接收和处理客户端的请求
    2. gRPC server:etcd与其他etcd节点之间的通信和信息同步。
    3. MVCC:多版本控制,etcd的存储模块,键值对的每一次操作行为都会被记录存储,这些数据底层存储在BoltDB数据库中。
    4. WAL:预写式日志- etcd中数据提交都会被记录到日志。
    5. Snapshot:快照-以防WAL日志过多,用于存储某一时刻etcd的所有数据
    6. WAL+SNAPSHOT : 可以有效的进行数据存储和节点故障恢复操作

how

单机安装

  1. 官网下载安装包https://github.com/etcd-io/etcd/tags

  2. 选择最新版下载,点进去 找到对应的linux版本进行下载

    在这里插入图片描述
    在这里插入图片描述

  3. 解压并查看是否安装成功

    tar -zxvf /data/etcd/etcd-v3.5.15-linux-amd64.tar.gz --transform s/etcd-v3.5.15-linux-amd64/etcd-v3.5.15/
    #查看安装是否成功的相关命令
    /data/etcd/etcd-v3.5.15/etcd --version
    /data/etcd/etcd-v3.5.15/etcdctl version
    /data/etcd/etcd-v3.5.15/etcdutl version
    
  4. 添加环境变量

    vim /etc/profile
    ------------------------------------
    export ETCD_HOME=/data/etcd/etcd-v3.5.15
    export PATH=.:$ETCD_HOME:$PATH
    ————————————————----------------
    source /etc/profile
    
  5. 后台启动etcd

    1. chmod 777 /data/etcd/etcd-v3.5.15/etcd
      /data/etcd/etcd-v3.5.15/etcd &
      
    2. 测试etcd写入

      etcdctl --endpoints=localhost:2379 put foo bar
      etcdctl --endpoints=localhost:2379 get foo
      

      在这里插入图片描述
      在这里插入图片描述

  6. 或者直接使用github提供的命令 – Linux # 能访问外网

    1. # 创建安装脚本 vim etcd 写入如下内容
      ETCD_VER=v3.5.15
      
      # choose either URL
      GOOGLE_URL=https://storage.googleapis.com/etcd
      GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
      DOWNLOAD_URL=${GOOGLE_URL}
      
      rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
      rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
      
      curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
      tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
      rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
      
      /tmp/etcd-download-test/etcd --version
      /tmp/etcd-download-test/etcdctl version
      /tmp/etcd-download-test/etcdutl version
      
    2. 启动本地etcd

      # start a local etcd server
      /tmp/etcd-download-test/etcd
      
      # write,read to etcd
      /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
      /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
      
  7. 查看启动状态 :etcdctl member list

  8. 卸载只需要删除对应文件和目录

集群安装(未实践)

在生产环境中,为了整个集群的高可用,Etcd正常都会集群部署,避免单点故障,集群启动有三种方式,分别是静态启动、动态发现、DNS发现。

  1. 静态启动:Etcd集群要求提前知道集群中所有成员信息,在启动时通过--initial-cluster参数直接指定好Etcd的各个节点地址。
  2. Etcd动态发现:静态发现前提是在搭建集群之前已经提前知道各节点成员的信息,而实际应用中可能存在预先并不知道各节点ip的情况,这时可通过已搭建的Etcd集群来辅助搭建新的Etcd集群。
  3. DNS发现:通过DNS查询方式获取其他节点地址信息。

集群个数通常部署为奇数个数,因为:

  1. 偶数节点数选主时有较大概率等额选票,从而触发下来一轮选举
  2. 偶数个节点集群在某些网络分割的场景下无法正常工作。当网络分割发生后,将集群节点对半分割开。
    此时集群将无法工作。按照RAFT协议,此时集群写操作无法使得大多数节点同意,从而导致写失败,集群无法正常工作。

客户端操作

  1. Etcd在微服务和Kubernates集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件。

  2. etcdctl是一个命令行的客户端,它能提供一些简洁的命令,供用户直接跟etcd服务打交道,而无需基于 HTTP API 方式。方便对服务进行测试或者手动修改数据库内容。

  3. 我们刚开始可以通过etdctl来熟悉相关操作。这些操作跟 HTTP API 基本上是对应的。etcdctl在两个不同的 etcd 版本下的行为方式也完全不同。

    export ETCDCTL_API=2
    export ETCDCTL_API=3  # 	主要以API 3为主
    
  4. ETCD v2 VS v3 ---- 优化

    1. 使用 gRPC+protobuf 取代 HTTP+JSON 通信,提高通信效率;另外通过gRPC gateway 来继续保持对 HTTPJSON 接口的支持。

    2. 使用更轻 级的基于租约(lease)的 key 自动过期机制,取代了基于TTL key 的自动过期机制

    3. 观察者(watcher)机制也进行了重新设计。etcd v2 的观察者机制是基于HTTP 长连接的事件驱动机制;而 etcd v3 的观察者机制是基于HTTP/2的server push ,并且对事件进行了多路复用( multiplexing )优化。

    4. etcd v3 的数据模型也发生了较大的改变, v2 是一个简单的 key-value 的内存数据库,而 v3 则是支持事务和多版本并发控制的磁盘数据库。

  5. 在命令层面,可分为非数据库操作和数据库操作命令


非数据库操作
etcd --version   # 查看etcd版本命令
etcdctl h        # 查看常用命令

[常用options]
--debug 输出CURL命令,显示执行命令的时候发起的请求   例:etcdctl get foo --debug
--no-sync 发出请求之前不同步集群信息
--output, -o 'simple' 输出内容的格式(simple 为原始信息,json 为进行json格式解码,易读性好一些)
--peers, -C 指定集群中的同伴信息,用逗号隔开(默认为: "127.0.0.1:4001")
--cert-file HTTPS下客户端使用的SSL证书文件
--key-file HTTPS下客户端使用的SSL密钥文件
--ca-file 服务端使用HTTPS时,使用CA文件进行验证
--help, -h 显示帮助命令信息
--version, -v 打印版本信息
-w=json 读取版本号
数据库操作
  1. etcd的数据库操作主要是围绕键值对和目录的CRUD。

  2. etcd在键的组织上采用的是层次化结构(类似于文件系统),用户指定的键可以为单独的名字,实际上放在/根目录下面,如果指定键为路径名 /data/soft/key, 那么etcd将创建相应路径。

  3. 读写操作

    # 写操作
    etcdctl put /testdir/testkey "Hello world"
    etcdctl put /testdir/testkey2 "Hello world"
    etcdctl put /testdir/testkey3 "Hello world"
    etcdctl put /testdir/testkey "Hello world-fix"
    
    #读操作
    etcdctl get /testdir/testkey  #读取
    etcdctl put /testdir/testkey --hex  #以16进制进行读取
    etcdctl get /testdir/testkey /testdir/testkey3 #读取指定范围内的值  注:半开区间,前必后开,返回2 
    etcdctl get --prefix /testdir/testkey   #以前缀的方式查询读取值,返回3
    etcdctl get --prefix --limit=2 /testdir/testkey #以前缀的方式查询返回,并限制limit=2,返回2
    
    #读取版本旧值   --当前版本信息在put的响应标头里
    etcdctl get /testdir/testkey  #读取最新值
    etcdctl get --rev=1 /testdir/testkey   #读取集群版本1时值,这个是revison,非key-version
    etcdctl get /testdir/testkey -w=json #读取版本号  其中revision是集群版本,version是key版本
    etcdctl compact 5 # 压缩修订版本到5,5之前的所有版本不可访问
    
    #读取大于等于指定键的 byte 值的键
    etcdctl put a 123
    etcdctl put b 456
    etcdctl put c 789
    etcdctl get --from-key b  #读取大于等于键 b 的 byte 值的键的命令  返回bc
    
    #删除键
    etcdctl del foo  # 返回删除键的个数1
    etcdctl del foo foo1  #删除从 foo to foo1 范围的键  返回1 前闭后开
    etcdctl del --prev-kv a #删除键a, 并返回删除的key-value
    etcdctl del --prefix foo #删除前缀为foo的键,返回删除个数
    etcdctl del --prefix fo --prev-kv # 删除前缀为foo的键 ,并返回删除的 key-value
    etcdctl del --from-key b # 删除大于等于b的byte值的键,返回个数
    
  4. 监听操作 watch

    1. watch 监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。

      [root@etcd01 ~]# etcdctl watch testkey
      # 在另一个节点上输入:
      [root@etcd02 ~]# etcdctl put testkey Hello watch
      OK
      # 结果:
      [root@etcd01 ~]# etcdctl watch testkey
      PUT
      testkey
      Hello
      
    2. 命令

      etcdctl watch foo foo9   # 范围监听 -  同时监听foo 到 foo9
      ------------
      etcdctl watch -i
      watch foo
      watch zoo  # 观测多个指定键
      ------------
      etcdctl watch --rev=2 foo  # 从版本2开始监听 注:会返回版本2之后的所有修改,即使在监听前
      

  5. 租约

    1. 可以为etcd里面所有的键授予租约,当键被附加到租约时,它的存活时间被绑定到租约的存活时间,而租约的存活时间相应的被 time-to-live (TTL)管理。

    2. 一旦租约的TTL到期,所有绑定租约的键都会被清除。

      etcdctl lease grant 20  #  生成100秒的租约,会返回租约id : lease 694d9197f6f23556 granted with TTL(20s)
      
      etcdctl put foo bar --lease=694d9197f6f23569(租约ID)  # 将键绑定到租约上
      etcdctl lease revoke $租约ID  # 撤销租约
      lease $租约ID keepalived with TTL(20) # 续租20秒  
      
      etcdctl lease timetolive $租约ID # 获取租约详情 : lease 694d9197f6f23571 granted with TTL(20s), remaining(13s)
      
      etcdctl lease timetolive --keys $租约ID  #获取哪些key使用了此租约
      

v3核心API

  1. 所有的ETCD V3 API均在gRPC服务中定义,该服务对Etcd服务器可以理解的远程过程调用(RPC)进行分类。

  2. 发送到ETCD 服务器的每个API请求都是一次gPRC远程调用,v3中的rpc接口根据功能来进行定义

    1. KV服务:增删查改键值对
    2. Watch服务:提供监视键的修改
    3. 租约Lease:提供活动消息
    4. 锁:etcd提供分布式共享锁支持
    5. 选举:暴露客户端选举机制

    在这里插入图片描述

  3. etcdAPI的所有响应都有一个附加的响应标头,包括响应的集群元数据信息 : 可以带上-w=json 获取

    1. Cluster_ID : 产生响应的集群的 ID。
      1. 应用服务可以通过 Cluster_ID 和 Member_ID 字段来分辨当前与之通信的正是预期的那个集群或者成员。
    2. Member_ID :产生响应的成员的 ID。
    3. Revision : 产生响应时键值存储的修订版本号。 类似于MVCC快照。
      1. 应用服务可以使用修订号字段来知悉当前键值存储库最新的修订号。当应用程序指定历史修订版进行查询并希望在请求时知道最新修订版时,此功能特别有用。
    4. Raft_Term : 产生响应时,成员的 Raft 称谓。
      1. 应用服务可以使用 Raft_Term 来检测集群何时完成一个新的 leader 选举。
  4. KV-service – 具体内部消息定义自行查阅

    //rpc.proto
    service KV {
      rpc Range(RangeRequest) returns (RangeResponse) {}  
    	// 从键值存储中获取范围内的key;
      rpc Put(PutRequest) returns (PutResponse) {}
    	// 设定key-value到Etcd键值存储,put 请求增加键值存储的修订版本并在事件历史中生成一个事件;
      rpc DeleteRange(DeleteRangeRequest) returns (DeleteRangeResponse) {}
    	// 从键值存储中删除给定范围,删除请求增加键值存储的修订版本,并在事件历史中为每个被删除的key生成一个删除事件;
      rpc Txn(TxnRequest) returns (TxnResponse) {}
    	// 在单个事务中处理多个请求,一个 txn请求增加键值存储的修订版本并为每个完成的请求生成带有相同修订版本的事件。不容许在一个txn中多次修改同一个key;
      rpc Compact(CompactionRequest) returns (CompactionResponse) {}
      // 压缩在etcd键值存储中的事件历史。键值存储应该定期压缩,否则事件历史会无限制的持续增长。
    }
    
    1. 事务Transaction - Txn

      1. 事务运行etcd在单个事务中自动处理多个请求,这意味着,在一个事务中的所有操作只会让数据库的修订版本revision+1。事务中的所有事件都具有相同的修订版本。注:单个事务中禁止多次修改同一个key
      2. Txn 方法在单个事务中处理多个请求。txn 请求增加键值存储的修订版本并为每个完成的请求生成带有相同修订版本的事件。
      3. 事务中所有的比较都是原子操作,都会检查key是否存在、版本,全部为真才触发事务的then/success 请求块,否则,则认为失败并应用 else/failure 请求块。
      4. 其实在底层单个请求同样是一个事务。
    2. 压缩 Compact

      1. 所有修订版本比压缩修订版本小的键历史都将被物理删除,可以理解为即只保留压缩修订版本之后的快照

      2. 例:

        1. 插入一个KV: testcompact:1 ,当前集群revision版本为34,key的版本为1
          在这里插入图片描述

        2. 更新KV :testcompact:2 ,当前集群revision版本为35,key的版本为2

          在这里插入图片描述

        3. 查询快照版本为34时,key为testcompact的值

          在这里插入图片描述

        4. 将快照版本压缩到35,再次查询34版本的key
          在这里插入图片描述

        5. 只有compact会让数据消失,del删除操作都不行,删除操作实质上是新增了个版本。

  5. Watch-service

    1. Watch API 提供了一个基于事件的接口,用于异步监视键的更改。etcd 监视程序通过从给定的修订版本(当前版本或历史版本)连续监视来等待key更改,并将key更新流回客户端。

    2. 监视持续运行,并使用 gRPC 来流式传输事件数据。监视流是双向的,客户端写入流以建立监视事件,并读取以接收监视事件。单个监视流可以通过使用每个观察器标识符标记事件来复用许多不同的观察。这种多路复用有助于减少 etcd 群集上的内存占用量和连接开销。

    3. Watch 事件具有如下三个特性:

      1. 有序,事件按修订顺序排序;如果事件早于已发布的事件,它将永远不会出现在列表上。
      2. 可靠,事件序列永远不会丢弃任何事件子序列;如果按时间顺序为 a < b < c 三个事件,那么如果 Watch 接收到事件 a 和 c,则可以保证接收到 b。
      3. 原子,保证事件清单包含完整的修订版;同一修订版中通过多个键进行的更新不会拆分为多个事件列表。
    4. Watch 观察将要发生或者已经发生的事件。输入和输出都是流;输入流用于创建和取消观察,而输出流发送事件。一个观察 RPC 可以在一次性在多个 key 范围上观察,并为多个观察流化事件。整个事件历史可以从最后压缩修订版本开始观察。(当客户端希望从最近已知的修订版本开始恢复断开的观察者时有用)

    5. 无法监听压缩修订版本前的版本。

  6. Lease-service

    1. Lease service 提供租约的支持。Lease 是一种检测客户端存活状况的机制。集群授予具有生存时间的租约。如果Etcd集群在给定的 TTL 时间内未收到 keepAlive,则租约到期。

    2. 为了将租约绑定到键值上,每个 key 最多可以附加一个租约。当租约到期或被撤销时,该租约所附的所有 key 都将被删除。每个过期的key都会在事件历史记录中生成一个删除事件。

    3. 在 rpc.proto 中 Lease service 定义的接口如下:

      service Lease {
        rpc LeaseGrant(LeaseGrantRequest) returns (LeaseGrantResponse) {}
        # 创建租约
        rpc LeaseRevoke(LeaseRevokeRequest) returns (LeaseRevokeResponse) {}
        #撤销租约
        rpc LeaseKeepAlive(stream LeaseKeepAliveRequest) returns (stream LeaseKeepAliveResponse) {}
        #维持租约
        rpc LeaseTimeToLive(LeaseTimeToLiveRequest) returns (LeaseTimeToLiveResponse) {}
        # 获取租约信息
      }
      
    4. 具体消息体自行查阅。

分布式锁简单实现

  1. 简而言之:通过在etcd中存入key值来实现上锁,删除key实现解锁

  2. 因为 etcd 使用 Raft 算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。

  3. ETCD提供了lease租约、全局版本revision机制、prefix机制、以及watch监听机制,那么基于这些功能就可以实现一个分布式锁

    1. 租约:可以让获取锁的对象在耗时的情况下保持心跳,同时防止网络故障导致的死锁,即自动释放,保证了业务的可用性和安全性。

    2. Revision:每个 key 带有一个 Revision 号,每进行一次事务便+1,它是全局唯一的, 通过 Revision 的大小就可以知道进行写操作的顺序。在实现分布式锁时,多个客户端同时抢锁, 根据 Revision 号大小依次获得锁,可以避免 “羊群效应” ,实现公平锁。本质上就是 etcd 维护的一个在集群范围内有效的 64计数器(单调递增)。只要 etcd 的键空间发生变化, revision 的值就会相应地增加。

    3. prefix机制:例如一个名为/etcd/lock的锁,两个客户端一起争抢,同时写入了/etcd/lock/id1,/etcd/lock/id2 客户端自己的ID,但是客户端现在如何判断自己是否获得锁,利用prefix查询机制,查出这两条数据,然后利用Revision机制来判断自己写入的id是否是最先写入的,由此来判断自己是否获得锁。

    4. watch机制:watch机制不仅可以监听一个key,同样也可以监听一个范围,

      1. 当前客户端抢锁失败的时候,就得等待获得锁的客户端释放锁。
      2. 如何知道自己已获取锁,那么就得监听自己的revision-1的key的锁释放,**这个key称为pre-key,**如果监听到pre-key的DELETE事件,那么就说明自己已获得锁。

      在这里插入图片描述

  4. 流程

    1. 客户端初始化与建立连接;
    2. 创建可取消的租约,自动续租;
    3. 创建事务,获取锁;
    4. 执行业务逻辑,最后释放锁。

进阶

见一下回

【ETCD】简介&安装&常用操作---图文并茂详细讲解 阅读详情

相关推荐

ETCD 源码学习--简述(一)

前段时间认真学习了 ETCD 源码实现,往后的一段时间,会陆陆续续的写一些学习记录。 ETCD 的使用方法、用途等,可以通过 Google 或者百度查询,这里只是记录源码相关的学习,如有错误,欢迎指正。 本章主要介绍 ETCD 的主要几个组成部分。 ECTD主要包括以下几个部分: Storage 存储包括两部分组成,内存和磁盘。 index:键值索引(MVCC 多版本控制) kv:原始键值对(MVCC 多版本控制) snaphot:数据快照 metadata:元数据,主要记录当前节点的状态

H_L_S的专栏 655

Etcd 介绍与使用(入门篇)

etc (基于 Go 语言实现,)在 Linux 系统中是配置文件目录名;etcd 就是配置服务;etcd 诞生于 CoreOS 公司,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基于此,etcd 设计为提供高可用、强一致性的小型** kv 数据存储**服务。项目当前隶属于 CNCF 基金会,被包括 AWS、Google、Microsoft、Alibaba 等大型互联网公司广泛使用;

热爱数据库的小胖 6430

ETCD中间件原理:分布式键值存储系统解析

在分布式系统的世界里,**“一致性”和“高可用”**是永恒的课题。就像人类社会需要一个“权威中心”来协调集体行动(比如议会制定法律),分布式系统也需要一个“大脑”来存储关键信息(比如服务地址、配置参数)并保证所有节点的认知一致。ETCD正是这样一个“大脑”——它基于Raft算法实现强一致性,为Kubernetes、微服务架构等云原生系统提供了核心的分布式键值存储能力。本文将从生活比喻入手,逐步解析ETCD的核心原理(Raft算法、存储结构)、实现细节(代码示例、架构设计),并结合实际应用场景。

架构师的AI之路,分享AI应用开发架构的学习与实践。 381

etcd的使用

ETCD是一个分布式、可靠的key-value存储的分布式系统,用于存储分布式系统中的关键数据;当然,它不仅仅用于存储,还提供配置共享及服务发现;基于Go语言实现。

wang11876的博客 1543

三相逆变器拓扑结构的分析及应用场景

三相逆变器是电力电子领域中广泛应用的一种设备,用于将直流电转换为交流电。不同的拓扑结构在性能、成本、复杂度和应用领域上存在差异。小编将在本文中将进一步拓展对三相逆变器拓扑结构的分析,并探讨其适用的应用场景。

道合顺的博客 2235

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1750

etcd学习笔记 - 入门_etcd 学习文档

Etcd本质上与一个NoSQL的数据库系统也有几分神似,但更准确的说法说是一个高可用的键值存储系统。与一般的NoSQL数据库不同,Etcd在设计的初衷主要用于是共享配置和服务发现,它的灵感来自于ZooKeeper和Doozer。其名称来源于unix 的“/etc”文件夹和分布式系统 (“D”istribute system) 的 D,组合在一起表示 etcd 是用于存储分布式配置的信息存储服务。# 支持的选项包括:# --ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0)则永不超时。

2401_87300374的博客 1089

避坑指南:PCIe设备兼容性那些坑——聊聊MPS/MRRS设置不当引发的血泪史

本文深入探讨了PCIe设备兼容性问题,特别是MPS/MRRS参数设置不当引发的常见故障。通过详细解析MPS(Max Payload Size)和MRRS(Max Read Request Size)的作用机制,提供Linux内核五大配置策略的对比分析,并分享FPGA加速卡等实战案例的排查经验。文章还介绍了诊断工具链、动态调试技巧以及性能优化方法,帮助工程师有效解决PCIe兼容性难题。

weixin_30872499的博客 419

Etcd学习笔记

主要用于微服务的配置中心和服务发现,数据可靠性比redis更强在对外api的应用中,如何知道order服务的rpc地址?如果服务的ip地址变化了怎么办?在传统的配置文件模式,修改配置文件,应用程序是需要重启才能解决的,所以引入etcdwindows安装docker安装安装完成后在下载路径启用cmd(因为未加环境变量)etcd百度网盘 请输入提取码提取码:7777etcdkeeper百度网盘 请输入提取码提取码:7777etcd文档etcd不同系统安装。

m0_65534674的博客 1140

PySpark 本地开发环境搭建与实践

本文详细介绍了 PySpark 本地开发环境的搭建过程,包括 JDK、Hadoop、Anaconda、PySpark 的安装以及 Pycharm 工程的创建。同时,深入讲解了代码编写、本地开发案例(如 WordCount、处理特殊分隔符、读取 hdfs 数据、获取外部变量)、Spark 程序的监控和 local 模式下结果文件数量问题等内容。通过掌握这些知识和技能,读者可以在 Windows 本地环境中高效地进行 PySpark 开发,处理大规模数据,解决实际业务中的数据分析和处理问题。

天冬忘忧的博客 3011

安卓手机必备:Auto.js快手极速版自动刷视频避坑指南(含最新3.0脚本)

本文是一份安卓自动化工具Auto.js的全面实践指南,重点解析了如何搭建稳定运行环境、配置关键权限以及管理脚本。针对快手极速版等应用的自动化需求,文章详细介绍了设备选择、Auto.js版本对比、各品牌手机后台保活设置,并强调了脚本安全与调试技巧,帮助用户有效避坑,实现自动化任务的稳定执行。

i7j8k9l的博客 782

开篇词|为什么你要学习etcd?

你好,我是唐聪,etcd活跃贡献者,腾讯资深工程师,欢迎你和我一起学习etcd。开门见山,今天我想和你聊聊为什么要学习etcd。随着Kubernetes成为容器编排领域霸主,etcd也越来越火热,越来越多的软件工程师使用etcd去解决各类业务场景中遇到的痛点。你知道吗?etcd的GitHub star数已超过34.2K,它的应用场景相当广泛,从服务发现到分布式锁,从配置存储到分布式协调等等。可以说...

优快云学习 365

蓝桥杯算法:打印图形——六芒星

【输入格式】 输入一行包含一个整数 n。 【输出格式】 输出一个六芒星,表示满足题意的图形。 【样例输入】 3 4 【样例输出】 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 20。 总结: 第一次做图形题,做了蛮久,图形题有很多的方式去完成,它考验的是你能不能找到更简单的那一种方式. 我初看到这个图形,第一种想法是把这个六芒星当做六个小三角形来做,然后以某种规则排列一下,就能做出来,但是尝试了一下感觉太麻烦了。 然后我的第二种想法是,这个图形是对称图形,怎么能写出一半吗? 这样另一半想办

KeepCodeing 3835

etcd学习入门

etcd提供了一个可靠的、高可用的、一致性的键值存储,可以用于存储和检索关键的配置数据、共享状态信息以及协调分布式系统中的各个组件。etcdctl提供了一组丰富的命令,用于执行各种操作,例如设置键值、获取键值、观察键值的变化、管理成员等。通过学习etcd,你将能够了解分布式存储系统的基本概念和工作原理,以及如何在实际项目中使用etcd来管理和协调分布式系统的数据和状态。总结起来,etcd中的键值存储规范主要是关于命名空间、唯一性、可读性和数据格式等方面的建议,以便更好地组织和管理数据。

无心插柳 894

如何合理评估信号过孔的残桩效应--Via Stub

设计中,之所以会去考察信号过孔的残桩效应(Via Stub),是因为它的存在导致了不需要的频率谐振,当这些谐振出现在所关注的信号通道的插入损耗中时,就会引发较为严重的信号完整性(SI)问题,那么Via Stub到底是如何引发SI问题的呢?

一只豌豆象的博客 4464

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略 目录 Knowledge Engineering知识工程的简介 0.1、What 0.2、How 0.3、Why 1、知识工程过程的5个活动 2、知识图谱的应用 Knowledge Engineering知识工程的发展 1、前知识工程时期——1950-1970时期:图...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5335

Etcd教程 — 第七章 Etcd之事务API_etcd txn(1),大牛教你怎么学习Golang多进程

Txn 方法在单个事务中处理多个请求。txn 请求增加键值存储的修订版本并为每个完成的请求生成带有相同修订版本的事件。Etcd 不容许在一个 txn 中多次修改同一个 key。请求的消息体 TxnRequest 定义如下:// compare 是断言列表,体现为条件的联合// 成功请求列表,当比较评估为 true 时将被应用。// 失败请求列表,当比较评估为 false 时将被应用。compare 如果比较成功,那么成功请求将被按顺序处理,而应答将按顺序包含他们对应的应答;

2401_84248681的博客 988

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ETCD学习使用

etcd(分布式)是一个开源的分布式系统工具,用于可靠地存储和提供键值对数据。etcd 通常通过 HTTP 或 gRPC 提供 API,允许应用程序通过简单的接口与其交互。由于其可靠性和稳定性,etcd 在构建可扩展、分布式、高可用的系统中发挥着重要的作用。

游王子og的博客 1771

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Etcd原理基础学习

Etcd是一个开源的分布式键值存储系统。它的设计目的就是提供高可用性和强一致性的分布式数据管理服务,也就是CAP原理中的CP原理简单:etcd 的安装简单,且为用户提供了 HTTP API,用户使用起来也很简单存储:etcd 的基本功能,数据分层存储在文件目录中,类似于我们日常使用的文件系统Watch 机制:Watch 指定的键、前缀目录的更改,并对更改时间进行通知安全通信:SSL 证书验证高性能:etcd 单实例可以支持 2k/s 读操作,官方也有提供基准测试脚本。

2303_79710813的博客 815

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

云原生 etcd 系列-1|为什么值得学习?

云原生 etcd 系列|为什么值得学习? 什么是 etcd ? etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目。etcd 官网上有这么一段话: A distributed, reliable key-value store for the most critical data of a distributed system etcd 是一个分布式、高可靠的 kv 系统,基于 Go 语言实现,内部使用 raft 协议来保证数据一致性和高可靠性。 哦,就是一个 kv 系统哦,etc

琦彦 655

etcd学习记录

微信公众号:运维开发故事,作者:华仔 前言 最近买了一份etcd课程,希望通过这样的方式来记记录一下学习过程和结果。环境说明如下: 序号 IP 主机名 说明 1 10.211.55.50 etcd1 etcd version为3.4.16,虚拟机,系统为CentOS 7.7,使用自签证书 2 10.211.55.51 etcd2 3 10.211.55.52 etcd3 一、集群搭建 我这里将etcd部署在虚拟机上,采取静态配置,即etcd各节点在配置中指定。 所有节点.

wanger5354的博客 245

2024年Go最新etcd学习笔记 - 入门_etcd 学习文档,2024年最新4年小Golang的心路历程

支持的选项包括:# --ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0)则永不超时# --swap-with-value value 若该键现在的值是 value,则进行设置操作# --swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作。

2401_84911322的博客 1123

2024年ETCD 安全证书,2024年最新学习路线+知识点梳理

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。同时每个成长路线对应的板块都有配套的视频提供:因篇幅有限,仅展示部分资料[root@localhost etcd]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -#将会生成以下几个文件:ca-key.pemca.csrca.pem“hosts”: [],“key”: {},

2401_84281594的博客 1052

ETCD学习

1,ETCD是一个键值对数据存储系统(开源,分布式) 2,用途:提供共享配置、服务发现。 3,leader选举非常优秀,leader选举更换对前端是无感知的。(raft算法) 4,读写数据在ETCD上,支持快照及查看历史事件 5,数据模型:一个持久的并发控制数据模型,适用于较小的元数据键值对的处理 功能介绍 本身状态查看(集群成员信息、集群状态、leader状态等 键值数据的读写:set,get 租约:带有Id的定时器,可以和多个存储键值关联(自动过期删除) 观察者:分布式系统中间有大量的信号同步,这个就可

丁香枝上,豆蔻梢头 688

ETCD 学习使用

选举机制是基于Paxos算法实现的,选举成功后,Leader会向所有Follower发送心跳,如果Follower在一定时间内没有收到心跳,则认为Leader宕机,会发起选举。当Leader节点收到写请求时,会先写入本地磁盘,然后会广播给所有Follower节点,Follower节点收到广播后,会写入本地磁盘,并返回成功。如果这时收到了混合响应,当Leader宕机时,如果是三个节点中的另外两个节点同时发起选举,票数不能过半,选举失败,两个节点会等待一个随机的选举超时时间,然后再次发起选举。

行者游学 813

【etcd学习】初识etcd

etcd(读作 et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调。etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络。etcd 是许多其他项目的核心组件它是 Kubernetes 的首要数据存储,也是容器编排的实际标准系统。使用 etcd, 云原生应用可以保持更为一致的运行时间,而且在个别服务器发生故障时也能正常工作。应用从 etcd 读取数据并写入到其中;

weixin_45919793的博客 846
上一篇: ETCD-Linux环境单机安装简易教程
下一篇: Builder建造者设计模式秒懂
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值