作者:咖啡
三十多年前发布第一个released以来,PostgreSQL正强势回归。PostgreSQL是现今增长最快的数据库,比MongoDB、Redis、MySQL和其它数据库的增长速度都要快。PostgreSQL功能上也已经成熟和扩展,这得益于核心的维护者和不断增长的社区。
然而,PostgreSQL有一个遭人诟病的地方,水平扩展能力差。数位PostgreSQL贡献者已经为OLTP负载和时序负载开发了水平扩展功能选项,而我们研究的,是另外的问题。
问题:时序负载差异
简单来说,时序负载与传统数据库(OLTP)负载不一样。有几个原因:写入即插入、无大规模更新数据、插入数据的实时性、连续时间范围内的读取,而非随机读取、读写分离,一个事务中很少既有写又有读。相比传统数据库,时序数据的数据量要大很多,压缩率也高很多。因此,扩展写、读和存储是时序数据库的关注点。
单个TSDB节点可以扩展到每秒200万个指标和10兆兆字节的数据存储,可以满足大部分的需求。但随着工作量的增大和软件服务的发展,总会追求更强大的性能,这就需要一个基于PostgreSQL的时许数据库的分布式系统。
解决:分块,而非分片
我们新的分布式架构:可扩展到每秒超过1000万个指标,存储pb级的数据,通过更好的并行化处理获得更快的查询速率。从本质上讲,系统可以随着您和您的时序负载的工作量增长而增长。
所有数据库系统水平扩展到多个节点,都是依赖于对数据进行单个维度的切割分片,然后把分片数据存到不同的节点上。
TSDB不通过传统分片的方法作水平扩张,取而代之,我们采用了单节点体系结构的核心概念:块。块是通过按多个维度(其中一个维度是时间)自动对数据进行分区而创建的。创建块是一个细粒度的操作,在单个节点上,一个数据集就可以包含上千个块。
分片通常只支持水平扩展,与分片不同,分块支持广泛,功能强大。例如:
-
纵向扩展(同一个节点)和水平扩展(多个节点)
-
弹性扩张:通过让数据增长到新节点并淘汰旧节点从而实现添加和删除节点
-
分区灵活性:在不停机的情况下更改块大小或分区尺寸(例如,考虑到增加的插入率或额外的节点)
-
数据保存策略:删除超过阈值的块
-
数据堆叠:将旧的数据块从更快、更昂贵的存储空间转移到更便宜、更慢的存储空间
-
数据重排:基于写入模式以一种顺序(例如,按时间)写入数据,然后根据查询模式以另一种顺序(例如,device_id)重写数据
基准测试
早期基准测试结果,表明我们的分布式系统架构能够维持高写速率