etcd是k8s系统中的一个组建,安装在master节点中,负责数据的存储,以及节点的注册发现。在学习k8s权威指南的时候并没有对etcd内部怎么实现原理进行一个深入的学习分析。在想深入zookeeper的时候看到一个zookeeper和etcd的对比。首先来看下对比图,然后对etcd进行一个理解。

6ade7772912d889a37f54f8f91cc1916.png
概述

etcd 是一个分布式的、可靠的 key-value 存储系统,它用于存储分布式系统中的关键数据,这个定义非常重要。

接口介绍

etcd提供主要如下接口

put/delete:负责数据的增加删除,以key/value的形式进行存储,每一个key/value的存储都有几个属性,create_revision(创建时候对应的version),mod_revision(本次被修改对应的version),version(计数器,代表keyvalue被修改多少次)

get:负责数据的获取,2种方式,一种传参数为key,一种为参数的范围,其两个参数可能是

version。比如get(3,5)为第三次到第五次修改,返回一个列表value范围。

watch:实现数据订阅,让客户端知道etcd存储数据的一个增量变化。etcd支持对同一个key发起多次修改,因为etcd内部记录了所有的修改记录,使用watch机制可以从任意时刻对key发起一个数据通道的watcher,之后从该version时刻的所有变更都会推送给客户端。实现客户端的数据订阅。

事务:etcd通过事务来实现分布式系统对数据操作的一致性,理解为一个if else的条件。因为etcd支持对一个key的多次修改,就是通过事务来保证数据的一致性。

lease:租约接口,创建租约,并绑定到数据存储的key,通过对租约的可用性,来保证后端集群中node的剔除,在keepalived中是利用tcp探针,网络探针等检测node的可用性。假设我们在etcd存储了2个key。

node1:192.168.1.100

node2:192.168.1.101

在我们 的node1 node2的agent进程中分别创建一个租约,进程需要一直调用KeeyAlive刷新租约,如果node1进程奔溃,无法刷新,那么etcd就会剔除node1这个key,那么master节点就能通过watch机器在进行任务调度的时候不在分配给node1.直到node1的进程再次启动,重新发起put请求,进行数据的存储。

场景介绍

1.元数据存储。

进程简单的发起put请求将相关元数据存储在etcd中,至于数据的一致性由etcd来保证,etcd 中,该分布式一致性算法由 Raft 一致性算法完成,Raft实现数据一致性的前提是etcd集群的正常工作。(N+1)/2 ,所以一般是3个或者5个节点,Raft认为即使有节点挂掉,肯定会在一个节点存在待提交的数据,基于这个原理,在leaer切换期间也能保证数据 的一致性。

2服务发现

当slave进程启动时候,会将自身地址注册到etcd. 当进程挂掉之后,实现slave的剔除。

3分布式一致性,选举

一般一个集群是存在多个master,master会将自身ip注册到etcd,当一个master挂掉后,通过etcd的选举功能,选出一个可用的master,Slave 又能够拉取新的主节点的 IP,继续恢复服务。

4.分布式并发控制

如果一个slave进程计算任务时间长没,可以将一些运行过程中的数据存储到etcd,假如slave挂掉,等到恢复后,可以从etcd读取中间态数据,加速任务执行周期。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