邮箱:oxwangfeng@qq.com
分类: LINUX
2021-11-21 23:01:35
边缘数据平台-数据存储
背景
边缘数据平台主要是对xxx行架构升级,升级之后分为两个部分,第一部分是边缘存储模块,第二部分是边缘计算模块;
用户通过不同方式将日志数据发送给边缘存储,边缘存储模块收到请求后,然后进行解析,然后存储到不同的分区中;同时边缘计算模块通过http协议或者unix socket方式从边缘存储模块中拉取数据进行消费,然后进行数据计算;
边缘数据平台存储模块是一个单机的、分区的、提交日志的服务;“单机”表示本服务并不是一个分布式服务,“分区”表示每个topic都会有很多分区,“提交日志”表示新的消息总是以追加的方式进行存储;“分区”是为了做到负载均衡,而“提交日志”只是一种存储方式。
架构
文件存储机制
名字解释
数据组织
├── /disk0/mstore/partition/topic/0
│ ├── 0.index
│ ├── 0.log
│ ├── 0.timeindex
│ ├── 55824510.index
│ ├── 55824510.log
│ ├── 55824510.timeindex
├── /disk1/mstore/partition/topic/0
│ ├── 0.index
│ ├── 0.log
│ ├── 0.timeindex
│ ├── 43562462.index
│ ├── 43562462.log
│ ├── 43562462.timeindex
...
每个目录下面包含三种文件:日志文件、普通索引文件、时间索引文件;
时间索引文件:记录着时间与cursor的对应关系;
普通索引文件:记录这cursor和日志文件相对便宜量的对应关系;
日志文件:记录着message信息;
Message格式
offset:表示偏移量
size:表示整个数据包的大小
version:表示版本号
crc:表示整个message的校验值
payload length:表示payload的大小
payload:存放的是loggrouplist
loggrouplist的数据结构如下:
message LogColumn
{
required bytes Name = 1;
required uint32 Type = 2;
}
message LogGroup
{
required fixed64 TimeStamp = 1;
required bytes Source = 2;
required LogColumn Columns = 3;
required uint32 CompressType = 4;
required bytes Payload = 5;
optional string Topic = 6;
}
message LogGroupList
{
repeated LogGroup logGroupList = 1;
}}
索引查找
1. 通过时间戳查找消息
比如根据如下图查找时间戳1555553312开始的数据
1. 先找到这个时间戳对应的segment;
2. 查找时间索引,查找到这个时间戳对应的offset是1;
3. 查找普通索引,由于普通索引采用稀疏矩阵存储,所以只能查找小于等于该offset的最大索引;在本图中查找到的offset为0,对应的相对position为0;
4. 查找日志文件,从position=0开始查找,直到查找到offset=1;
2. 通过cursor查找消息