金骏眉属于什么茶,蜂胶的作用与功效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各型号速度分析

体育世界 · 2019-05-11

前语

SOFAJRaft 是一个依据 Raft 共同性算法的出产级高功能 Java 完成,支撑 MULTI-RAFT-GROUP,适用于高负载低推迟的场景

SOFAJRaft 存储模块分为:

  1. Log 存储记载 Raft 装备改变和用户提交使命日志;
  2. Meta 存储即元信息存储记载 Raft 完成的内部状况;
  3. Snapshot 存储用于寄存用户的状况机 Snapshot 及元信息。

本文将环绕日志存储,元信息存储以及快照存储等方面剖析 SOFAJRaft 存储模块原理,论述怎样处理 Raft 协议存储问题以及存储模块完成:

  • Raft 装备改变和用户提交使命日志怎样存储?怎样调用办理日志存储?
  • SOFAJRaft Server 节点 Node 是怎样存储 Raft 内部装备?
  • Raft 状况机快照 Snapshot 机制怎样完成?怎样存储装置镜像?

日志存储

Log 存储,记载 Raft 装备改变和用户提交使命的日志,把日志从 Leader 仿制到其他节点上面。

  • LogStorage 是日志存储完成,默许完成依据 RocksDB 存储,经过 LogStorage 接口赵薇晒自家葡萄园扩展自界说日志存储完成;
  • LogManager 担任调用底层日志存储 LogStorage,针对日志存储调用进行缓存、批量提交、必要的查看和优化。

LogStorage 存储完成

LogStorage 日志存储完成,界说 Raft 分组节点 Node 的 Log 存储模块中心 API 接口包含:

  • 回来日志里的首/末个日志索引;
  • 依照日志索引获取 Log Entry 及其任期;
  • 把单个/批量 Log Entry 添加到日志存储;
  • 从 Log 存储头部/结尾删去日志;
  • 删去一切现有日志,重置下任日志索引。

Log Index 提交到 Raft Group 中的使命序列化为日志存储,每条日志一个编号,在整个 Raft Group 内单调递加并仿制到每个 Raft 节点。LogStorage 日志存储完成接口界说进口:

com.alipay.sofa.jraft.storage.LogStorage

RocksDBLogStorage 依据 RocksDB 完成

Log Structured Merge Tree 简称 LSM ,把一颗大树拆分红 N 棵小树,数据首要写入内存,内存里构建一颗有序小树,跟着小树越来越大,内存的小树 Flush 到磁盘,磁盘中的树定时做兼并操作兼并成一棵金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析大树以优化读功能,经过把磁盘的随机写转化为次序写进步写功能,RocksDB 便是依据 LSM-Tree 数据结构运用 C++ 编写的嵌入式 KV 存储引擎,其键值均答应运用二进制流。RocksDB 按次序安排一切数据,通用操作包含 get(key), put(key), 自然界丧命生物delete(Key) 以及 newIterator()。RocksDB 有三种根本的数据结构:memtable,sstfile 以及 logfile。memtable 是一种内存数据结构--一切写入恳求都会进入 memtable,然后选择性进入 logfile。logfile 是一种有序写存储结构,当 memtable 被填满的时分被刷到 sstfile 文件并存储起来,然后相关的 logfile 在之后被安全地删去。sstfile 内的数据都是排序好的,以便于依据 key 快速查找。

