TimescaleDB 的架构设计
TimescaleDB 是基于 PostgreSQL 的插件,能够在提供 PostgreSQL 接口的同时提供 Timescale 数据库的功能。这样它就兼具二者的优点:稳定,安全,可靠的连接管理,数据点容量大。
- TimescaleDB 的表叫做 Hypertables,存放的数据叫做 chunks。
- 所有的 Hypertables 都根据时间 + 定制的 key 来 partition,这种区分可以形象地称为 time+space。
- Hypertable 可以用普通的 database schema 定义,定义时可以指定 column names & types,通过 CREATE TABLE 来新建。一定要有一个 column 是时间类型,另外可以有一个可选的 additional partitioning key。
- Hypertable 的索引基于时间 + 定制的 partitioning key,会被自动创建(在建表时),当然也可以再额外建索引。
- Chunks 是内部概念,每个 Chunk 代表一段时间区间 + 一段 partition Key 空间内的数据。在实现上,它通过 PostgreSQL 的 child table 实现。
- Chunks 不会太大,方便 index 的整颗 B 树可以放在内存中。
- 对于设置了 retention policy 的表(即数据存放多久),删除操作还是太重,TimescaleDB 的做法是整个 Chunk 都过期了就简单地扔掉。
- 单机扩展数据库性能的关键在于如何在内存和磁盘中做 trade-off。在内容大到内存放不下了,就会将数据和 indexes 写到 disk 上。这个过程会有 B 树的一部分数据在磁盘和内容间做 swapping。<= 解决的办法是配置好 chunks 的大小,如果调的合适,是可以做到最近的表完全被塞入内存,避免 swap-to-disk。