浅谈MySQL、Hadoop、BigTable、Clickhouse数据读写机制
个人理解,欢迎指正
| 数据库 | 引擎 | 写数据 | 读数据 | 补充 | 
| MySql | 
 InnoDB:支持事务,高速读写性能一般 Myisam:不支持事务,高速读写性能好  | 
 以InnoDB更新一条记录为例 1、B+Tree搜索找到这行记录,如果数据页在内存直接返回给【执行器】,否则从磁盘读入内存再返回 2、【执行器】更新数据,再调用【引擎】接口写入这行新数据 3、【引擎】将旧数据备份到undo log,然后更新内存中数据页的这行数据,同时将操作记录写到redo log里,此时redo log 处于prepare状态 4、【执行器】记录binlog日志 5、【执行器】调用引擎接口,【引擎】将redo log改成commit状态 6、此时更新就算完成了,【InnoBD引擎】会在适当的时候将操作记录批量刷到磁盘,并清理redo log  | 
其基本流程是:先去缓存页查找,若没有则通过B+Tree检索到叶子节点对应的数据页,然后加到缓存页并返回 | 
 redo log(重做日志)和 binlog(归档日志) 1、redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 2、redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。 3、redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。  | 
| Hadoop | 
 存储:HDFS 计算:MapReduce  | 
 HDFS写数据 1、Client向NameNode请求上传Block(文件块) 2、NameNode向Client返回DataNode地址 3、Client以Package为单位向DataNode依次写入,直到写完整个Block 4、每传输完一个Package,DataNode会向Clent返回一个ack,若失败会重试  | 
 HDFS读数据 1、Client向NameNode请求下载文件 2、NameNode按负载均衡和节点距离返回DataNode给Client 3、Client读取DataNode,以Package为单位拉取,先存入缓存,最后生成文件,中间有checksum校验  | 
 MapReduce运算 1、InputFormat会从DataNode拉取一个个Bolck块 2、然后启动若干个MapTask对Block数据做运算 3、运算后的结果经过Shuffer落到磁盘 4、然后启动若干个ReduceTask从磁盘读取数据进行聚合 5、最后通过OutputFormat把结果写到HDFS或其他存储介质里  | 
| BigTable | SSTable | 
 其实SSTable文件也是存在GFS上,但GFS不支持随机写【增删改】,那么BigTable是如何实现的呢? 1、其实BigTable在内存里维护了一个内存表(MemTable),每次数据【增删改】都会增加一条记录,并附带版本。当容量到达阀值的时候会把MemTable转成SSTable【顺序写】到GFS上,后续数据继续写新的MemTable 2、另外,会启动一个后台进程(Major Compaction机制),不断的合并SSTable,只保留【增删改】的最终数据,老版本的数据被删除  | 
 当查询数据时,会去读取索引数据,找到数据块返回给Tablet Server,再从这个数据块里提取出对应的 KV 数据返回给客户端 1、内存里缓存 BloomFilter,使得对于不存在于 SSTable 中的行键,可以直接过滤掉,无需访问 SSTable 文件才能知道它并不存在 2、通过 Scan Cache 和 Block Cache 这两层缓存,利用局部性原理,使得查询结果可以在缓存中找到,而无需访问 GFS 上的硬盘 3、经过前2步还没找到,会通过SSTable索引来查找,底层是AVL红黑树或跳表,随机读写都是O(log n)  | 
 1、SSTable 的文件格式是由两部分组成: 数据块(data block),就是实际要存储的行键、列、值以及时间戳,这些数据会按照行键排序分成一个个固定大小的块(block)来进行存储。 元数据块(meta block),是一系列的元数据和索引信息,这其中包括用来快速过滤当前 SSTable 中不存在的行键的布隆过滤器,以及整个数据块的一些统计指标。 另外还有针对数据块和元数据块的索引(index),这些索引内容,则分别是元数据索引块(metaindex block)和数据索引块(index block) 2、因为 SSTable 里面的数据块是顺序存储的,所以Major Compaction做的是一个有序链表的多路归并,这个过程中在磁盘上是顺序读写  | 
