TypechoJoeTheme

Toasobi的博客

etcd概念与原理解释

本文最后更新于2022年09月21日,已超过728天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

etc在linux系统中是配置文件目录名,etcd就是配置服务

  • etcd基于Go语言实现,主要用于共享配置,服务发现,集群监控,leader选举,分布式锁等场景

服务发现: 假设有很多服务提供方和服务请求方,他们都会连接到etcd,(数据中心)。当服务提供方发布新服务,etcd的特性能够让服务请求方快速发现并连接新服务。

leader选举:首先服务提供方的原理是master-slave这么一个架构,master下面有许多slave节点,一旦etcd检测到master宕机,则会根据剩下的slave节点选举一个master节点来对外提供服务

分布式锁:应用于分布式系统中,众所周知,一个进程中,锁的持有以及释放对象:线程。分布式锁为了解决多个服务(进程)竞争一个临界资源的问题。这里我们可以添加一个etcd,所有服务都会连接etcd,那么可以由etcd对他们分发锁和释放锁。没有获取到锁的服务即阻塞,等待上一个服务获取完临界资源后释放锁。

  • 机制,作用

etcd可以保存重要少量文件,不能存储大量数据,是一个key value型的数据库
简单的kv操作 put del get
监控key值变化 watch key
事务操作 针对key

  • etcd架构

grpc server---接收请求,处理集群节点之间的通讯

wal就是日志,客户端的处理通过grpc Server先到leader中,leader先写日志,再通过wal同步给follower广播(先写日志,即强一致性,作用是如果leader宕机或其他原因导致操作失误,可以通过日志修改回来),leader收到一半以上的确认信息之后便会将操作提交并刷到磁盘之中,同步其他节点修改后返回给客户端。(实现数据强一致性)

snapshot 先快照leader数据再发送给follower,让follower保持和leader数据保持一致,保证强一致性

boltdb 为key创建索引,存储时内存维护的是b树(key对应版本信息)对应kv是key->revision,磁盘是b+树(版本信息对应value)对应kv是revision-> value,用于存储每一次操作的key版本信息。同时blotdb还实现了事务

  • 引入一个etcd特性:lease租约

当key非常多时,etcd压力会非常大。开发者发现大多数key的过期时间是一致的,于是便将众多过期时间一致的key绑定到一个实例对象上,etcd就只需要检测该实体是否过期便可以知道是否要删除。而这个实体就叫做lease租约


!!!!!!!!!

  • raft(分布式)共识算法 (面试常考!)

!!!!!!!!!
其中包含两个大步骤:leader选举和日志复制

  • 我们首先来了解leader选举制度

该制度的投票规则:
**每个人只有一票
只有候选者才能为自己投票
当收到别人拉票请求时,只要手里有票就投出去**

当有多个节点时,所有节点基本上可以分成三种状态:选民状态,候选者状态,leader状态
要选举出一个leader,首先得有一个选民节点变成候选者,之后候选者先会投自己一票,后会对周围所有节点施行拉票制度。当他收到大多数选票(超过二分之一)时,该节点就会成为leader。

问题:到底谁成为候选者?

首先引入两个超时概念:选举超时和心跳超时

选举超时:该超时属性每个节点均有,一般每个节点拿到时都是随机的,这个超时时间会决定候选者,谁的时间线跑完谁就能成为候选者。
心跳超时:该超时属性也是每个节点都有,用于检测两节点之间网络是否通畅。比如当检测到两心跳包好久没发消息,则下一次多传输一点数据。
一般选举超时要长一些,因为要干的事还挺多,比如选举,评票等等。

成为候选者之后term任期(全局变量,只会一直递增)加一,然后开始去拉票(此时会重置选举超时,为什么后面会说)。当候选者超过大多数选票时即成为leader(只会有一个leader)。之后leader会发送数据同步(通过snapshot,心跳方式发送)。follower收到数据同步包后,会重置两个超时。

选举任期持续到一方没收到心跳数据并成为候选者(心跳异常会造成选举超时过期,这个时间一超便会重新选举)(两个超时同时开启) 例如leader宕机了,则谁先超时谁就成为候选者,之后便会重复操作。

问题:同时成为候选者怎么办?
首先他们都会给自己投票,也同时去拉票,选举超时将会重置,超时一过便开始检验票数,当票数不同时,则票数多的节点当leader,当票数都相同时,则候选者都重置票数,选举超时重新随机分配,开始新一轮选举。

  • 接着便可以来了解日志复制了

这一步是leader选举完之后干的事了。假设客户端发送一个set value=5 的消息,首先leader会添加日志并把该操作加到日志中,之后便会广播给所有follower。大多数follower同意后leader便会提交,修改数据并写入磁盘,然后通知其他节点修改并返回结果给客户端。

  • 网络分区情况下(脑裂)的工作模式


节点之间只能访问同一个分区下的节点。
没有leader的分区会先选举出一个leader,之后两个客户端都会发送消息给两个leader,B节点只能收到2个回复(这里要算上自己),C节点可以收到3个回复。而一共有5个节点,B收到的回复没过节点数一半,于是无法提交消息,而C却可以提交消息,这就会导致脑裂。此时修复分区,老leaderB看到有新leader后便会自动退休,接收C的日志并丢弃旧日志。

朗读
赞(0)
评论 (0)