木鸟杂记
分布式系统,数据库,存储
2024-02-29T01:07:32.460Z
https://www.qtmuniao.com/
木鸟杂记
Hexo
螺蛳壳里做道场:实现一个256KB的迷你文件系统
https://www.qtmuniao.com/2024/02/28/mini-filesystem/
2024-02-28T02:22:16.000Z
2024-02-29T01:07:32.460Z
<blockquote>
<p>本文主要“编译”自书籍《<a href="https://pages.cs.wisc.edu/~remzi/OSTEP/">Operating Systems: Three Easy Pieces</a>》第 40 章,这是一本非常深入浅出的书,推荐给所有对操作系统感到迷茫的同学。本文件系统基于一个非常小的硬盘空间,以<strong>数据结构</strong>和<strong>读写流程</strong>为主线,从零到一的推导出各个基本环节,可以帮你快速建立起对文件系统的直觉。</p>
</blockquote>
<p>文件系统基本都是构建于块存储之上的。但当然,现在的一些分布式文件系统,如 <a href="https://github.com/juicedata/juicefs">JuiceFS</a>,底层是基于对象存储的。但无论块存储还是对象存储,其本质都是按 “数据块” 进行<strong>寻址</strong>和<strong>数据交换</strong>的。</p>
<p>我们首先会探讨一个完整的文件系统在硬盘上的数据结构,也即布局;然后再通过打开关闭、读写流程将各个子模块串起来,从而完成对一个文件系统要点的覆盖。</p>
MemGraph 背后论文《基于内存和MVCC 的高速可串行化》详细解析(一)
https://www.qtmuniao.com/2024/02/06/memory-mvcc-serial/
2024-02-06T12:21:12.000Z
2024-02-06T12:28:56.304Z
<blockquote>
<p><a href="https://memgraph.com/">Memgraph</a> 是一个内存型图数据库,使用 OpenCypher 作为查询语言,主打小数据量、低延迟的图场景。由于 Memgraph 是开源的(repo 在<a href="https://github.com/memgraph/memgraph">这</a>,使用 C++ 实现)我们可以一窥其实现。根据<a href="https://github.com/memgraph/memgraph/blob/master/src/storage/v2/storage.hpp#L57">这行注释</a>,我们可以看出,其内存结构实现灵感主要来自论文:<a href="https://db.in.tum.de/~muehlbau/papers/mvcc.pdf">Fast Serializable Multi-Version Concurrency Control for Main-Memory Database Systems</a>。</p>
<p>本系列主要分为两大部分,<strong>论文解读</strong>和<strong>代码串讲</strong>,每一部分会根据情况拆成几篇。本篇,是论文解读(一),主要讲论文概述以及如何使用链表巧妙的存储了多版本、控制了可见性。论文解析(二)和(三),会讲如何实现可串行化以及回收多版本数据。</p>
</blockquote>
<h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>从论文题目可以看出,本论文旨在实现一种针对<strong>内存型</strong>数据库的、基于<strong>多版本</strong>(MVCC)实现的、支持可<strong>串行化</strong>隔离级别的高性能数据结构。其基本思想是:</p>
<ol>
<li>使用列存</li>
<li>复用 Undo Buffer 数据结构</li>
<li>使用双向链表来串起数据的多版本</li>
<li>巧妙设计时间戳来实现数据的可见性</li>
<li>通过谓词树(PT)来判事务读集合(Read Set)是否被更改</li>
</ol>
<p>与一般的多版本不同的是,本论文会在<strong>原地更新</strong>数据,然后将旧版本数据“压”到链表中去,使用 “压”是因为链表采用头插法:表头一侧数据较新、表尾一侧数据较旧。所有数据的链表头由一个叫 <code>VersionVector</code> 的数据结构维护,如果某一行没有旧数据,对应的位置就是 <code>null</code>。</p>
2023 年终总结——穷则思变
https://www.qtmuniao.com/2024/01/04/2023-summary/
2024-01-04T06:24:17.000Z
2024-02-03T08:17:17.305Z
<p><img src="https://s2.loli.net/2024/01/04/YQDIuMkiNGJmdtx.jpg" alt="IMG_8879.JPG"></p>
<p>2023 年倏忽而过,事后来看,要用一个词来形容的话,就是——<strong>穷则思变</strong>。</p>
<p>穷倒并非是物理上穷的吃不下饭,而是更接近穷则独善其身”中困顿的穷。思想上原先很多赖以生存的观念维持不下去了,因此经历了一个痛苦地重塑过程。这倒并非坏事,只不过其间被动的思想拉扯,现在想来仍然倍感折磨。当然,正是这些逆境逼迫我们跳出“群体思维”进行求索(think different),纵一时痛苦,却能有所得——每个人毕竟要走出属于自己的路。</p>
<p>那这一年到底发生了哪些改变呢?</p>
Y Combinator 2024 年关注 20 个创业领域
https://www.qtmuniao.com/2024/01/03/yc-2024-rfs/
2024-01-03T06:07:04.000Z
2024-01-03T14:09:23.459Z
<blockquote>
<p><a href="https://www.ycombinator.com/">Y Combinator</a>(YC)是一家知名的美国创业加速器,自2005年成立以来致力于推动初创企业成功。作为初创企业界的领军人物,YC 的特点是,不仅提供资金,还提供指导、资源和网络,以帮助初创企业在竞争激烈的市场中脱颖而出。YC 的成功案例包括 Airbnb、Dropbox 和 Reddit 等,这些公司现在都是各自领域的巨头。<br>YC 发布的“创业公司征集请求”(<a href="https://www.ycombinator.com/rfs">RFS</a>)是其基于对市场趋势、技术进步和全球挑战的深入理解,对全球创业社区的发出的一种前瞻性呼吁,相信能够对创业者和想选择创业公司的小伙伴们有诸多启发。2024 年的 RFS 一共有 20 个方向,这是上篇,包括前十个。如果看的人多,我再继续翻译后面 10 条。以下是正文。</p>
</blockquote>
<h1 id="引言"><a href="#引言" class="headerlink" title="引言"></a><strong>引言</strong></h1><p>虽然,我们投资过的最棒创业 idea,往往并不是一开始我们想找的,反而是那些无心插柳的。</p>
<p>但仍然,我们对几类创业公司非常期待。以下是我们最新的 2024 版本的<strong>创业公司征集请求</strong>(Requests for Startups,RFS),简述了下我们关注一些创业方向。</p>
<blockquote>
<p>但并非说创业只有选择这些方向,才能够申请 Y Combinator。其实我们的多数投资仍然集中在过于一直关注的互联网和移动端。所以如果在阅读本文前,你已经有相关方向的创业想法,请继续做下去。<br>同样的,也不是说我们列了这些方向,你就要据此创立一家公司。RFS 的目的在于,如果你正好已经有一个类似的想法,那欢迎向我们申请。<br>另外,如果你想知道我们在寻求投资哪些类型的非盈利组织,可以看<a href="https://www.ycombinator.com/blog/what-y-combinator-looks-for-in-nonprofits/">这篇文章</a>。</p>
</blockquote>
使用“隐喻”的方式帮你建立对 Raft 的直觉
https://www.qtmuniao.com/2023/11/15/raft-explain/
2023-11-15T13:31:57.000Z
2023-11-15T21:43:15.523Z
<p>相比 Paxos,Raft 的一大特色就是算法拆成了相对正交的几个部分——领导者选举、日志同步、状态持久化、日志压缩和配置变更。你如果对课程照目录看下就能看出来,除却最后一部分,这些模块就是我们课程 PartA ~ PartD 要分别实现的内容。将算法正交化拆分的好处是,让每个模块相对内聚,使得整体更易理解和实现——这也是 Raft 算法设计的初衷。</p>
<p>下面我不打算采用<strong>精确</strong>的方式来讲解每个模块——那是<strong>论文正文</strong>和<strong>代码实现</strong>要做的事情。相反,本章我将带领大家在<strong>感性</strong>上建立一个对 Raft 基本概念(任期、选举)和两大流程(领导选举、日志同步)的认识。带着这个感性认识,大家可以再去仔细研读<a href="https://raft.github.io/raft.pdf">论文</a>,想必能事半功倍地梳理出 Raft 算法中海量的细节。</p>
构建和维护星球最强对象存储系统的一点微小经验
https://www.qtmuniao.com/2023/11/15/s3-experience/
2023-11-15T13:29:38.000Z
2024-03-04T01:23:33.620Z
<blockquote>
<p>本文来自 Amazon S3 VP <a href="https://www.linkedin.com/in/andywarfield">Andy Warfield</a> 在 FAST 23 上的主旨演讲的<a href="https://www.allthingsdistributed.com/2023/07/building-and-operating-a-pretty-big-storage-system.html">文字稿</a>,总结了他们在构架和维护如此量级的对象存储 —— S3 的一些经验。我们知道,Amazon S3 是云时代最重要的存储基础设施之一,现在各家云厂商的对象存储基本都兼容 S3 接口,所有云原生的基础设施,比如云原生数据库,其最终存储都要落到对象存储上。</p>
</blockquote>
Firebolt:如何在十八个月内组装一个商业数据库
https://www.qtmuniao.com/2023/10/05/firebolt-paper/
2023-10-05T09:23:25.000Z
2023-10-05T16:27:52.691Z
<p>假如你是一个初创公司的 CTO,想迅速推出一款面向 AP 市场可用的数据库产品,还得有差异化的功能(不然谁会用一个新产品),你会怎么做呢?</p>
<p><a href="https://www.firebolt.io/">Firebolt</a> 在 2022 年专门发了一篇论文:<a href="https://www.firebolt.io/content/firebolt-vldb-cdms-2022">Assembling a Query Engine From Spare Parts</a> 来讲这个事情。核心思想就是,<strong>利用开源组件,像攒台式机一样攒出一个数据库</strong>。</p>
【图解面试基础】三种基本排序算法
https://www.qtmuniao.com/2023/09/18/three-basic-sort/
2023-09-18T01:47:16.000Z
2023-09-18T09:08:01.399Z
<blockquote>
<p>这是使用 <a href="https://procreate.com/" title="Procreate">Procreate</a> 画图之余,心血来潮开的一个<a href="https://space.bilibili.com/30933812/channel/collectiondetail?sid=1655069">面试基础系列</a>,力求图文并茂、代码视频兼顾,做成最好看的面试系列。欢迎喜欢的小伙伴点赞、转发和打赏,如果支持的同学多,我就继续更下去。</p>
</blockquote>
<p><img src="https://s2.loli.net/2023/09/18/g78B3XunFliWv6a.png" alt="3-basic-sort.png"></p>
知新的关键——类比
https://www.qtmuniao.com/2023/08/21/use-analogy-to-know-more/
2023-08-21T08:47:15.000Z
2023-09-18T08:52:26.965Z
<p>这一年来,由于各种原因,需要不断地学新东西。于是如何高效地学习,就成了一个随之而来的问题。最近看了一些书和公开课,包括 Scott H Young 的 <a href="https://book.douban.com/subject/11603298/">Learn More, Study Less</a>(以下简称 LMSL),和 Coursera 上的公开课<a href="https://www.coursera.org/learn/ruhe-xuexi">学会如何学习</a>(Learning How to Learn,以下简称 LHL),发现了一些有意思的观点,趁着热乎(虽然都还没看完),记下来梳理一下,也希望能对大家有所启发。</p>
<p>这两个资源在进行讲解时,都使用了<strong>类比</strong>(analogy)。</p>
<p>LMSL 中提出了<strong>整体学习法</strong>(Holistic learning),其基本思想是:你不可能孤立地学会一个概念,而只能将其融入已有的概念体系中,从不同角度对其进行刻画来弄懂其内涵和外延。</p>
数据库面试的几个常见误区
https://www.qtmuniao.com/2023/08/21/database-interview-myth/
2023-08-21T08:29:41.000Z
2023-08-21T08:36:22.944Z
<h1 id="数据库面试的几个常见误区"><a href="#数据库面试的几个常见误区" class="headerlink" title="数据库面试的几个常见误区"></a>数据库面试的几个常见误区</h1><p>由于业务的需要,最近面试了很多数据库候选人。发现很多候选人在面试准备时会有一些普遍的误区,借此机会展开聊聊我作为面试官的一些建议。这次主要讲四个误区:代码基础差、工程素养弱、沟通思维无、知识框架碎。</p>
生活工程学(一):多轮次拆解
https://www.qtmuniao.com/2023/08/21/life-engineering-many-passes/
2023-08-21T08:19:43.000Z
2023-08-21T08:36:18.727Z
<h1 id=""><a href="#" class="headerlink" title=""></a></h1><blockquote>
<p>我们在工程实践中,有些构建代码的小技巧,其背后所体现的思想,生活中也常常可见。本系列便是这样一组跨越生活和工程的奇怪联想。这是第一篇:多轮次拆解,也即,<strong>很多我们习惯一遍完成的事情,有时候拆成多个轮次完成,会简单、高效很多</strong>。</p>
</blockquote>
<p>我在进行 code review 时,常看到一些新手同学在一个 for 循环中干太多事情。常会引起多层嵌套,或者 for 循环内容巨大无比。此时,如果不损失太多性能,我通常建议同学将要干的事情拆成多少个步骤,每个步骤一个 for 循环。甚至,可以每个步骤一个函数。</p>
<p>当然,这些全是从维护角度着眼的。因为人一下总是记不了太多事情,一步步来,而不是揉在一块来,会让每个步骤逻辑清晰很多。后者,我通常称之为”<strong>摊大饼</strong>“式代码,这种代码的特点是写时很自然,但是维护起来很费劲——细节揉在一起总会让复杂度爆炸。软件工程中的最小可用原型,也是类似的理念。</p>
数据处理的大一统——从 Shell 脚本到 SQL 引擎
https://www.qtmuniao.com/2023/08/21/unify-data-processing/
2023-08-21T07:44:11.000Z
2023-08-21T08:28:01.245Z
<p>“工业流水线”的鼻祖,<a href="https://www.youtube.com/watch?v=As0lqsd2-NI">福特 T 型汽车</a>的电机装配,将组装过程拆成 29 道工序,将装备时间由平均二十分钟降到五分钟,效率提升四倍 ,下图<a href="https://www.motor1.com/features/178264/ford-model-t-factory-cutaway-kimble/">图源</a>。</p>
<p><img src="https://s2.loli.net/2023/08/21/BrMe3j9oapmX8f2.png" alt="T-model-car.png"></p>
<p>这种流水线的思想在数据处理过程中也随处可见。其核心概念是:</p>
<ol>
<li><strong>标准化的数据集合</strong>:对应待组装对象,是对数据处理中各个环节输入输出的一种<strong>一致性抽象</strong>。所谓一致,就是一个任意处理环节的输出,都可以作为任意处理环节的输入。</li>
<li><strong>可组合的数据变换</strong>:对应单道组装工序,定义了对数据进行变换的一个<strong>原子</strong>操作。通过组合各种原子操作,可以具有强大的表达力。</li>
</ol>
<p>则,数据处理的本质是:<strong>针对不同需求,读取并标准化数据集后,施加不同的变换组合</strong>。</p>
NUMA-Aware 执行引擎论文解读
https://www.qtmuniao.com/2023/08/21/numa-aware-execution-engine/
2023-08-21T07:01:39.000Z
2023-08-21T07:27:20.623Z
<blockquote>
<p>最近翻 DuckDB 的执行引擎相关的 PPT(<a href="https://dsdsd.da.cwi.nl/slides/dsdsd-duckdb-push-based-execution.pdf">Push-Based-Execution</a>) 时,发现了这篇论文:<a href="https://15721.courses.cs.cmu.edu/spring2016/papers/p743-leis.pdf">Morsel-Driven Parallelism: A NUMA-Aware Query Evaluation Framework for the Many-Core Age</a>。印象中在执行引擎相关的文章中看到他好几次;且 NUMA 架构对于现代数据库架构设计非常重要,但我对此了解尚浅,因此便找来读一读。</p>
</blockquote>
<p>从题目中也可以看到,论文最主要关键词有两个:</p>
<ol>
<li>NUMA-Aware</li>
<li>Morsel-Driven</li>
</ol>
<p>据此,大致总结下论文的中心思想:</p>
<ol>
<li>多核时代,由于部分 CPU 和部分内存的绑定关系,CPU 访问内存是不均匀(NUMA)的。也即,对于某一个 CPU 核来说,本机上一部分内存访问延迟较低,另一部分内存延迟要高。</li>
<li>传统火山模型,使用 Exchange 算子来进行并发。其他算子并不感知多线程,因此也就没办法就近内存调度计算(硬件亲和性)。也即,非 NUMA-local。</li>
<li>为了解决此问题,论文在数据维度:对数据集进行水平分片,一个 NUMA-node 处理一个数据分片;对每个分片进行垂直分段(Morsel),在 Morsel 粒度上进行并发调度和抢占执行。</li>
<li>在计算维度:为每个 CPU 预分配一个线程,在调度时,每个线程只接受数据块(Morsel)分配到本 NUMA-node 上的任务;当线程间子任务的执行进度不均衡时,快线程会”窃取“本应调度到其他线程的任务,从而保证一个 Query 的多个子任务大约同时完成,而不会出现”长尾“分片。</li>
</ol>
20230819 B 站求职面试直播
https://www.qtmuniao.com/2023/08/19/live-show-infra-interview/
2023-08-19T03:37:59.000Z
2023-08-19T04:36:09.756Z
<p>这是我第一次在 b 站直播分享,录屏地址 <a href="https://www.bilibili.com/video/BV1Fz4y1u79v">https://www.bilibili.com/video/BV1Fz4y1u79v</a> ,主要是从我的求职经历以及面试经历角度聊了一些关于 infra 找工作的注意点,并回答了同学一些现场问题。</p>
<h1 id="🐎-求职准备"><a href="#🐎-求职准备" class="headerlink" title="🐎 求职准备"></a>🐎 求职准备</h1><h2 id="软素质"><a href="#软素质" class="headerlink" title="软素质"></a>软素质</h2><p>💁♂️ <strong>沟通</strong>。面试时无论是经历描述,系统设计甚至写代码,沟通都是第一位的,这是面试各个环节顺利展开的前提。</p>
<p>把一件事说清楚:</p>
<ol>
<li>上下文:先和面试官对齐上下文,不要默认他比你知道的多。</li>
<li>条理性:背景 → 需求 → 方案 → 挑战点 → 结果</li>
<li>简洁性:就跟写文章一样,多过几遍就好了。</li>
</ol>
<p>🧠 <strong>思维</strong>。主要是<strong>抽象</strong>和<strong>联想</strong>。</p>
<ol>
<li><strong>抽象</strong>。也可以说是归纳,或者叫<strong>知识聚簇</strong>。以树来做类比,就是遍历几个子节点,抽象出其共通的父节点的特质,然后进而推演出新的子节点。比如调度问题(CPU 调度、分布式任务调度)。</li>
<li><strong>联想</strong>。也可以说是关联,或者叫<strong>跨域跳联</strong>。以图来做类比,就是对于几个连通子图,在新的维度上给其建立通路。比如文字是思想的一种序列化。</li>
</ol>
RocksDB 运行原理
https://www.qtmuniao.com/2023/06/05/how-rocksdb-works/
2023-06-05T15:41:40.000Z
2023-08-21T06:53:25.600Z
<blockquote>
<p>RocksDB 是很多分布式数据库的底层存储,如 TiKV、CRDB、NebulaGraph 等等。在 DataDog 工作的 <a href="https://artem.krylysov.com/">Artem Krylysov</a> 写了一篇<a href="https://artem.krylysov.com/blog/2023/04/19/how-rocksdb-works/">文章</a>来对 RocksDB 做了一个科普,通俗易懂,在这里翻译下分享给大家。</p>
</blockquote>
<h2 id="导语"><a href="#导语" class="headerlink" title="导语"></a>导语</h2><p>近几年,RocksDB 的采用率急速上升,俨然成为内嵌型键值存储(以下简称 kv 存储)的不二之选。</p>
<p>目前,RocksDB 在 Meta、<a href="https://blogs.bing.com/Engineering-Blog/october-2021/RocksDB-in-Microsoft-Bing">Microsoft</a>、<a href="https://netflixtechblog.com/application-data-caching-using-ssds-5bf25df851ef">Netflix</a> 和 <a href="https://www.uber.com/en-JP/blog/cherami-message-queue-system/">Uber</a> 等公司的生产环境上运行。在 <a href="https://engineering.fb.com/2021/07/22/data-infrastructure/mysql/">Meta</a>,RocksDB 作为 MySQL 部署的存储引擎,为分布式图数据库(<a href="https://www.qtmuniao.com/2021/10/07/facebook-tao/">TAO</a>)提供支持存储服务。</p>
<p>大型科技公司并非 RocksDB 的仅有用户,像是 CockroachDB、Yugabyte、PingCAP 和 Rockset 等多个初创企业都构建在 RocksDB 基础之上。</p>
<p><a href="https://artem.krylysov.com/">我</a>在 Datadog 工作了 4 年时间,在生产环境中构建和运行了一系列基于 RocksDB 的服务。本文将就 RocksDB 的工作原理进行概要式讲解。</p>
影响我写代码的三个 “Code”
https://www.qtmuniao.com/2023/03/25/how-to-read-and-write-code/
2023-03-25T05:20:34.000Z
2023-11-29T16:48:59.273Z
<p>国内很多大学的计算机专业,比较偏重基础和理论的“灌输”(就我当年上学的体验,现在可能会好一些),对于代码能力,虽然也有一些课程实验,但往往不太够用。于是,在进入正式工作前,很多同学就会对自己代码水平不太自信。下面我就根据我自身的写代码经历提供一些建议。</p>
Facebook Velox 运行机制全面解析
https://www.qtmuniao.com/2023/03/22/velox-task-analysis/
2023-03-22T12:00:33.000Z
2024-02-21T08:01:31.316Z
<h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p><a href="https://research.facebook.com/publications/velox-metas-unified-execution-engine/">Facebook Velox</a> 是一个针对 SQL 运行时的 C++ 库,旨在统一 Facebook 各种计算流,包括 Spark 和 Presto,使用推的模式、支持向量计算。</p>
<p>Velox 接受一棵<strong>优化过的</strong> <code>PlanNode</code> Tree,然后将其切成一个个的线性的 <code>Pipeline</code>,<code>Task</code> 负责这个转变过程,每个 Task 针对一个 PlanTree Segment。大多数算子是一对一翻译的,但是有一些特殊的算子,通常出现在多个 Pipeline 的<strong>切口</strong>处,通常来说,这些切口对应计划树的<strong>分叉处</strong>,如 <code>HashJoinNode</code>,<code>CrossJoinNode</code>, <code>MergeJoinNode</code> ,通常会翻译成 XXProbe 和 XXBuild。但也有一些例外,比如 <code>LocalPartitionNode</code> 和 <code>LocalMergeNode</code> 。</p>
2022 年终总结 —— 充实和迷茫
https://www.qtmuniao.com/2023/01/05/2022-summary/
2023-01-04T16:06:33.000Z
2024-03-04T01:23:28.106Z
<p>不知道为何,今年朋友圈分享年终总结的朋友格外多。我挺喜欢这个形式,一来,我很爱看别人的年终总结,看故事之余还能看到一些不同路径;二来,每年定期回顾下,也确实能帮着梳理下思路,简单做下展望。</p>
<p>古代知识垄断的时代,只有帝王将相才能有纪传;而今信息爆炸的世代,人人皆可记之,为自己代言。于短期来说,年岁渐长,思虑日增,很多事不记下来,旬月便忘,通过年终回顾,日后回头追踪下自己思想变迁轨迹,也算三省吾身,冀有新得;于长期来说,我们终将作古,若借助互联网能留下个一鳞半爪,博后世一笑,也算雁过留声。</p>
实现一个数据库需要如何入手?
https://www.qtmuniao.com/2022/12/11/how-to-build-a-database/
2022-12-11T03:11:59.000Z
2024-03-04T01:23:23.800Z
<blockquote>
<p>知乎上有个问题:如何实现一个数据库?手痒忍不住又水了一篇。以计算机中最常用的分析、理解问题的思想,我们可以从两个维度:<strong>逻辑</strong>和<strong>物理</strong>,来思考如何实现一个数据库。</p>
</blockquote>
<h2 id="逻辑维度"><a href="#逻辑维度" class="headerlink" title="逻辑维度"></a>逻辑维度</h2><h3 id="数据模型(对外,面向用户)"><a href="#数据模型(对外,面向用户)" class="headerlink" title="数据模型(对外,面向用户)"></a>数据模型(对外,面向用户)</h3><p>想要实现一个数据库,首先你得定义给给用户什么样的<strong>数据模型</strong>?在前些年,这些可能不是个问题,彼时,数据库约等于关系型数据,约等于 Oracle/SQLServer/MySQL/PostgreSQL 。但随着数据量的不断增大、用户需求的不断细化,关系模型已经不能一招鲜、吃遍天。</p>
DDIA 读书笔记(五):冗余
https://www.qtmuniao.com/2022/10/17/ddia-reading-chapter5/
2022-10-17T15:20:33.000Z
2024-03-04T01:23:57.117Z
<blockquote>
<p>DDIA 读书分享会,会逐章进行分享,结合我在工业界分布式存储和数据库的一些经验,补充一些细节。每两周左右分享一次,欢迎加入,Schedule 和所有文字稿在<a href="https://ddia.qtmuniao.com/">这里</a>。我们有个对应的分布式&数据库讨论群,每次分享前会在群里通知。如想加入,可以加我的微信号:qtmuniao,简单自我介绍下,并注明:分布式系统群。另外,我的公众号:“木鸟杂记”,有更多的分布式系统、存储和数据库相关的文章,欢迎关注<br>本书第一部分讲单机数据系统,第二部分讲多机数据系统。</p>
</blockquote>
<p><strong>冗余(Replication)</strong> 是指将同一份数据复制多份,放到通过网络互联的多个机器上去。其好处有:</p>
<ol>
<li><strong>降低延迟</strong>:可以在地理上同时接近不同地区的用户。</li>
<li><strong>提高可用性</strong>:当系统部分故障时仍然能够正常提供服务。</li>
<li><strong>提高读吞吐</strong>:平滑扩展可用于查询的机器。</li>
</ol>
<blockquote>
<p>本章假设我们的数据系统中所有数据能够存放到一台机器中,则本章只需考虑多机冗余的问题。如果数据超过单机尺度该怎么办?那是下一章要解决的事情。</p>
</blockquote>