etcd之日志和快照管理

2023-11-14

系列文章目录

浅谈分布式系统与一致性协议(一)
浅谈分布式系统与一致性协议(二)
浅谈分布式系统与一致性协议(三)
深入浅出之etcd
深入浅出之etcd(二)
etcd版本之v3
etcd之安全性阐述
etcd的多版本并发控制


概述

etcd对数据的持久化采用的是binlog(日志,也称为WAL,即Write-Ahead-Log)加Snapshot(快照)的方式

在计算机科学中,预写式日志(Write-Ahead-Log,WAL)是关系数据库系统中用于提供原子性和持久性(ACID中的两个特性)的一系列技术。在使用WAL系统中,所有修改在提交之前都要写入log文件中

log文件中通常包括redo信息和undo信息。假设一个程序在执行某些操作过程中机器掉电了。在重新启动时,程序可能需要直到当时执行得操作是完全成功了还是部分成功或者完全失败。如果使用了WAL,那么程序就可以检查log文件,并对突然掉电时计划执行的操作内容与实际上执行的操作内容进行比较。在这个比较的基础上,程序就可以决定是撤销已做的还是继续完成已做的操作,或者保持原样

WAL允许用in-space的方式更新数据库。另一种用来实现原子更新的方法是shadow paging,它并不是一种in-place方式。用in-place方式进行更新的主要有点是减少索引和块列表的修改。ARIES是WAL系列技术常用的算法。在文件系统中,WAL通常称为journaling。PostgreSQL也是用WAL来提供oint-in-time恢复和数据库复制特性的

etcd数据库的所有更新操作都需要先写入到binlog中,而binlog是实时写到磁盘上的,因此这样就可以保证不会丢失数据,即使机器断电,重新启动以后etcd也能通过读取并重放binlog里面的操作记录来重新建立数据库

etcd数据的高可用性和一致性是通过Raft算法实现的,Master节点会通过Raft协议向Slave节点复制binlog,Slave节点根据binlog对操作进行重放,以维持数据的多个副本的一致性。也就是说binlog不仅仅是实现数据库持久化的一种手段,其实还是实现不同副本间一致性协议的重要手段。客户端对数据库发起所有写操作都会记录在binlog中,待主节点将更新日志在集群多数节点之间完成同步后,以便内存中的数据库中应用该日志项的内容,进而完成一次客户端的写请求

数据的持久化和复制

先看个例子。例如,通过以下命令向etcd中插入一个键值对

etcdctl set /foo bar

etcd会在默认的工作目录下生成两个子目录:snap和wal。两个目录的作用说明如下:

  • snap:用于存放快照数据。etcd为了防止WAL文件过多就会创建快照,snap用于存储etcd的快照数据状态
  • wal:用于存放预写式日志,其最大的作用是记录整个数据变化的全部历程。在etcd中,所有数据的修改在提交之前,都要写入WAL中。使用WAL进行数据的存储使得etcd拥有故障快速恢复和数据回滚两个重要的功能

故障快速恢复:如果你的数据遭到颇快,就可以通过执行所有WAL中记录的修改操作,快速从原始的数据恢复到数据损坏之前的状态

数据回滚(undo)/重做(redo):因为所有的修改操作都被记录在WAL中,所以进行回滚或者重做时,只需要反响或者正向执行日志即可

etcd的日志管理

etcd提供了一个WAL日志库,日志追加等功能均有该库完成。下面让我们先看一下WAL数据结构定义

WAL数据结构

WAL数据结构定义如下:

type WAL struct{
	dir string
	dirFile *os.File
	metadata []byte
	state raftpb.HardState
	start walpb.Snapshot
	decoder *decoder
	readClose func() error
	mu sync.Mutex
	enti uint64
	encoder *encoder
	locks []*fileutil.LockedFile
	fp *filePipeline
}

WAL管理所有的更新日志,主要处理日志的追加,日志文件的切换,日志的回放等操作

WAL文件物理格式

etcd所有的日志项最终都会被追加存储到WAL文件中,日志项有很多类型,具体如下:

  • metadataType :这是一个特殊的日志项,被写在每个WAL文件的头部
  • entryType:应用的更新数据,也是日志中存储的最关键数据
  • stateType:代表日志项中存储的内容时快照
  • crcType:前一个WAL文件里面的数据的crc,也是WAL文件的第一个记录项 snapshotType:当前快照的索引{term,index},即当前快照位于哪个日志记录,不同于stateType,这里只是记录快照的索引,而非快照的数据。

每个日志项都由四部分组成:

  • type:日志项类
  • crc:校验和
  • data:根据日志项类型存储的实际数据也不尽相同,如果snapshotType类型的日志项存储的是快照的日志索引,crcType类型的日志项中则无数据项,其crc字段便充当了数据项
  • padding:为了保持数据项8子节对其而填充的数据

