深入 Kafka Core 的设计(核心设计篇)

本篇主要讨论网络层基础架构、生产消费链路。 网络层 Broker 端 Reactor 模型 Broker 端的网络层设计基于 Reactor 模型。 在实际实现就是,EndPoint 对象提供监听的地址信息给 SocketServer 服务端对象,然后服务端启动一条 Acceptor 线程,专门用于 accept(2),并由 Acceptor 派生出 num.network.threads=3 条…

深入 Kafka Core 的设计(基础理论篇)

本篇主要围绕基础术语定义、一致性副本复制协议、消息格式演进、消息落地上天、日志删除以及 Delayed Operation 限期任务的设计展开。 术语定义 名词 解释 Broker 又称 Kafka Server,是最基础的角色 Controller 一个 Broker 且存在着 ZK 元数据管理服务 Coordinator 一个 Broker 且活跃着消费组元数据管理服务 Consumer Gr…

一个自制简易数据库 KxDB

背景 启发自一位富裕的女同事推荐的 CMU-15-445: CMU 的数据库系统课程,于是改头换脸地实现。 设计初衷: 实现高性能的存储引擎,减少内存复制延迟,以及实现更深入的 I/O 性能优化, 实现查询引擎,希望基于 KV 实现出复杂的查询优化场景, 使用 Lustre 类似的并行文件系统,并发对文件块进行查询(解决 LSM 树过分依赖 Compaction 来减少随机 I/O), 最终实现分…

数据仓库维度建模笔记

维度建模模型本质是对关系模型的修补,提出缓慢变化维度的处理方案,使其更适用于记录历史数据,同时由于数据仓库与业务数据库是独立的,因此提出一致性理论,使得新的业务也可以复用原有的数仓表。 数据仓库的建模第一步与关系建模过程一样,从业务过程开始分析,关系模型关注业务过程所需的字段,而服务于分析系统的维度建模,在此基础上还需要关心分析需求的指标(推动埋点的设计);然后构建总线矩阵梳理出原子粒度的维度表与…

探究 HBase Cluster Replication

Cluster Replication 在 HBase 中不是一件容易的事情(但似乎 HBase 中就没有容易的事情 🙃)。 在阅读本文之前,首先需要了解 Sequence ID(以下简称 SeqId),在 HBase 中,一个 Region 的 SeqId 相当于代表该 Region 的“年龄”,新的 Region(比如新表刚创建,或者刚由父 Region Split 出来的两个子 Region…

从 HDFS 到 HBase 的 RPC 设计思路

两者虽然都依赖了 ProtoBuf,但都暗藏玄机。 总的来说,HDFS 的 RPC 分为两个大类:普通与流式 RPC,普通 RPC 全程传递的都是 ProtoBuf 编码对象,流式 RPC 则分为两段数据,一段 ProtoBuf 编码对象,一段一系列的 Packet 数据包。HBase 的 RPC 主要应用是批量传递 Cell[] 数据单元组,因此 HBase 使用未经 ProtoBuf 编码的 …

HDFS 基于 Unix Socket 的短路读与中心化缓存的实现演进

在 SSD 集群的 HBase 中,I/O 可能可以已经可以支撑很高的 QPS,但 HDFS 的短路读可能并不一定,尤其在共享内存的分配与回收上,其 QPS 也是非常高且消耗资源的 。所以, 短路读为什么依赖共享内存?直接传递文件描述符不可以吗? 这些问题都可以从实现演进之中找到答案: 13年1月,2.0.3-alpha 确实是通过 UNIX Socket 直接传递文件描述符实现短路读(HDFS-…

简易算法原理与实现手册

快速排序 快速排序定义了 Pivot 中枢值,每次排序的目标是(下文均以升序为例),希望排序后的 Pivot 值位置的左区间都比 Pivot 值小,右区间都比 Pivot 值大,也就是希望排序后,Pivot 值位置是正确的,且左右区间都对 Pivot 值偏序。 因此在递归树中,每层能绕过扫描的数据是树上层确定位置的 Pivots 集合。当 Pivot 每次都选择在中位数上,每层分别确定出 1、2、…