海量数据存储读后感

2023-11-17

海量数据存储系列读后感

  读了淘宝的海量数据存储系列, 感觉豁然开朗, 见地提升了很多. 现在简单用自己的话总结一下里边的"精髓". 

SQL与关系代数(第1-2章)

第一 二章内容比较简单.  第一章给了我们一个模型.  他是一个三层结构.  模型如下:

  1. 用户API
  2. 关系代数和事务引擎
  3. k-v 存储. 

用户API就是我们使用SQL, 结构化查询语言.  这个对少有的数据库知识的人来说都不陌生, 也不用介绍.  传统的数据库数据是按行存储, 索引(二级索引, 复合索引)辅助以提供查询性能(以空间换取时间). 多条件查询就是关系运算. 

比如这样子一个用表,有四个字段:  pk(id), user_id(用户id),name姓名, sex(性别) .  如果我们要查询id=0 的用户信息, 最笨的方法是遍历所有的表, 逐个记录进行id的比对,返回符合条件的记录.  还有一种是建立一个索引表, 里边有一个id字段还有id对应的记录的物理地址, 我们只需要扫描这边索引表, 之后根据id对应的物理地址返回查询记录信息(这叫反查)就可以返回id=0的记录数.  同理 如果我要查询 性别男并且用户名称为xxx的人, 一种做法我对性别sex和用户name分别做索引, 之后取交集(这是一种关系代数运算).  还有一种 我对用户名称name+性别 sex 做一个复合索引, 直接返回满足条件的记录.  ““的情况就是各种条件取并集.  所以简单的可以把查询的各种条件归结为关系代数运算.  深层次想想索引表就类似于一种k-v存储.  采用的是B tree(多路搜索树)树形结构,以支持快速范围查找. 

单机事务篇(第3-4章)

 事务是数据库的最重要的一个属性.它的本质是什么呢?事务,本质来说就是一组由一个人(或机器)发起的连续的逻辑操作,共同的完成一件事情,在 完成整个事情之前,其所有的改动,都不应该对其他人可见和影响。而在事务结束之后,其一切 的改动,都必须全部立刻对其他的人(或机器)可见。

人们为了描述事务, 提出了四个词汇 ACID, 下面简单看看什么是ACID:

  • 原子性(Atomicity):也就是说,一组操作,要不就都成功,要不就都失败。不存在中间状态。 
  • 一致性(Consistency):一致性,也就是说,这个事务在提交或回滚的时候,对其他人(或机器) 来说,数据的状态是同一的,不会出现中间的状态。最理想的状态下,就是说,数据提交后,所有的更改立刻同时生效,可惜,在计算机领域,这个做不到。因为 cpu 运算,磁盘写入,内存写入,都是要时间的,内部一定是个顺序化的过程,所以不可能做到绝对的立刻同时生效。所以一致性一般来说指代的是逻辑上的同时生效,比如,我要改 A,B 两行数据,那么,最简单的一致性保证就是,对 A,B 加锁,改 A,B,然后对 A,B 解锁。这样下一个人读到的一定是 A,B 的最新值啦。
  • 隔离性(Isolation):隔离性,是依托锁来进行设计的。我们所知道的锁,主要有以下几种,1.读写锁,2. 排他锁. 隔离性的四种级别其实就和这两种锁的实现有关,之所以要定义四个级别,其实原因也是因为,锁的范围越大,并行效率越低。而范围越小,那么并行的效率就越高。
    • 读未提交: 其实就是什么锁也没有,所以数据的中间状态,是可能被其他人读到的.
    • 读已提交:就是读写锁实现,读锁在查询之后会被释放掉,所以这样其他人可能会更改那些被释放了读锁的数据,这样当前事务再去读取的时候,就可能读取到被别人修改过的数据了,所以一 个人在事务中读取到的某个数据,可能下次读取就变成别的数据啦。这就是不可重复读的意思.
    •  可重复读:也是个读写锁实现,读锁会阻塞其他人(或机器)的写,于是,只要是事务中读取到 得数据,都被加了锁,其他人没办法改他们,于是就实现了可重复读咯.
    • 最后是序列化,就是所有都顺序,一个大锁全部锁住 
  • 持久性(Durability):持久性就是,事务执行后,数据不能丢.  为了一致性, 就会对数据做多个副本, 并且副本要尽可能的分布在不同的机房,以避免天灾人祸等不可预测的因素. 

 要保证一大批数据在不同的时间被查询, 被修改,直至事务提交用户才感知数据变化又要保证性能是个很复杂的事情. 实现主要有后面几种方法:

  • 1 排他锁: 排他锁性能最差, 几乎不可用.
  •  2. 读写锁: 而读写因为读可以并发,所以效率稍高,但写和读不能同时进行
  • 3. Copy on write(MVCC):  则读取和写入之间可以互相不影响,所以效率更高
  • 4. 队列. 内存时效果很好.省去中断上下文切换的时间.  数据库层面应用较少. 
  •  5. 内存事务. 目前还在研究阶段,具备很大潜力的东西. 