WAL文件的初始化

etcd的WAL库提供了初始化方法,应用需要显示调用初始化方法来完成日志初始化的功能,初始化方法主要包括两个函数Create()与Open()

Create()所做的事情比较简单,具体如下:

  1. 创建WAL目录,用于存储WAL日志文件
  2. 预分配第一个WAL日志文件,默认是64MB,使用预分配机制可以提高写入性能
  3. Open则是在Create完成后被调用,主要是打开WAL目录下的日志文件
  4. Open的主要作用是找到当前快照以后的所有WAL日志,这是因为快照之前的日志我们不再关心,因为日志的内容肯定都已经被更新至快照了,这些日志也是在后面回收日志操作中可以被删除的部分

WAL追加日志项

日志项的追加通过调用etcd的wal库的Save()方法来实现,该函数的核心内容具体如下:

  • 调用saveEntry()将日志项存储到WAL文件中
  • 如果追加后日志文件超过了既定的SegmentSizeBytes大小,则需要调用w.cut()进行WAL文件的切换,即关闭当前WAL日志,创建新的WAL日志,继续用于日志追加
  • cut()的目的用于实现WAL文件切换的功能,每个WAL文件的预设大小均为64MB,一旦超过该大小,便会创建新的WAL文件,这样做的好处便是对旧的WAL文件进行删除

etcd v2的快照管理

etcd v2是一个纯内存数据库,写操作先通过Raft协议复制binlog,复制成功后将数据写入到内存中,整个数据库在内存中是一个简单的树结构,其轻微将数据实时写入到磁盘中,持久化考的是binlog和定期做快照实现的,总的俩讲,etcd v2做快照的方法就是将内存中的整个数据库复制一份,然后序列化成JSON,写入到磁盘中,称为快照。做快照的时候使用的是复制出来的数据库,客户端的读写请求依然会落到原始的数据库,也就是说做快照的操作不会阻塞客户端的读写请求

因为操作系统对内存进行了分页,同时内存的复制操作实际是COW的,所以只有当复制的某一个内存页发生更改时才会发生复制行为,即只有那些被客户端读到的数据也才会在内存中被复制,那些没有读到的压根不会发生复制。

快照数据结构如下:

type ConfState struct{
	Nodes []uint64
}

type SnapshotMetadata struct{
	ConsState ConfState
	Index uint64
	Term uint64
}
type Snapshot struct{
	Data []byte
	Metadata SnapshotMetadata
}

创建快照

创建快照的时机时在请求的处理的流程之中,具体来说,Raft协议每获取到日志项之后,在处理该日志的过程中就会判断是否创建快照。创建快照的具体包含如下几个步骤:

  1. 判断是否传创建快照,该过程有一定的代价,因此不会每次都执行。
  2. 创建快照,由应用实现具体的创建方法
  3. 通过raftStorage创建快照
  4. 存储日志
  5. 进行日志回收(compact)

对于执行快照创建的时机进行判断时,etcd采用较为简单的策略:每处理10000条日志进行一此快照

创建快照的的操作代码如下,直接将内存中的数据库复制一份转换成JSON即可

func (s *kvstore)getSnapshot()([]byte,error){
	s.mu.Lock()
	defers.mu.Unlock()
	return json.Marshal(s.kvStore)
}

拿到整个数据库快照之后,还要添加一些metadata,比如该快照的版本号等,然后就可以将快照进行持久化了

func (rc *raftNode)saveSnap(snap raftpb.Snapshot) error{
	walSnap:=walpb.Snapshot{
		Index:=snap.Metadata.Index,
		Term:=snap.Metadata.Term,
	}
	if erro:=rc.wal.SaveSnapshot(WalSnap);err!=nil{
		return err
	}
	if err:=rc.snapshotter.SaveSnap(snap);err!=nil{
		return err
	}
	return rc.wal.ReleaseLockTo(snap.Metadata.Index)
}

持久化存储具体包括以下几个内容

  • 快照索引:即当前快照的其实日志项索引信息(term/index),该信息被存储在WAL日志文件所在目录
  • 快照数据:即快照的真正数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

