当前位置: 首页 > news >正文

数据库持久化比较

reids 的 RDB 和 AOF 

      RDB,以某个时间点为切面,将这个时候内存中的数据写入到磁盘。

      AOF ,将所有内存中的改动记录在AOF日志里,要恢复的时候,依次按操作恢复。当AOF过大时,还会进行重写,把重复的操作合并。

 

mongodb(类似于redis aof) 
mongodb与MySQL不同,mysql的每一次更新操作都会直接写入硬盘,但是mongo不会,做为内存型数据库,数据操作会先写入内存,然后再会持久化到硬盘中去。
mongodb在启动时,专门初始化一个线程不断循环,用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处。

 

hbase
hbase采用的LSM思想(Log-Structured Merge-Tree)。

 B+树

根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。

叶子节点里每个键值都指向真正的数据块(如Oracle里的RowID),每个叶子节点都有前指针和后指针,这是为了做范围查询时,叶子节点间可以直接跳转,从而避免再去回溯至枝和跟节点。

B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO。

对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 ... 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO.

从上面可以看出,低下的磁盘寻道速度严重影响性能(近些年来,磁盘寻道速度的发展几乎处于停滞的状态)。

2 LSM树

为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。

为了更好的说明LSM树的原理,下面举个比较极端的例子:

现在假设有1000个节点的随机key,对于磁盘来说,肯定是把这1000个节点顺序写入磁盘最快,但是这样一来,读就悲剧了,因为key在磁盘中完全无序,每次读取都要全扫描;

那么,为了让读性能尽量高,数据在磁盘中必须得有序,这就是B+树的原理,但是写就悲剧了,因为会产生大量的随机IO,磁盘寻道速度跟不上。

LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能

它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的。所以LSM树读是比较慢的。

以上就是LSM树最本质的原理,有了原理,再看具体的技术就很简单了。

1)首先说说为什么要有WAL(Write Ahead Log),很简单,因为数据是先写到内存中,如果断电,内存中的数据会丢失,因此为了保护内存中的数据,需要在磁盘上先记录logfile,当内存中的数据flush到磁盘上时,就可以抛弃相应的Logfile。

2)什么是memstore, storefile?很简单,上面说过,LSM树就是一堆小树,在内存中的小树即memstore,每次flush,内存中的memstore变成磁盘上一个新的storefile。

3)为什么会有compact?很简单,随着小树越来越多,读的性能会越来越差,因此需要在适当的时候,对磁盘中的小树进行merge,多棵小树变成一颗大树。提高读的性能。

转载于:https://www.cnblogs.com/onlywujun/p/5820964.html

相关文章:

  • 预祝大家新年快乐
  • C#实现bat文件调用
  • 从零实现3D图像引擎:(1)环境配置与项目框架
  • Akka in action (第一章 介绍Akka)
  • Muduo 网络编程示例之零:前言
  • StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
  • 【每天读一点英文】gnuhpc注释版:The True Nobility
  • CEPH RGW多 ZONE的配置
  • 【每天读一点英文】gnuhpc:The World As I See It(节选)
  • Java学习随笔之1: Java 语言概述和开发环境
  • iPad - 开发(Universal Applications)
  • Muduo 网络编程示例之一:五个简单 TCP 协议
  • 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
  • 继续玩转喷墨打印机
  • cookies,sessionStorage和localStorage的区别
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas 五子棋游戏
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • k8s如何管理Pod
  • k个最大的数及变种小结
  • Linux CTF 逆向入门
  • php ci框架整合银盛支付
  • Python语法速览与机器学习开发环境搭建
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SQLServer之创建显式事务
  • Sublime text 3 3103 注册码
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 对象引论
  • 给github项目添加CI badge
  • 基于游标的分页接口实现
  • 解析带emoji和链接的聊天系统消息
  • 看域名解析域名安全对SEO的影响
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 译有关态射的一切
  • 原生 js 实现移动端 Touch 滑动反弹
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #stm32整理(一)flash读写
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)Java 简介
  • (27)4.8 习题课
  • (42)STM32——LCD显示屏实验笔记
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (离散数学)逻辑连接词
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)socket Aio demo
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET MVC 验证码
  • .NET 分布式技术比较
  • .NetCore 如何动态路由