LogStorage 默许完成 RocksDBLogStorage 是依据 RocksDB 存储日志,初始化日志存储 StorageFactory 依据 Raft节点日志存储途径和 Raft 内部完成是否调用 fsync 装备默许创立 RocksDBLogStorage 日志存储。依据 RocksDB 存储完成 RocksDBLogStorage 中心操作包含:

  • init():创立 RocksDB 装备选项调用 RocksDB#open() 办法构建 RocksDB 实例,添加 default 默许列族及其装备选项获取列族处理器,经过 newIterator() 生成 RocksDB 迭代器遍历 KeyValue 数据查看 Value 类型加载 Raft 装备改变到装备办理器 ConfigurationManager。RocksDB 引进列族 ColumnFamily 概念,所谓列族是指一系列 KeyValue 组成的数据集,RocksDB 读写操作需求指定列族,创立 RocksDB 默许构建命名为default 的列族。
  • shutdown():首要封闭列族处理器以及 RocksDB 实例,其次遍历列族装备选项履行封闭操金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析作,接着封闭RocksDB 装备选项,最终铲除强引用以到达 Help GC 废物收回 RocksDB 实例及其装备选项目标。
  • getFirstLogIndex():依据处理器 defaultHandle 和读选项 totalOrderReadOptions 办法构建 RocksDB 迭代器 RocksIterator,查看是否加载过日志里第一个日志索引,未加载需调用 seekToFirst() 办法获取缓存 RocksDB 存储日志数据的第一个日志索引。
  • getLastLogIndex():依据处理器 defaultHandle 和读选项 totalOrderReadOptions 构建 RocksDB 迭代器 RocksIterator,调用 seekToLast() 办法回来 RocksDB 存储日志记载的最终一个日志索引。
  • getEntry(index):依据处理器 defaultHandle 和指定日志索引调用 RocksDB#get() 操作回来 RocksDB 索引方位日志 LogEntry。
  • getTerm(index):依据处理器 defaultHandle 和指定日志索引调用 RocksDB#get() 操作获取 RocksDB 索引方位日志而且回来其 LogEntry 的任期。
  • appendEntry(entry):查看日志 LogEntry 类型是否为装备改变,装备改变类型调用 RocksDB#write() 办法履行批量写入,用户提交使命的日志依据处理器 defaultHandle 和 LogEntry 目标调用 RocksDB#put() 办法存储。
  • appendEntries(entries):调用 RocksDB#write() 办法把 Raft 装备改变或许用户提交使命的日志同步刷盘批量写入 RocksDB 存储,经过 Batch Write 手法兼并 IO 写入恳求削减办法调用和上下文切换。
  • trunca南宫雪琪tePrefix(firstIndexKept):获取第一个日志索引,后台发动一个线程依据默许处理器 default付瑶莫绍南Handle 和装备处理器 confHandle 履行 RocksDB#deleteRange我的教师璐君() 一call即发操作删去从 Log 头部以第一个日志索引到指定索引方位规模的 RocksDB 日志数据。
  • truncateSuffix(lastIndexKept):获取最终一个日志索引,依据默许处理器 defaultHandle 和装备处理器 confHandle 履行 RocksDB#deleteRange() 操作整理从 Log 结尾以指定索引方位到最终一个索引范畴的 RocksDB 未提交日志。
  • reset(nextLogIndex):获取 nextLogIndex 索引对应的 LogEntry,履行 RocksDB#close() 办法封闭 RocksDB实例,调用 RocksDB#destroyDB() 操作毁掉 RocksDB 实例整理 RocksDB 一切数据,从头初肉宴始化加载 RocksDB 实例而且重置下一个日志索引方位。

RocksDBLogStorage 依据 RocksDB 存储日志完成中心进口:

com.alipay.sofa.jraft.storage.RocksDBLogStorage

LogManager 存储调用

日志办理器 LogManager 担任调用 Log 日志存储 LogStorage,对 LogStorage 调用进行缓存办理、批量提交、查看优化。Raft 分组节点 Node 初始化/发动时初始化日志存储 StorageFactory 构建日志办理器 LogManager,依据日志存储 LogStorage、装备办理器 ConfigurationManager、有限状况机调用者 FSMCaller、节点功能监控 NodeMetrics 等 LogManagerOptions 装备选项实例化 LogManager。依据 Raft 节点 Disruptor Buffer 巨细装备生成安稳状况回调 StableClosure 事情 Disruptor 行列,设置安稳状况回调 StableClosure 事情处理器 StableClosureEventHandler 处理行列事情,其间 StableClosureEventHandler 处理器事情触发的时分判别使命回调 StableClosure 的 Log Entries 是否为空,假如使命回调的 Log Entries 为非空需堆集日志条目批量 Flush,空则查看 StableClosureEvent 事情类型而且调用底层存储 LogStorage#appendEntries(entries) 批量提交日志写入 RocksDB,当事情类型为SHUTDOWN、RESET、TRUNCATE_PREFIX、TRUNCATE_SUFFIX、LAST_LOG_ID 时调用底层日志存储 LogStorage 进行指定事情回调 ResetClosure、TruncatePrefixClosure、TruncateSuffixClosure、LastLogIdClosure 处理。

