三歪吐血总结了各个中间件是如何实现持久化的

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 到目前为止,三歪也已经接触到了不少的中间件了,比如说「Elasticsearch」「Redis」「HDFS」「Kafka」「HBase」等等。可以发现的是,它们的持久化机制都差不得太多。今天想来总结一下,一方面想来回顾一下这些组件,一方面给还没入门过这些中间件的同学总结一下持久化的”套路“,后面再去学习的时候就会轻松很多。

久化


下面我们就直接来分别回顾一下各个中间件/组件的持久化机制,最后再总结就好了(三歪相信大家应该也能从回顾中看出些端倪)

为什么要持久化?原因也很简单:数据需要存储下来,不希望出了问题导致数据丢失


Elasticsearch


Elasticsearch是一个全文搜索引擎,对模糊搜索非常擅长。

Elasticsearch在写数据的时候,会先写到内存缓存区,然后写到translog缓存区,每隔5stranslog缓冲区的数据刷到磁盘中

42.jpg


Kafka


众所周知,Kafka是一个高吞吐量的消息队列,那它是怎么持久化的呢?

Kafka relies heavily on the filesystem for storing and caching messages.

没错Kafka用的是文件系统来存储的。

在Kafka官网上其实也说了,Kafka的持久化依赖操作系统的pagecache顺序写来实现的。

41.jpg


HDFS


HDFS是分布式文件系统,能存储海量的数据,那HDFS在写入数据的时候是怎么样的呢?

HDFS Client客户端无论读写都需要走到NameNode去获取/增删改文件的元数据,而NameNode则是专门维护这些元数据的地方。

所以,在HDFS写数据,需要先去NameNode上询问这些切分好的block往哪几个DataNode上写数据。

为了提高NameNode的效率,在写数据的时候,NameNode实际上是操作的是内存,然后涉及到增删改的数据顺序写到editlog日志文件上

40.jpg

Redis


Redis是基于内存的,如果不想办法将数据保存在硬盘上,一旦Redis重启(退出/故障),内存的数据将会全部丢失。

我们肯定不想Redis里头的数据由于某些故障全部丢失(导致所有请求都走MySQL),即便发生了故障也希望可以将Redis原有的数据恢复过来,所以Redis有RDBAOF的持久化机制。

  • RDB:基于快照,将某一时刻的所有数据保存到一个RDB文件中。
  • AOF(append-only-file),当Redis服务器执行写命令的时候,将执行的写命令保存到AOF文件中。

AOF持久化功能的实现可以分为3个步骤:

  • 命令追加:命令写入aof_buf缓冲区
  • 文件写入:调用flushAppendOnlyFile函数,考虑是否要将aof_buf缓冲区写入AOF文件中
  • 文件同步:考虑是否将内存缓冲区的数据真正写入到硬盘

39.jpg


HBase


HBase是一个能存储海量数据的数据库

HBase在写数据的时候,会先写到Mem Store,当MemStore超过一定阈值,就会将内存中的数据刷写到硬盘上,形成StoreFile,而StoreFile底层是以HFile的格式保存,HFile是HBase中KeyValue数据的存储格式。

我们写数据的时候是先写到内存的,为了防止机器宕机,内存的数据没刷到磁盘中就挂了。我们在写Mem store的时候还会写一份HLog

38.jpg


MySQL


MySQL我们用得最多的InnoDB引擎是怎么存储的呢?它有redo log来支撑持久化的功能。

MySQL引入了redo log,内存写完了,然后会写一份redo log,这份redo log37.jpg


总结


看完上面常见的中间件/组件的持久化方式,应该就不用我多说了吧?思想几乎都是一样的,只是他们记录“log”的名字不一样而已。

先写buffer,然后顺序IO写Log。防止buffer的数据还没刷到磁盘,宕机导致数据丢失。

对于Log文件,中间件也不会放任它们一直膨胀,导致体积很大:

  • 在Redis里边,会对AOF文件进行重写
  • 在HDFS里边,editlog会定时生成fsimage
  • 在Elasticsearch里边,translog会根据阈值触发commit操作
  • .....
目录
相关文章
|
消息中间件 存储 网络协议
|
8月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因:
|
8月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
8月前
|
算法 NoSQL Java
2021年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
9月前
|
消息中间件 数据采集 Java
开发神技!阿里消息中间件进阶手册限时开源,请接住我的下巴
相信大家在实际工作中都用过消息中间件进行系统间数据交换,解决应用解耦、异步消息、流量削峰等问题,由此消息中间件的强大功能想必也不用我多说了!目前业界上关于消息中间件的实现多达好几十种,可谓百花齐放,所用的实现语言同样也五花八门。不管使用哪一个消息中间件,我们的目的都是实现高性能、高可用、可伸缩和最终一致性架构。
|
11月前
|
缓存 NoSQL 容灾
《Java应用提速(速度与激情)》——六、阿里中间件提速
《Java应用提速(速度与激情)》——六、阿里中间件提速
|
11月前
|
消息中间件 NoSQL Dubbo
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
一转眼,都2023年了,你是否在满意的公司?拿着理想的薪水? 虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因: 第一,“知其然不知其所以然”。做了多年技术,开发了很多业务应用,但似乎并未思考过种种技术选择背后的逻辑。所以,他无法向面试官展现出自己未来技术能力的成长潜力。面试官也不会放心把具有一定深度的任务交给他。 第二,知识碎片化,不成系统。在面试中,面试者似乎无法完整、清晰地描述自己所开发的系统,或者使用的相关技术。
|
11月前
|
SQL 算法 NoSQL
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
12月前
|
存储 缓存 人工智能
2022互联网寒冬,看看阿里中间件团队如何降本提效?(2)
2022互联网寒冬,看看阿里中间件团队如何降本提效?
196 1
|
12月前
|
人工智能 Kubernetes 算法
2022互联网寒冬,看看阿里中间件团队如何降本提效?(1)
2022互联网寒冬,看看阿里中间件团队如何降本提效?
181 1