| Clickhouse | 表引擎主要是MergeTree系列,还有Log系列等其他引擎 | 
 1、一个Table是由多个Partition组成,一个Partition是由多个Part组成,Part里按column【列式存储】 2、旧数据在一个Part,新数据会写另一个Part,然后通过MergeTree引擎将多个Part异步合并(按排序键归并排序)  | 
 因为是按排序键已经排好序了,所以索引结构不需要像其他引擎设计的那么复杂; 底层是稀疏索引(默认8192为一个步长),通过【稀疏索引+标记的偏移量】就能很快找到Block的位置  | 
 1、Clickhouse通过【批处理+预排序】将数据提前排好序 2、Clickhouse能处理的最小单位是block,block就是一群行的集合,默认最大8192行组成一个block  | 
相关资料
浅谈MySQL、Hadoop、BigTable、Clickhouse数据读写机制的更多相关文章
- 浅谈mysql innodb缓存策略
		
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
 - 浅谈mysql主从复制的高可用解决方案
		
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
 - 浅谈mysql配置优化和sql语句优化【转】
		
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
 - 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
		
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
 - 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
		
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
 - 辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作
		
对于mysql中的数据碎片,事实上和我们删除数据是息息相关的,删除数据的时候必定会在数据文件里造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间.假设在一段时间内的大量的删除操作,会 ...
 - (转)运维角度浅谈MySQL数据库优化
		
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
 - 运维角度浅谈MySQL数据库优化(转)
		
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
 - 从运维角度浅谈 MySQL 数据库优化
		
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
 
随机推荐
- css基础02
			
熟练快捷键!方便,要多练! css复合选择器 不会选孙子,有一个儿子和另一个儿子的孩子(也是孙子)同名了,但子选择器子选择儿子,同名的孙子不选.和后代选择器有一点不一样的. " ,&quo ...
 - 利用Css3样式属性Cursor来更换自定义个性化鼠标指针(光标)
			
现而今,我们纵向的回顾整个大前端的历史,不难发现,人们对前端的审美要求越来越高,越来越严苛,与此同时,人们对追求美的体验是也极致的,从理性到感性,从平面到几何,从现实到虚拟,所以从某种角度来说,作为前 ...
 - SQL中 Decode 和 Sign 语法的简单用法
			
含义解释:decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN R ...
 - CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) A-E
			
比赛链接 A 题解 知识点:思维,模拟. 发现 \(b\) 串第一个字符是 \(1\) 则只能使用 max , \(0\) 则只能使用 min ,随后只需要模拟到 \(a\) 串剩余 \(m\) 个字 ...
 - 达人专栏 | 还不会用 Apache Dolphinscheduler?大佬用时一个月写出的最全入门教程【三】
			
作者 | 欧阳涛 招联金融大数据开发工程师 02 Master启动流程 2.10 WorkFlowExecutorThread 里执行 Submit StandByTask 方法 SubmitStan ...
 - Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink
			
2021 年 12 月 9 日,SeaTunnel (原名 Waterdrop) 成功加入 Apache 孵化器,进入孵化器后,SeaTunnel 社区花费了大量时间来梳理整个项目的外部依赖以确保整个 ...
 - CF708C Centroids(树形DP)
			
发现变重心就是往重心上割,所以\(\text{up and down}\),一遍统计子树最大\(size\),一遍最优割子树,\(down\),\(up\)出信息,最后\(DFS\)出可行解 #inc ...
 - ASP.NET Core依赖注入系统学习教程:容器对构造函数选择的策略
			
.NET Core的依赖注入容器之所以能够为应用程序提供服务实例,这都归功于ServiceDescriptor对象提供的服务注册信息.另外,在ServiceDescriptor对象中,还为容器准备了3 ...
 - linux 的文件权限案列
			
需求: 技术部门人员可以相互查看,但不能删除和修改别人的文件,其他部门人员不能查看,但领导组可以且只能查看. 设计: 技术部: 组 jishu ; 人员 js1, js2 领导:组 lingd ; 人 ...
 - Docker_删除none镜像
			
Docker 删除 none 镜像 docker images|grep none|awk '{print $3}'|xargs docker rmi