etcd之日志和快照管理 的相关文章

  • MySQL中设置自增主键id从1开始

    可能遇到过这种问题 当你只想新增一条数据时 发现使用Insert语句后 发现id并不是从1开始的 握草 怎么回事 其实很简单 通过执行一下SQL 对应你的表就可以解决 ALTER TABLE user AUTO INCREMENT 1 具体
  • 【计算机开题报告】二手车交易平台

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 选题目的 意义 如今时代网络技术正在快速发展 电子商务技术也以极为强势的姿态闯入人们的视野之中 随着人们生活质量的提升 为了对身边二手物品进行回收利用 二
  • 如何处理不稳定的自动化测试?

    abluecolor 在解决这个问题之前 请停止编写更多测试 因为这将花费你较高的测试维护成本 你需要尽快行动起来对不稳定的原因进行深入研究 找到不稳定的根因 并且尝试在流程 环境和代码方面做一些优化工作解决它 MasterKindew 如
  • 神州信息一表通监管合规系统

    什么是 一表通 国家金融监督管理总局为进一步建立健全数据统计监管体系 规范数据报送指标体系 明确检测数据规则 而推行建立的一套新体系监管报送方式 提升校验准确性和信息安全性 近期 国家金融监督管理总局更是进一步加大推动 一表通 的实行试点范
  • python按列写入数据到excel

    要将数据按列写入 Excel 可以使用 Python 的 openpyxl 库 首先 需要安装 openpyxl 库 可以使用以下命令在终端或命令提示符中安装 pip install openpyxl 然后 可以按照以下步骤编写代码 1 导
  • K8S部署pod状态CreateContainerConfigError问题解决

    天行健 君子以自强不息 地势坤 君子以厚德载物 每个人都有惰性 但不断学习是好好生活的根本 共勉 文章均为学习整理笔记 分享记录为主 如有错误请指正 共同学习进步 文章目录 场景 问题 解决 场景 在k8s中部署gitlab后查看状态并非R
  • SQL 解析与执行流程

    一 前言 在先前的技术博客中 我们已经详细介绍过数据库的 parser 模块与执行流程 用户输入的 SQL 语句通过词法解析器生成 token 再通过语法分析器生成抽象语法树 AST 经过 AST 生成对应的 planNode 最后执行 p
  • go cannot find package “github.com/gorilla/websocket“解读

    Go无法找到包 github com gorilla websocket 的解决方案 在Go开发过程中 我们经常会依赖第三方库来简化开发工作 而使用 go get 命令安装这些库时 有时候我们可能会遇到类似于以下错误的情况 plaintex
  • 亚信安慧AntDB引领数字化转型:浙江移动成功实现CRM系统全域改造

    数字时代 通信运营商在不断迭代的背景下 需要不断探索数字化转型的路径 以适应快速发展的市场和技术环境 在这一浪潮中 浙江移动站在前沿 率先完成了其CRM系统的全域改造 采用了亚信安慧公司研发的AntDB数据库 为整个行业树立了数字化转型的标
  • 6 - 数据备份与恢复|innobackupex

    数据备份与恢复 innobackupex 数据备份与恢复 数据备份相关概念 物理备份与恢复 逻辑备份 推荐 使用binlog日志文件实现对数据的时时备份 使用日志 恢复数据
  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • 【计算机毕业设计】航空信息管理系统

    传统信息的管理大部分依赖于管理人员的手工登记与管理 然而 随着近些年信息技术的迅猛发展 让许多比较老套的信息管理模式进行了更新迭代 飞机票信息因为其管理内容繁杂 管理数量繁多导致手工进行处理不能满足广大用户的需求 因此就应运而生出相应的航空
  • 【计算机毕业设计】校园体育赛事管理系统

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • 【计算机毕业设计】北关村基本办公管理系统

    在如今社会上 关于信息上面的处理 没有任何一个企业或者个人会忽视 如何让信息急速传递 并且归档储存查询 采用之前的纸张记录模式已经不符合当前使用要求了 所以 对北关村基本办公信息管理的提升 也为了对北关村基本办公信息进行更好的维护 北关村基
  • 软件测试/测试开发/全日制/测试管理丨Redis内存数据库

    Redis是一种开源 内存中的数据结构存储系统 它提供了高性能 灵活性和丰富的数据结构 以下是Redis内存数据库的基本介绍 键值存储 Redis基于键值对的存储模型 其中每个键都与一个特定的值相关联 这种简单的数据模型使其易于使用和理解
  • 基于java的学生宿舍管理系统设计与实现

    基于java的学生宿舍管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生宿舍管理系统设计与实现的研究背景和动机 在数字化时代的推动下 学生宿舍管理系统已经成为了管理学生宿舍的重要工具 学生宿舍管理系统能够帮助管理者更好地管
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • Kubernetes (十二) 存储——Volumes配置管理

    一 卷的概念 官方地址 卷 Kubernetes https v1 24 docs kubernetes io zh cn docs concepts storage volumes 二 卷的类型及使用 emptyDir卷 1 创建编辑文件
  • 在 Kubernetes 集群上使用 etcdctl 时出现错误:“证书由未知机构签名”

    我正在运行 minikube 并且正在尝试列出 ETCD 上的密钥 我下载了最新的etcdctl来自github的客户端 https github com etcd io etcd releases download v3 3 18 etc

随机推荐