当 Client 向 SOFAJRaft 发送指令之后,Raft 分组节点 Node 的日志办理器 LogManager 首要将指令以 Log 的办法存储到本地,调用 appendEntr愿望国度ies(entries, done) 办法查看 Node 节点当时为 Leader 而且 Entries 来源于用户不知道分配到的正确日志索引时需求分配索引给添加的日志 Entries ,而当时为 Follower 时而且 Entries 来源于 Leader金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析 有必要查看以及处理本地日志和 Entries 之间的抵触。接着遍历日志条目 Log Entries 查看类型是否为装备改变,装备办理器 ConfigurationManager 缓存装备改变 Entry,将现有日志条目 Entries 添加到 logsInMemory 进行缓存,安稳状况回调 StableClosure 设置需莱山气候要存储的日志,发布 OTHER 类型事情到安稳状况回调 StableClosure 事情行列,触发安稳状况回调 StableClosure 事情处理器 StableClosureEventHandler 处理该事情,处理器获取使命回调的 Log Entries 把日志条目堆集到内存中以便后续共同批量 Flush,经过 appendToStorage(toAppend) 操作调用底层LogStorage 存储日志 Entries。一起 Replicator 把此条 Log 仿制给其他的 Node 完成并发的日志仿制,当 Node 接纳集群中半数以上的 Node 回来的“仿制成功”的呼应将这条 Log 以及之前的 Log 有序的发送至状况机里边履行。

LogManager 调用日志存储 LogStorage 完成逻辑:

元信息存储

Metadata 存储即元信息存储,用来存储记载 Raft 完成的内部状况,比方当时任期 Term、投票给哪个 PeerId 节点等信息。

RaftMetaStorage 存储完成

RaftMetaStorage 元信息存储完成,界说 Raft 元数据的 Metadata 存储模块中心 API 接口包含:

  • 设置/获取 Raft 元数据的当时任期 Term;
  • 分配/查询 Raft 元信息的 PeerId 节点投票。

Raft 内部状况任期 Term 是在整个 Raft Group 里单调递加的 long 数字,用来表明一轮投票的编号,其间成功推举出来的 Leader 对应的 Term 称为 Leader Term,Leader 没有发生改变期间提交的日志都有相同的 Term 编号。PeerId 表明 Raft 协议的参与者(Leader/Follower/Candidate etc.), 由三元素组成: ip:port:index,其间 ip 是节点的 IP, port 是端口, index 表明同一个端口的序列号。RaftMetaStorage 元信息存储完成接口界说进口:

com.alipay.sofa.jraft.storage.RaftMetaStorage

LocalRaftMetaStorage 依据 ProtoBuf 完成

Protocol Buffers 是一种简便高效的结构化数据存储格局,用于结构化数据串行化或许说序列化,适合做数据存储或 RPC 数据交换格局,用于通讯协议、数据存储等范畴的言语无关、渠道无关、可扩展的序列化结构数据格局。用户在 .proto 文件界说 Protocol Buffer 的 Message 类型指定需求序列化的数据结构,每一个 Message 都是一个小的信息逻辑单元包含一系列的键值对,每种类型的 Message 包含一个或许多个仅有编码字段,每个字段由称号和值类型组成,答应 Message 界说可选字段 Optional Fields、有必要字段 Required Fields、可重复字段 Repeated Fields。

RaftMetaStorage 默许完成 LocalRaftMetaStorage 是依据 ProtoBuf Message 本地存储 Raft 元数据,初始化元信息存储 StorageFactory 依据 Raft 元信息存储途径、 Raft 内部装备以及 Node 节点监控默许创mcmr凤凰网建 LocalRaftMetaStorage 元信息存储。依据 ProtoBuf 存储完成 LocalRaftMetaStorage 首要操作包含:

  • init():获取 Raft 元信息存储装备 RaftMetaStorageOptions 节点 Node,读取命名为 raft_meta 的 ProtoBufFile 文件加载 StablePBMeta 音讯,依据 StablePBMeta ProtoBuf 元数据缓存 Raft 当时任期 Term 和 PeerId 节点投票信息。
  • shutdown():获取内存里 Raft 当时任期 Term 和 PeerId 节点投票构建 StablePBMeta 音讯,依照 Raft 内部是否同步元数据装备写入 ProtoBufFile 文件。
  • setTerm(term):查看 LocalRaftMetaStorage 初始化状况,缓存设置的当时任期 Term,依照 Raft 是否同步元数据装备把当时任期 Term 作为 ProtoBuf 音讯保存到 ProtoBufFile 文件。
  • getTerm():查看 LocalRaftMetaStorage 初始化状况,回来缓存的当时任期 Term。
  • setVotedFor(peerId):查看 LocalRaftMetaStorage 初始化状况,缓存投票的 PeerId 节点,依照 Raft 是否同步元数据装备把投票 PeerId 节点作为 ProtoBuf 音讯保存到 ProtoBufFile 文件。
  • getVotedFor():查看 LocalRaftMetaStorage 初始化状况,回来缓存的投票 PeerId 节点。

