时序性数据库(tsdb)1-5

1.分库分表时机

分库分表虽然常放在一起说,但其实是为了解决两部分需求。
分库目的:解决单库的资源瓶颈。比如磁盘,cpu,内存,连接数等等
分表目的:解决单表数据量过大的问题。单表数据量过大会导致索引树过大,即使能走索引sql性能也不会太高,还有大表DDL问题。就个人经验而言,对于Mysql来说,单行大小不超过50kb,数据量超过1000w就应该分表;单行大小超过100kb,数据量500w左右就应该分表。

2.分库分表方案

需要考虑以下几点:
  数据切分方式
  数据切分维度
  数据扩容
  客户端路由还是代理层路由

3.数据切分的方式

垂直分表

垂直分表:把一张表的其他字段切分为第二张表

水平分表

range切分:切片切分
	比如id在0~10000范围放在表1,10001~20000范围放在表2。同理也可以按时间范围拆分。这样切分的优点就是扩展性特别好,我们只要提前创建日后要用到的表就可以了,完全不用迁移数据。
	range切分方式在实际中用的比较少,主要原因是数据均衡问题太严重。比如按时间切分,请求集中在新数据上,导致某一表过热。或者比如range范围是1000w,新表刚开始可能只有很少的数据量,这样数据就不均衡。
	按时间range切分是单表数据过大的一种过度方案,也是我们常说的冷热数据隔离。也许你会有印象,某段时间的淘宝和京东只能查看最近三个月的订单。再往后的订单就要去历史订单列表按日期范围查询。

4.时序性数据库tsdb

时序性数据库:按照自定义时间创建子表,查询的时候只管查询超表

--车辆消息转为tsdb超表,每1天一张子表
SELECT create_hypertable('event', 'ts', chunk_time_interval => 86400, migrate_data => TRUE);
--修改超表分表时间间隔,每10天一张子表
SELECT set_chunk_time_interval('event', 864000);
--给车辆消息添加表空间
SELECT attach_tablespace('a', 'event');

--超表分表时间间隔 分区策略
select * from _timescaledb_catalog.dimension
--表空间映射超表
select * from _timescaledb_catalog.tablespace
--超表
select * from _timescaledb_catalog.hypertable
--超表映射子表
select * from _timescaledb_catalog.chunk where table_name like '_hyper_9%'
--查询子表数据
select to_timestamp(ts),* from _timescaledb_internal._hyper_9_1295_chunk

5.tsdb特点

1.专门优化用于处理时间序列数据,时间序列数据按特性分为两类
	高频率低保留期(数据采集,实时展示)
	低频率高保留期(数据展现、分析)

2.时间序列数据的几个前提
	单条数据并不重要
	数据几乎不被更新,或者删除(只有删除过期数据时),新增数据是按时间来说最近的数据
	同样的数据出现多次,则认为是同一条数据

3.数据写入
	写多于读:95%-99%的操作都是写操作
	顺序写:由于是时间序列数据,因此数据多为追加式写入,而且几乎都是实时写入,很少会写入几天前的数据
	很少更新:数据写入之后,不会更新
	区块删除:基本没有随机删除,多数是从一个时间点开始到某一时间点结束的整段数据删除

4.数据读取(查询)
	顺序读:基本都是按照时间顺序读取一段时间内的数据。
	基数大:基本数据大,超过内存大小,要选取的只是其一小部分,且没有规律,缓存几乎不起任何作用基本数据分析支持

TSDB的数据是用来分析的,所以TSDB还会提供做数据分析所必须的各种运算、变换函数。如可以方便的对时序列数据进行求和、求平均值等操作
posted @ 2022-01-14 18:15  Jeff的技术栈  阅读(153)  评论(0编辑  收藏  举报
回顶部