go语言 | etcd源码导读(一)

参考

本文参考https://zhuanlan.zhihu.com/p/600893553
https://www.topgoer.com/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C/go%E6%93%8D%E4%BD%9Cetcd/etcd%E4%BB%8B%E7%BB%8D.html


前沿etcd 与 raft

etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。

类似项目有zookeeper和consul。

etcd具有以下特点:

  • 完全复制:集群中的每个节点都可以使用完整的存档
  • 高可用性:Etcd可用于避免硬件的单点故障或网络问题
  • 一致性:每次读取都会返回跨多主机的最新写入
  • 简单:包括一个定义良好、面向用户的API(gRPC)
  • 安全:实现了带有可选的客户端证书身份验证的自动化TLS
  • 快速:每秒10000次写入的基准速度
  • 可靠:使用Raft算法实现了强一致、高可用的服务存储目录

etcd 基于 golang 编写,github 开源地址:https://github.com/etcd-io/etcd . 本文走读的源码版本为 tag: v3.1.10.

在这里插入图片描述
etcd 中关于 raft 算法的实现具有很高的还原性,项目中与 raft 有关的代码主要位于:

模块目录
raft 算法层./raft/*
raft 应用层示例./contrib/raftexample/*
raft 数据结构定义./raft/raftpb

在这里插入图片描述


etcd应用场景

服务发现

服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。

在这里插入图片描述

配置中心

将一些配置信息放到 etcd 上进行集中管理。

这类场景的使用方式通常是这样:应用在启动的时候主动从 etcd 获取一次配置信息,同时,在 etcd 节点上注册一个 Watcher 并等待,以后每次配置有更新的时候,etcd 都会实时通知订阅者,以此达到获取最新配置信息的目的。

分布式锁

因为 etcd 使用 Raft 算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序。

  • 保持独占即所有获取锁的用户最终只有一个可以得到。etcd 为此提供了一套实现分布式锁原子操作 CAS(CompareAndSwap)的 API。通过设置prevExist值,可以保证在多个节点同时去创建某个目录时,只有一个成功。而创建成功的用户就可以认为是获得了锁。
  • 控制时序,即所有想要获得锁的用户都会被安排执行,但是获得锁的顺序也是全局唯一的,同时决定了执行顺序。etcd 为此也提供了一套 API(自动创建有序键),对一个目录建值时指定为POST动作,这样 etcd 会自动在目录下生成一个当前最大的值为键,存储这个新的值(客户端编号)。同时还可以使用 API 按顺序列出所有当前目录下的键值。此时这些键的值就是客户端的时序,而这些键中存储的值可以是代表客户端的编号。

在这里插入图片描述

为什么用 etcd 而不用ZooKeeper?

etcd 实现的这些功能,ZooKeeper都能实现。那么为什么要用 etcd 而非直接使用ZooKeeper呢?

为什么不选择ZooKeeper?

  • 部署维护复杂,其使用的Paxos强一致性算法复杂难懂。官方只提供了Java和C两种语言的接口。
  • 使用Java编写引入大量的依赖。运维人员维护起来比较麻烦。
  • 最近几年发展缓慢,不如etcd和consul等后起之秀。

为什么选择etcd?

  • 简单。使用 Go 语言编写部署简单;支持HTTP/JSON API,使用简单;使用 Raft 算法保证强一致性让用户易于理解。
  • etcd 默认数据一更新就进行持久化。
  • etcd 支持 SSL 客户端安全认证。
    最后,etcd 作为一个年轻的项目,正在高速迭代和开发中,这既是一个优点,也是一个缺点。优点是它的未来具有无限的可能性,缺点是无法得到大项目长时间使用的检验。然而,目前 CoreOS、Kubernetes和CloudFoundry等知名项目均在生产环境中使用了etcd,所以总的来说,etcd值得你去尝试。

术语表

中文名英文名说明
算法层algorithm module内聚了 raft 共识机制的核心模块.代码层面以 sdk 的形式被应用层引入,启动时以独立 goroutine 的形式存在,与应用层通过 channel 通信.
应用层application module聚合了 etcd 存储、通信能力的模块.启动时是 raft 节点的主 goroutine,既要负责与客户端通信,又要负责和算法层交互,承上启下.
算法层节点Node/node是 raft 节点在算法层中的抽象,也是应用层与算法层交互的唯一入口.
应用层节点raftNode是 raft 节点在应用层中的抽象,内部持有算法层节点 Node 的引用,同时提供处理客户端请求以及与集群内其他节点通信的能力.
通信模块transportetcd 中的网络通信模块,为 raft 节点间通信提供服务.
提议proposal两阶段提交中的第一阶段:提议.
提交commit两阶段提交中的第二阶段:提交.
应用apply将已提交的日志应用到数据状态机,使得写请求真正生效.
数据状态机data state machineraft 节点用于存储数据的介质. 为避免与 raft 节点状态机产生歧义,统一命名为数据状态机.
节点状态机node state machineetcd 实现中,raft 节点本质是个大的状态机. 任何操作如选举、提交数据等,最后都会封装成一则消息输入节点状态机中,驱动节点状态发生变化.

宏观架构梳理

算法层

算法层是 raft 算法的核心实现模块,负责根据共识机制进行请求内容的正确性校验,预写日志状态的维护和管理,可提交日志的进度推进.

简单来看,算法层本质上类似于一台“拼图机器”. 我们把输入的日志比喻成一块块“拼图碎片”,提交拼图碎片的应用层则像个捣蛋的小孩,他将拼图顺序打乱并在其中掺入一些错误的碎片,然后依次将“碎片”提交给拼图机器(算法层).

拼图机器(算法层)则依照对图案轮廓的把握和碎片纹理的观察(raft 共识机制),依次纠正碎片的顺序和内容之后进行归还.

在这个比喻中,算法层可以被视为一台高效且精准的“拼图机器”,专门负责处理和组装日志数据,这些数据类似于一系列的拼图碎片。这台机器的核心是基于 raft 共识机制,一个复杂而强大的算法,设计用来确保分布式系统中数据的一致性和可靠性。当应用层(象征着一个调皮的小孩)生成和提交日志时,它可能会不按顺序提交,甚至夹杂一些错误或无效的数据碎片。这种无序和错误的数据代表了分布式系统中的节点可能出现的不一致或故障情况。

算法层的工作就是要从这些混乱和可能错误的输入中恢复出正确和有序的数据。通过对每个“碎片”(即日志条目)的内容进行仔细的审查和比对,算法层根据 raft 协议的规则来决定哪些碎片是有效的,哪些应该被丢弃或修正。它通过投票和日志复制机制确保所有节点上的数据保持一致。每个节点的算法层都会参与这个过程,从而确保整个系统在面对网络分区、节点故障等问题时仍能保持数据的一致性和完整性。

此外,算法层还需要管理数据碎片的正确顺序。在分布式系统中,维持操作的顺序是至关重要的,因为这直接影响到系统状态的正确性。算法层通过维护一个严格的日志序列,确保所有操作都按照一定的顺序执行。这就像是在解决拼图时,需要找到正确的碎片,并按照特定的顺序将它们放到恰当的位置。

总而言之,算法层(拼图机器)在这个系统中扮演了核心角色,负责处理来自应用层(捣蛋小孩)的混乱和不完整的输入,通过 raft 协议的精妙设计,它能够高效地校正和组织这些数据,最终形成一个完整且一致的数据结构,保证整个系统的稳定运行和数据的准确性。

在这里插入图片描述

应用层

在 etcd 的实现中,算法层只聚焦于 raft 共识机制部分的内容,其中涉及网络通信、预写日志持久化、数据状态机管理的工作均在应用层进行实现;

应用层是 raft 节点中承上启下的主干模块,既扮演了与外部客户端通信的服务端角色,也是下层算法库的使用者,还要负责与各模块交互,串联 raft 节点运行的整体流程.

由于本文探讨的重点集中 raft 共识机制部分,因此应用层不是我们所研究的重点,更多的笔墨会集中在算法层的内容中.

宏观架构

在这里插入图片描述
etcd 在实现 raft 时,将内容依据职责边界拆分为应用层和算法层两个模块,在引用关系上,算法层是一个被应用层引用的静态库,但在节点启动时,最终应用层和算法层的内容会内聚于两个独立的 goroutine 当中,依据几个 channel 进行模块间的异步通信,两个模块的核心职责点展示如上图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/224055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享“技艺与传承”的魅力!春城晚报(开屏新闻)生活节第七期媒体开放日活动举行

近日,由云南报业传媒(集团)有限责任公司、云南春晚传媒有限公司指导;金格金俊广场、云南精品文化传媒有限公司联合主办的第七期媒体开放日活动在金格金俊广场B1共享空间举办。本次活动以「技艺与传承」为主题,特邀青年…

处理实时视频流:第三方美颜SDK的实时图像处理策略

为了提高用户体验,许多应用和平台开始采用第三方美颜SDK,通过先进的图像处理技术实时改善视频中的面部外观。本文将深入探讨这些第三方美颜SDK在实时视频流处理中所采用的图像处理策略,揭示其背后的技术原理和创新。 一、引言 实时视频流处理…

软著项目推荐 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

深度学习(六):paddleOCR理解及识别手写体,手写公式,表格

1.介绍 1.1 什么是OCR? 光学字符识别(Optical Character Recognition, OCR),ORC是指对包含文本资料的图像文件进行分析识别处理,获取文字及版面信息的技术,检测图像中的文本资料,并且识别出文本的内容。…

文献阅读:基于改进ConvNext的玉米叶片病害分类

文献阅读:基于改进ConvNext的玉米叶片病害分类 CBAM注意力机制模块: 1:通道注意力模块,对输入进来的特征层分别进行全局平均池化(AvgPool)和全局最大池化(MaxPool)(两个…

详解nginx优势以及应用场景,实操编译安装和nginx版本平滑升级

目录 一、nginx的特点 那么nginx有哪些特点? 先讲nginx的优点: 缺点: 二、nginx与Apache的区别 三、nginx的应用场景 四、nginx为什么能支持高并发 五、为什么nginx不使用多线程 六、nginx的两种进程分别有什么作用 七、编译安装ngi…

Linux文件部分知识

目录 认识inode 如何理解创建一个空文件? 如何理解对文件写入信息? 如何理解删除一个文件? 为什么拷贝文件的时候很慢,而删除文件的时候很快? 如何理解目录 ​编辑 文件的三个时间 ​编辑 Access: …

HarmonyOS架构及关键技术整理

技术解析:鸿蒙系统的底层优势 鸿蒙系统采用了先进的微内核设计,这是一种全新的系统架构,能够更好地适应现代智能设备的多样性和互联性。微内核通过最小化系统的核心功能,提高了系统的安全性和可定制性。此外,鸿蒙系统…

利用阿里云 DDoS、WAF、CDN 和云防火墙为在线业务赋能

在这篇博客中,我们将详细讨论使用阿里云 CDN 和安全产品保护您的在线业务所需的步骤。 方案描述 创新技术的快速发展为世界各地的在线业务带来了新的机遇。今天的人们不仅习惯了,而且依靠互联网来开展他们的日常生活,包括购物、玩游戏、看电…

react 学习笔记 李立超老师 | (学习中~)

文章目录 react学习笔记01入门概述React 基础案例HelloWorld三个API介绍 JSXJSX 解构数组 创建react项目(手动)创建React项目(自动) | create-react-app事件处理React中的CSS样式内联样式 | 内联样式中使用state (不建议使用)外部样式表 | CSS Module React组件函数式组件和类组…

UDP多人群聊

一,创建类 二,类 1,Liao类 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String;public class Liao extends JFrame{private static final int D…

图像处理中的角点检测Python-OpenCV 中的实现

马丁亚当斯 (Martin Adams)在Unsplash上拍摄的照片 一、说明 在图像处理的背景下,“特征”可以直观地理解为图像中易于识别并用于表示图像的独特或独特的部分。将特征视为图像中使其可区分的“地标”或“焦点”。为了使这一点更具关联性,请考虑一下您如…

JFrog Artifactory二进制文件管理工具部署使用

1.简介 JFrog Artifactory二进制文件管理工具,目前已经在使用的公司有很多,足见他的方便好用。 2.下载安装包 点击下载地址 这里我下载的是7.9.2版本 3. 安装 (1)在安装JFrog Artifactory之前需要安装好jdk(需…

持续集成交付CICD:Sonarqube自动更新项目质量配置

目录 一、实验 1.Sonarqube手动自定义质量规则并指定项目 2.Sonarqube自动更新项目质量配置 一、实验 1.Sonarqube手动自定义质量规则并指定项目 (1)自定义质量规则 ①新配置 ②更多激活规则③根据需求激活相应规则④已新增配置 ⑤ 查看 &#x…

梯度下降(批量梯度下降、随机梯度下降、小批量梯度下降)

在上一篇中我们推导了损失函数 J ( θ ) 1 2 m ∑ i 1 m ( y i − h θ ( x i ) ) 2 J(\theta) \frac{1}{2m} \sum_{i1}^{m} (y^{i} - h_{\theta}(x^{i}))^2 J(θ)2m1​∑i1m​(yi−hθ​(xi))2的由来,结尾讲到最小化这个损失函数来找到最优的参数 θ \theta θ&…

【C++】简单工厂模式

2023年12月6日,周三下午 今天又学习了一次简单工厂模式 每多学习一次,都会加深对设计模式的理解 目录 什么是简单工厂模式简单工厂模式的优缺点举例说明 什么是简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型…

uni-app 微信小程序之加载行政区图

文章目录 1. 实现效果2. 实现步骤 1. 实现效果 2. 实现步骤 使用三方组件 ucharts echarts 高性能跨全端图表组件页面导入引入的三方组件 组件demo代码 <template><view class"qiun-columns"><view class"cu-bar bg-white margin-top-xs"…

管理和监控CentOS上的HTTP服务

CentOS作为一款稳定的开源服务器操作系统&#xff0c;为各种网络服务提供了优秀的支持。其中&#xff0c;HTTP服务是互联网上最常用的服务之一&#xff0c;它为人们提供了便捷的信息访问和交互方式。在CentOS上管理和监控HTTP服务是一项重要的任务&#xff0c;下面我们将介绍一…

华为配置风暴控制示例

组网需求 如下图所示&#xff0c;SwitchA作为二层网络到三层路由器的衔接点&#xff0c;需要防止二层网络转发的广播、未知组播或未知单播报文产生广播风 配置思路 用如下的思路配置风暴控制。 通过在GE0/0/1接口视图下配置风暴控制功能&#xff0c;实现防止二层网络转发的…

轻快小miniconda3在linux下的安装配置-centos9stream-Miniconda3 Linux 64-bit

miniconda与anaconda的区别&#xff1a; Miniconda 和 Anaconda 是用于管理环境和安装软件包的 Python 发行版。它们之间的主要区别在于以下几点&#xff1a; 1. 安装内容和大小&#xff1a; Anaconda&#xff1a; Anaconda 是一个完整的 Python 数据科学平台&#xff0c;包含…