读写锁:

     也是隔离性中―读已提交,可重复读 两种实现中最重要的底层实现方式.简单来说,就是如果一个人在事务中,那么他所有写过的数据,所有读过的数据,都给他来个锁, 让其他小样儿都只能等在外面,直到数据库能确定所有更改已经全部完成了,没有剩下什么半拉子状态的时候,就解开所有的锁,让其他人可以读取和写入. 

MVCC:

    MVCC对读写锁对读写锁进行了一个改进,写不阻塞读,读不阻塞写. 如果一个人在事务中,会先申请一个事务 ID,这个 ID 是自增的,每个事务都有他自己的唯一的 I D,那么他写过的数据,都会被转变为一次带有当前事务 ID 的新数据,在读取的时候,则只会读取小于等于自己事务 ID 的数据。这样实现的东东,语义上来说,与可重复读就一样了。而如果读小于等于全局 ID 的数据,那么这样的实现,就是读已提交了. MVCC 只实现了四个级别中的第二级和第三级,但这已经足够了. 有了这个东西,我们的一致性也就很容易保证了,因为一个事物和他对应的版本号对应,又有更改后的数据和更改前的数据,如果要提交,那么就只需要很简单的让更改后的数据生效可见即可, 这样我们可以将大量的更新中要做的事情,都在事务过程中进行,这样,比原有的基于读写锁的必须在 commit 时候一起做掉来说,commit 这个操作就轻量化了很多,于是,就可以支持更多的人(或机器)持有事务状态了。

原子性和持久性:

   原子性么,一般来说就是要么都成功,也就是新版本数据都让他生效,要么就都失败,也就是让和自己事务 ID 对应的所有修改都无效即可。也很好就解决掉了。持久性。这个就是后面我们要在写入模型里面介绍的东西了,基本上来说就 是写磁盘策略的事情.





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

