在上一篇文章《处理海量数据:列式存储综述(存储篇)》 中,我们介绍了几种 Apache ORC、Dremel 等几种典型列式存储的数据组织格式。实践中,很多数据系统构建在 HDFS 等分布式文件系统之上,使用这些规范的格式保存数据,方便各方的业务进行分析查询。

本文将介绍若干个典型的列式存储数据库系统。作为完整的 OLAP 或 HTAP 数据库系统,他们大多使用了自主设计的存储方式,运行在多台机器节点上,使用网络进行通讯协作。

阅读全文 »

列式存储(Column-oriented Storage)并不是一项新技术,最早可以追溯到 1983 年的论文 Cantor。然而,受限于早期的硬件条件和使用场景,主流的事务型数据库(OLTP)大多采用行式存储,直到近几年分析型数据库(OLAP)的兴起,列式存储这一概念又变得流行。

总的来说,列式存储的优势一方面体现在存储上能节约空间、减少 IO,另一方面依靠列式数据结构做了计算上的优化。本文中着重介绍列式存储的数据组织方式,包括数据的布局、编码、压缩等。在下一篇文章中将介绍计算层以及 DBMS 整体架构设计。

阅读全文 »

免费 SSL 证书提供商 Let's Encrypt 去年承诺的 ACME v2 以及通配符证书(Wildcard Certificate)终于在 3 月 14 日正式发布了。ACME 全称“自动化证书管理环境”,用于自动验证域名所有权并颁发 SSL 证书;本次发布的新版 ACME v2 添加了通配符证书的支持,再也不用每次添加子域名都重新申请证书。

ACME v2 目前只有一种方案支持通配符证书的验证—— DNS-01 challenge,即:通过向域名添加一条 TXT 记录来证明用户对域名的所有权。一般只要提供了 Token 访问的 DNS 服务商都可以支持,例如 GoDaddy、CloudFlare、DNSPod 等。

阅读全文 »

F1/Spanner 的论文于 2012 年发表,至今仍是世界上最先进的、规模最大的分布式数据库架构,毫无疑问对现代数据库设计产生了深远影响。其最大的亮点莫过于 TrueTime API,凭借原子钟和 GPS 的加持在全球范围实现了单调递增的时间戳,从而达到外部一致性;其次则是验证了分布式 MVCC 的高性能实现,为业界指明一条发展方向。

不过,论文对存储层实现只作了模糊的阐述:原文中说到 tablet 的实现类似于 Bigtable(复用了不少 Bigtable 的代码),底层基于 Colossus —— 继承 GFS 的下一代分布式文件系统。可以确定的一点是,存储层要为 read-only 和 read-write 事务提供支持:

  • read-only 事务: 读取最新或给定时间戳 \(t_{read}\) 的快照,也就是 snapshot read
  • read-write 事务:读取事务开始时间戳 \(t_{start}\) 的快照,而写入操作在提交时间戳 \(t_{commit}\) 生效

本文从 F1/Spanner 论文出发,结合开源实现 TiDB 和 CockroachDB,谈谈如何设计一个具备 ACID 事务存储层。本文假设读者阅读过原论文 Spanner: Google's Globally-Distributed Database

阅读全文 »

最近程序员圈子悄悄流行起斯坦福的 CS 007: Personal Finance For Engineers 课程,每个人都应该有所了解。但在如何投资的问题上,课程并没有给出适合我国国情的操作建议。

在雪球潜水多年,其中有位大 V 近期出版了适合所有人的《指数基金投资指南》,读后收益良多,故将读书笔记分享到这里,备忘。

阅读全文 »

数据库的索引和机器学习里的预测模型其实有一些相似之处,比如 B 树是把 key 映射到一个有序数组中的某个位置,Hash 索引是把 key 映射到一个无序数组中的某个位置,bitmap 是把 key 映射成是一个布尔值(存在与否)。

这些事,似乎拿预测模型都是可以做的。Yes, but...B 树那是精确的映射关系,和预测模型能一样吗?

所以这就是本论文 NB 的地方了,以上的想法是可以实现的。实验表明,在某些数据集上,用 RM-Index 预测模型代替 B 树之类的数据结构,可以提升 70% 的速度、并节约相当可观的空间。

阅读全文 »

Sharding-JDBC 是由当当网推出的一款开源的分布式数据库中间件。它以 JDBC 的形式嵌入到应用程序中,无需额外部署。Sharding-JDBC 实现了分库分表、读写分离和分布式主键功能,并初步实现了柔性事务。

本文主要介绍 Sharding-JDBC 的事务处理。

Overview

Sharding-JDBC 由于性能方面的考量,决定不支持强一致性分布式事务。我们已明确规划线路图,未来会支持最终一致性的柔性事务。

  • 默认使用 “弱XA” 事务
  • 可选使用柔性事务:
    • BED(最大努力送达型)事务
    • TCC(补偿型)事务
阅读全文 »

不知道是不是我的错觉,Ghost 这两年已经慢慢过了气。就像所有功成名就、开始赚钱的开源项目一样,一旦宣布商业化那基本就是宣告停止增长、甚至开始下滑,当然 Docker 这样牛的勉强可以除外。

当然,也有可能是我喜新厌旧,现在看 Ghost 觉得并没有一定要用它的理由了。随着 Markdown 用的越来越熟练,以及购买了用的十分顺手的 MWeb 编辑器 之后,Ghost 引以为豪的 Editor 对我而言也优势全无。而 Hexo 近年来发展的很好,精致的主题也越来越多呢!(说白了还是因为脸)

下面说正经的。

阅读全文 »

Tips: 如果您已经充分理解问题是什么,请直接跳到 #问题出在哪里 一节。

字符串和编码

先从概念说起,字符串和它的编码是两个不同的概念:

  • 字符串是一段文字本身,可以是中文可以是英文,以及各种语言
  • 字符串的编码是计算机存储、处理字符串的方式;作为一种数据,它和其他数据一样,都是以一串0和1组成的,通常我们用字节数组来表示它。

字符串经过编码(encode) 就成为了一堆数据,反过来,数据经过解码(decode) 就变回我们认识的字符串。

阅读全文 »

Bandit 是什么?

Bandit 是一个用来检查 Python 代码中常见安全问题的工具,它会处理各个源代码文件,解析出 AST(抽象语法树),然后对 AST 节点执行一组对应的插件。当 Bandit 完成检查之后,它能生成一封安全报告。

安装说明:参见 GitHub 项目主页

阅读全文 »
0%