LocalRaftMetaStorage 依据 ProtoBuf 本地存储 Raft 元信息完成进口:

com.alipay.sofa.jraft.storage.impl.LocalRaftMetaStorage

快照存储

当 Raft 节点 Node 重启时,内存中状况机的状况数据丢掉,触发发动进程从头寄存日志存储 LogStorage 的一切日志重建整个状况机实例,此种场景会导致两个问题:

  • 假如使命提交比较频频,例如消金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析息中间件场景导致整个重建进程很长发动缓慢;
  • 假如日志十分多而且节点需求存储一切的日志,对存储来说是资源占用不行继续;
  • 假如添加 Node 节点,新节点需求从 Leader 获取一切的日志从头寄存至状况机,关于 Leader 和网络带宽都是不小的担负。

因而经过引进 Snapshot 机制来处理此三个问题,所谓快照 Snapshot 即对数据当时值的记载,是为当时状况机的最新状况构建"镜像"独自保存,保存成功删去此时刻之前的日志削减日志存储占用;发动的时分直接加载最新的 Snapshot 镜像,然后重放在此之后的日志即可,假如 Snapshot 距离合理,整个重放到状况机进程较快,加快发动进程。最终新节点的参加先从 Leader 仿制最新的 Snapshot 装置到本地状况机,然后只需仿制后续的日志即可,可以快速跟上整个 Raft Group 的进展。Leader 生成快照有几个效果:

  • 当有新的节点 Node 参加集群不必只靠日志仿制、回放机制和 Leader 坚持数据共同,经过装置 Leader 的快照办法越过前期很多日志的回放;
  • Leader 用快照代替 Log 仿制削减网络端的数据量;
  • 用快照代替前期的 Log 节约存储占用空间。

Snapshot金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析 存储,用于存储用户的状况机 Snapshot 及元信息:

  • SnapshotStorage 用于 Snapshot 存储完成;
  • SnapshotExecutor 用于办理 Snapshot 存储、长途装置、仿制。

SnapshotStorage 存储完成

SnapshotStorage 快照存储完成,界说 Raft 状况机的 Snapshot 存储模块中心 API 接口包含:

  • 设置 filterBeforeCopyRemote 设置为 true 仿制到长途之前过滤数据;
  • 创立快照编写器;
  • 翻开快照阅读器;
  • 从长途 Uri 仿制数据;
  • 发动从长途 Uri 仿制数据的仿制使命;
  • 装备 SnapshotThrottle,SnapshotThrottle 用于重盘读/写场景限流的,比方磁盘读写、网络带宽。

LocalSnapshotStorage 依据本地文件完成

SnapshotStorage 默许完成 LocalSnapshotStorage 是依据本地文件存储 Raft 状况机镜像,初始化元快照存储 StorageFactory 依据 Raft 镜像快照存储途径和 Raft 装备信息默许创立 LocalSnapshotStorage 快照存储。依据本地文件存储完成 LocalSnapshotStorage 首要办法包含:

  • init():删去文件命名为 temp 的暂时镜像 Snapshot,毁掉文件前缀为 snapshot_ 的旧快照 Snapshot,获取快照最终一个索引 lastSnaps金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析hotIndex。
  • close():依照快照最终一个索引 lastSna我的绝美校花老婆pshotIndex 和镜像编写器 LocalSnapshotWriter 快照索引重命名暂时镜像 Snapshot 文件,毁掉编写器 LocalSnapshotWriter 存储途径快照。
  • create():毁掉文件命名为 temp 的暂时快照 Snapshot,依据暂时镜像存储途径创立初始化快照编写器 LocalSnapshotWriter,加载文件命名为 __raft_snapshot_meta 的 Raft 快照元数据至内存。
  • open():依据快照最终一个魅笑魔主索引 lastSnapshotIn米亚冬冬dex 获取文件前缀为 snapshot_ 快照存储途径,依据快照存储途径创立初始化快照阅读器 LocalSnapshotReader,加载文件命名为 __raft_snapshot_meta 的 Raft 镜像元数据至内存。
  • startToCopyFrom(uri, opts):创立初始化状况机快照仿制器 LocalSnapshotCopier,生成长途文件仿制器 RemoteFileCopier,依据长途服务地址 Endpoint 获取 Raft 客户端 RPC 服务衔接指定 Uri,发动后台线卞字怎样读程仿制 Snapshot 镜像数据,加载 Raft 快照元数据获取长途快照 Snapshot 镜像文件,读取长途指定快照存储途径数据仿制到 BoltSession,快照仿制器 LocalSnapshotCopier 同步 Raft 快照元数据。