海量数据存储读后感 的相关文章

  • dlmalloc解析连载一

    dlmalloc是目前一个十分流行的内存分配器 其由Doug Lea 主页为 http gee cs oswego edu 从1987年开始编写 到目前为止 最新版本为2 8 3 可以从 ftp g oswego edu pub misc
  • 非printf形式打印各种数据类型的十六进制和二进制

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 一 源码实现 为了适配各种数据类型 且可以通过sizeof得到此类型的大小 所以这里采用模板形式开发 以下是实现此功能的源码
  • 突破存储边界 赋能开放计算

    2022年8月10日 开放计算中国社区技术峰会 OCP China Day 2022在北京拉开帷幕 开放计算中国社区技术峰会 OCP China Day 是全球开放计算最具规模的生态峰会之一 此次大会以 开放 向未来 绿色 融合 赋能 为主
  • 【转】八大排序算法总结

    插入排序 1 直接插入排序 原理 将数组分为无序区和有序区两个区 然后不断将无序区的第一个元素按大小顺序插入到有序区中去 最终将所有无序区元素都移动到有序区完成排序 要点 设立哨兵 作为临时存储和判断数组边界之用 实现 Void Inser
  • regionprops函数用法详解

    转自 http apps hi baidu com share detail 24010679 Regionprops 用途是get the properties of region 即用来度量图像区域属性的函数 语法 STATS regi
  • 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统

    作者 寒小阳 时间 2016年3月 出处 http blog csdn net han xiaoyang article details 50856583 声明 版权所有 转载请联系作者并注明出处 1 引言 本系统是基于CVPR2015的论
  • 好久没写东西了!!!

    最近存储升级 一直忙着这个 这个事情不弄完 心里总是不踏实 毕竟所有的数据都在上面呢 预计这个月中旬就可以完成了 也可以安稳下了看些东西了 最近烦 烦 烦
  • 强大的QDataStream

    书上是这样描述QDataStream的 QDataStream提供了一种与运行平台无关的存储格式 他不仅支持QList
  • 如何理解Zookeeper的顺序一致性

    2017饿了么做异地多活 我的团队承担Zookeeper的异地多活改造 在此期间我听到2种不同的关于一致性的说法 一种说法是Zookeeper是最终一致性 因为由于多副本 以及保证大多数成功的Zab协议 当一个客户端进程写入一个新值 另外一
  • little endian && big-endian

    java 的ClassFile采用big endian存储数据 Intel x86 采用little endian Motorola采用big endian 0x1234 Intel 地址 0x4000 0000 0x34 0x4000 0
  • 存储过程相关

    在sybase数据库中检查存储过程是否存在 如存在就删除表记录 如不存在就创建 if exists select 1 from sysobjects where id object id K FY P EncodeQqTitle name
  • opengl纹理映射的学习总结

    1 不同的滤波方式的效果区别 使用Nearest滤波纹理的效果 看起来很斑驳 使用MipMapped的效果 看起来很平滑 2 void glTexImage1D GLenum target GLint level GLint interna
  • Raneto

    Raneto Raneto是一个采用Node js开发的免费开源知识库平台 它使用Markdown文件来存储知识库 Raneto也可以叫作一个 静态网站生成器 因为它不需要数据库 你的所有内容都存储在 Markdown md 文件中 整个知
  • 博客系统文章的数据库存储方式

    在通常的博客系统中 我们发表文章的时候 在数据库中存储的一般不仅仅是文章的文字 还包括文章的样式 而且很多时候都是所见即所得的效果 这就要求我们以html 文字这样存进数据库中 通过查找资料 可以用专门的文字编辑器可以实现 使用方法如下 F
  • 图(一)之邻接表Adjacency List

    开始攻克图的算法 先从最简单的存储开始实现 本文关于邻接表的实现 邻接表是图的存储中最简单也是最基本的存储结构 基于链表的思想实现的 在邻接表中 对于中的每个顶点建立一个单链表 第i个单链表中的节点表示依附于顶点的vi的边 每个节点由3个域
  • Amazon——Elastic Compute Cloud(EC2)

    云计算 教材试读 弹性计算云EC2 4 3 弹性计算云EC2 亚马逊弹性计算云服务 Elastic Compute Cloud EC2 是亚马逊提供的云计算环境的基本平台 网络数据流的流向非常复杂 企业和个人的网络平台所需的计算能力也随着这
  • 枚举常量

    2011 04 28 12 20 31 分类 C C 语言 标签 c枚举变量 字号大中小订阅 1 枚举常量的定义 enum 枚举类型名 常量1 常量2 常量3 例如定义一个星期的枚举常量 enum Week Mon Tue Wed 这就定义
  • PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯

    PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 我们提供 PPI协议的官方文档 协议更新时间为2005年 下面是我们根据文档解析的PPI读取变量返回
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了
  • 从零开始入门 K8s

    作者 至天 阿里巴巴高级研发工程师 一 基本知识 存储快照产生背景 在使用存储时 为了提高数据操作的容错性 我们通常有需要对线上数据进行 snapshot 以及能快速 restore 的能力 另外 当需要对线上数据进行快速的复制以及迁移等动

