列式存储(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 事务: 读取最新或给定时间戳 的快照,也就是 snapshot read
  • read-write 事务:读取事务开始时间戳 的快照,而写入操作在提交时间戳 生效

本文从 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 项目主页

阅读全文 »

一不小心拿到了天池阿里中间件性能大赛的冠军,准确的说还有个 24 小时即刻挑战赛(个人赛)的亚军。

Emmm... 过去太久了,不知道说什么感言了。以下是是比赛的题目以及我的解答,备忘。

阅读全文 »
0%