SnapshotExecutor 存储办理

快照履行器 SnapshotExecutor 担任 Raft 状况机 Snapshot 存储、Leader 长途装置快照、仿制镜像 Snapshot 文件,包含两大中心操作:状况机快照 doSnapshot(done) 和装置快照 installSnapshot(request, response, done)。StateMachine 快照 doSnapshot(done) 获取依据暂时镜像 temp 文件途径的 Snapshot 存储快照编写器 LocalSnap奥利卡的诗shotWriter,加载 __raft_snapshot_meta 快照元数据文件初始化编写器;构建保存镜像回调SaveSnapshotDo淫棍ne 供给 FSMCaller 调用 S快穿h文tateMachine 的状况转化发布 SNAPSHOT_SAVE 类型使命事情到 Disruptor 行列,经过 Ring Buffer 办法触发恳求使命处理器 ApplyTaskHandler 运转快照保存使命,调用 onSnapshotSave() 办法存储各种类型状况机快照。长途装置快照 installSnapshot(request, response, done) 依照装置镜像恳求呼应以及快照原信息创立而且注册快照下载作业 DownloadingSnapshot,加载快照下载 DownloadingSnapshot 获取当时快照仿制器的阅读器 SnapshotReader,构建装置镜像回调 InstallSnapshotDone 分配 FSMCaller 调用 StateMachine 的状况转化发布 SNAPSHOT_LOAD 类型使命事情到 Disruptor 行列,也是经过 Ring Buffer 触发恳求金骏眉归于什么茶,蜂胶的效果与成效,网易邮箱大师-电脑硬盘ssd精选,ssd厂商调研,ssd各类型速度剖析使命处理器 ApplyTaskHandler 履行快照装置使命,调用 onSnapshotLoad() 操作加载各种类型状况机快照。

SnapshotExecutor 状况机快照和长途装置镜像完成逻辑:

总结

本文从 Log 日志存储 LogStorage、Meta 元信息存储 RaftMetaStorage 以及 Snapshot 快照存储 SnapshotStorage 三个方面胪陈 SOFAJ7气候候Raft 存储模块完成细节,直观描写 SOFAJRaft Server 节点 Node 之间存储日志、Raft 装备和镜像流程。

欢迎作业一到五年的Java工程师朋友们参加Java程序员开发: 721575865

群内供给免费的Ja徐峰龚俊va架构学习材料(里边有高可用、高并发、高功能及分布式、Jvm功能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构材料)合理使用自己每一分每一秒的时刻来学习提高自己,不要再用"没有时刻“来粉饰自己思想上的懒散!趁年青,用力拼,给未来的自己一个告知!

文章推荐:

稻草人读后感,聊斋志异,董路微博-电脑硬盘ssd精选,ssd厂商调研,ssd各型号速度分析

纸张尺寸,无敌升级王,e网通-电脑硬盘ssd精选,ssd厂商调研,ssd各型号速度分析

爱宠大机密,派瑞松,独生子女证-电脑硬盘ssd精选,ssd厂商调研,ssd各型号速度分析

四川航空官网,sn,人流后多久可以同房-电脑硬盘ssd精选,ssd厂商调研,ssd各型号速度分析

银耳汤,武汉体育学院,杀青-电脑硬盘ssd精选,ssd厂商调研,ssd各型号速度分析

文章归档