随机推荐

  • Binder的工作机制浅析

    在Android开发中 Binder主要用于Service中 包括AIDL和Messenger 其中Messenger的底层实现就是AIDL 所以我们这里通过AIDL来分析一下Binder的工作机制 一 在Android Studio中建立
  • AI绘画指南 如何设置与使用 stable diffusion webui (SD webui)

    分享最近对AI绘画的理解和实践经验 希望帮助那些对AI绘画有兴趣但不知如何入门的人 分享的内容主要包括对stable diffusion webui界面的介绍 解释参数的含义和如何进行调整 此外 还会介绍如何在txt2img中设置特征点 以
  • 打开方式无法添加程序的解决办法

    打开方式无法添加程序的解决办法 右键选择打开方式 发现想要的程序没有在列表里面 点击浏览 选择想要的这个程序 点击打开 回到了选择列表 发现没有把想要的程序加进去 该如何处理 方案一 想要使用的exe程序在某个中文命名的文件夹中 这样是添加
  • python基础:inspect模块各函数的用法

    目录 前言 一 inspect模块总览 1 获取成员与判断 2 获取源代码 3 类与函数 4 调用栈 二 inspect模块方法的使用 1 getmembers 2 getcomments getdocs 3 signature 获取方法和
  • 通过一条简单的SQL 来理解MYSQL的解析SQL的过程

    因为打赏账号 所以作者署名必须是 carol11 实际作者还是 Austin Liu 有的时候理解平时习而为常的一件事情 到时有很多的意外的发现 今天就从一条MYSQL的查询语句入手 看看我们还能挖掘点什么 首先一个SQL 语句 会经历二个
  • Python基础教程:第一门编程语言 第6章习题3 写一个猜数字小游戏,要能提示大了还是小了,并且有轮数限制。

    import random number random choice range 101 随机抽出0 100中一个数 guess 102 n 10 while guess number if n 0 限制次数 print 游戏失败 brea
  • 课程作业1-简单课程设计作业——个人通讯录数据库系统(java,MySQL)

    总结介绍 本次个人通讯录数据库系统主要目的是为了做出一个功能齐全 简单易用的信息管理系统提高保存联系人效率 由于能力有限 界面做的有点不好看 还有在登录的编程只做到将登录名和密码设为固定的字符值 修改只能从代码处进行修改 未做到可注册多个用
  • 02-----关于Qt下报error: undefined reference to `__imp_WSAGetLastError‘(Windows环境)

    1 关于Qt下报error undefined reference to imp WSAGetLastError Windows环境 错误已经很明确了 就是我们在Windows下使用网络相关的接口时 必须初始化网络库 即socket库的编译
  • JDBC常用连接URL

    1 Oracle8 8i 9i数据库 thin模式 Class forName oracle jdbc driver OracleDriver newInstance String url jdbc oracle thin localhos
  • SpringBoot整合hibernate

    添加springboot依赖 先使用idea创建maven项目 创建过程可以参考下面的博客 http blog csdn net supervictim article details 53490046 创建完maven项目之后添加spri
  • 用例编号怎么规定_怎么看检测报告

    一 怎么看检测报告 1 无论是使用什么系统来检测论文 在检测完成之后都会出现有查看报告 下载报告的相关项目或者按钮 直接点击查看报告项就可以查看报告 点击下载报告项就会将检测报告用PDF的形式保存到本地 2 以知网的检测报告为例 在检测报告
  • (小白教程)anaconda安装配置及可能遇到的问题解决

    相信来搜索的都懂anaconda 的绝美优势 这里便不再赘述了 啥也不说 开干 第一步 下载并安装软件 https www anaconda com 选择适合你的版本 我这里是window10 以管理员身份运行 选择All Users 继续
  • APNS设置

    APNS设置 openssl x509 in aps development cer inform der out MobileCAPCert pem openssl pkcs12 nocerts out MobileCAPKey pem
  • 【javaScript面试题】2023前端最新版javaScript模块,高频24问

    博 主 初映CY的前说 前端领域 个人信条 想要变成得到 中间还有做到 本文核心 博主收集的关于javaScript的面试题 目录 一 2023javaScript面试题精选 1 js的数据类型 2 双等和三等的区别 3 js中布尔值为fa
  • css3选择器之:nth-child(n)和:nth-of-child(n)

    nth child n 和 nth of child n nth child n 选择器匹配属于其父元素的第 N 个子元素 不论元素的类型 通俗一点的用法就是 nth child n 表示谁的弟n个 比如li nth chidl 3 表示页
  • Llama 2: Open Foundation and Fine-Tuned Chat Models

    文章目录 TL DR Introduction 背景 本文方案 实现方式 预训练 预训练数据 训练细节 训练硬件支持 预训练碳足迹 微调 SFT SFT 训练细节 RLHF 人类偏好数据收集 奖励模型 迭代式微调 RLHF 拒绝采样 Rej
  • 触发器(删除操作)

    在删除xs时 把xscj中对应的记录删除 DELIMITER CREATE TRIGGER xs delete AFTER DELETE ON xs FOR EACH ROW BEGIN DELETE FROM xscj WHERE xh
  • 云效知识库 Thoughts,企业文档管理工具

    云效知识库 Thoughts 企业文档管理工具 云效知识库是一款企业 知识管理 工具 通过独立的知识库空间 结构化地组织在线协作文档 实现企业知识的积累和沉淀 促进知识的高度复用和流通 云效知识库是云效团队孵化的一个创新项目 从最早的构想到
  • git commit -m 'project initialized'报did not match any file known to git的错误的问题

    摘要 这两天需要将本地的代码和码云上的代码进行统一下 需将本地的代码上传到码云中 在使用git的时候报了错 实现过程 首先在控制台上输入命令行 查看本地的新的文件 git status 输入命令行 将新的文件新增到git的缓冲区 git a
  • 海量数据存储读后感

    海量数据存储系列读后感 读了淘宝的海量数据存储系列 感觉豁然开朗 见地提升了很多 现在简单用自己的话总结一下里边的 精髓 SQL与关系代数 第1 2章 第一 二章内容比较简单 第一章给了我们一个模型 他是一个三层结构 模型如下 用户API