当前位置: 首页 > 工具软件 > LinDB > 使用案例 >

Lindb

翟高明
2023-12-01

database-shard-replica(leader,follower)

计算和存储分离
查询 http-linproxy(sql解析,生成执行计划,多机查询下发,多机结果聚合,linclient具体查询)-linstorage(内部查询和计算出中间结果)
写入 linclient-linstorage

linMaster 主控节点(shard,replica的分配,各linstorage的存储调度) zk创建临时节点进行选举(各linstorage抢着创建此节点,抢占失败获取此节点信息并watch)
linstorage 需向linMaster发心跳报告资源信息,供LinMaster负载均衡使用
linMaster对leader的处理:初始分配,分配后leader将ISR维护在zk上,下线server或某server不可用(没收到心跳),对server上leader进行重新选举(ISR选一个),定期检查leader是否是初始leader,若不是且初始leader在ISR内,leader迁移
ISR(In-Sync Replicas):一小段时间内Follower的index曾大于等于过Leader的index,包括Leader

Lindb client写入:异步+批量,user thread计算shard放入PointAccumulator(database+shard - batch queue), sender thread消费PointAccumulator,使用netty write,netty内部flush发出

写入leader的wal成功即写入成功,提升写入性能,不保证强一致性

本地写入:先写inverted index(某database在单机上所有shard共享),再写数据,本地cosume index写入lsm缓存,本地ack index缓存flush

单通道复制:写入某leader,leader同布follower,需保证顺序(leader-某follower,单连接,发送单线程,接收单线程,接收处理线程根据shard单线程,发送端callback处理单线程),每个follower有自己的consume index,ack index

多通道复制:leader下线,选新leader,新leader向其它follower同步就是一新通道,不保证顺序

数据格式:segment(时间)-data family(时间)- lsm, 单个lsm文件内容:measurement id - TSID - 数据(按列存储,列1-多数据,列2-多数据)

lsm:下面各操作都有特定线程进行check和特定线程进行处理
1 flush(为了不block写操作,数据exchange到Immutable Memory Table,由IMT写入文件),写入Level O层
2 compact Level O层文件太多,合并入Level 1层,例如Level 0有5文件,Level 1有0文件,第一个文件直接进L1,第二个如果measurement id range和现有L1有重合则合入L1(同measurement id数据合并,新measurement id数据直接写入),否则新建L1文件,L0代表写入时间范围,L1代表measurement id range
3 rollup (细粒度data family L0 - 粗粒度data family L0)

inverted index:元数据(Mapping表获取string-id),缓存,存储(rocksdb),写入数据时希望通过measurement/tags/fields获取measurement id/time series id/field id,若没有则创建,
重点讲2个family,tag name - tag name id, tag name id+tag value -TSID 列表(roaringBitMap,倒排索引)
如何通过tags获取time series id呢?
1 如果出现新的tagName或tagValue
2 SeriesKey(measurement+Tags)-TSID 缓存没有,且多个bitMap AND无结果
上述1或2生成TSID,放入各tagValue对应的bitMap中,放入SeriesKey-TSID缓存中

LevelDB是基于LSM Tree的单机KV数据库,高效。Rocksdb是基于LevelDB改造的

查询sql:downsampling(降时间精度聚合,如sum,interval指定间隔) aggregation(多time series聚合,如sum,group by指定) time(多时间聚合,如t_sum相加,stddev求标准差) series(无显式函数,表达对time结果的处理,如求top10),downsampling和aggregation默认为field本身的聚合类型,也可显式指定聚合类型

举例:select t_max(sum(mean(f1))) from xxx group by appId order by stddev(f1) limit 2
若默认interval为1min,f1默认聚合类型为sum,那么分组后每组有对应appId的多个值(每分钟1个),按stddev(sum(sum(f1)))对组进行排序,选前2组,每组给出对应appId的t_max(sum(mean(f1)))的一个值
select f1 from xxx group by appId order by stddev(sum(mean(f1))) limit 2
每组给出对应appId的sum(sum(f1))的多个值(每分钟1个)

opentsdb :downsampling/aggregation/functions/expressions
influxdb :函数和子查询,语句复杂但通用

 类似资料:

相关阅读

相关文章

相关问答