Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432695
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 518
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-14 12:10
个人简介

邮箱:oxwangfeng@qq.com

文章分类

全部博文(43)

文章存档

2021年(1)

2018年(7)

2017年(9)

2016年(26)

我的朋友

分类: LINUX

2021-11-21 23:01:35

边缘数据平台-数据存储

背景

边缘数据平台主要是对xxx行架构升级,升级之后分为两个部分,第一部分是边缘存储模块,第二部分是边缘计算模块;

    用户通过不同方式将日志数据发送给边缘存储,边缘存储模块收到请求后,然后进行解析,然后存储到不同的分区中;同时边缘计算模块通过http协议或者unix socket方式从边缘存储模块中拉取数据进行消费,然后进行数据计算;

    边缘数据平台存储模块是一个单机的、分区的、提交日志的服务;单机表示本服务并不是一个分布式服务,分区表示每个topic都会有很多分区,提交日志表示新的消息总是以追加的方式进行存储;分区是为了做到负载均衡,而提交日志只是一种存储方式。

架构


  1. 边缘数据平台的存储服务是一个单独的服务,名称是mstore
  2. message持久化:mstore会将消息持久化到本地磁盘上,并保持o(1)极高的效率。mstore写入磁盘采取顺序追加的方式,所以效率非常高。而message被消费的时候也是按照顺序消费,保证partitionmessage是顺序消费;
  1. message有效期:由于磁盘大小的限制,默认情况下topic是保存3天的时间,不过可以通过修改配置调节topic的保存时间;
  2. producerproducermstore发送消息,可以采取lb的方式,也可以指定partition发送消息;客户端可以将多条日志封装在message中,以提高发送效率;我们提供sdkapi两种方式支持producer发送消息;
  1. push-and-pullmstoreproducerconsumer采用的push-and-pull模式,producer采用异步的方式向mstore发送消息,consumermstore上消息消息,生产和消费是异步的;
  2. 分区:mstore提供多分区partition,保证消息持久化落盘。写入时提供保证多分区的负载均衡能力,若一个分区出现不可用情况,可以自动剔除;

文件存储机制

名字解释

  • Topic: 一种类型的数据成为一个Topic,比如访问日志为一个topic,回源日志为另一种topic
  • Partition: 一台Server 中一个Topic的数据分布在多个目录中,每个目录称为一个PartitionPartition的划分可以根据Server下挂的数据盘数量
  • Data File: Partition目录内用于存放数据的逻辑文件,分为时间索引、普通索引和日志文件。
  • Segment File: Data File 按照某些切分原则,切分成多个物理文件,每个文件称为Segment File。同上一个Segment File 包含一个时间索引文件、一个普通索引文件、一个日志文件,三者文件名相同,为该文件中Message最小Cursor,扩展名分别为.timeindex.index.log
  • Message: 一条消息,内部包含一条或者多条日志。每个Message都有一个唯一ID指示,该ID称为Cursor

数据组织

├── /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. 通过时间戳查找消息

  • 查找segment:由于segment都是以offset命名,并且都是顺序有序。可以将所有的文件最后修改时间进行排序,根据二分法查找就可以快速确定segment
  • 查找时间索引文件:查找segment包含的时间索引文件,由于时间索引文件数据是顺序有序的,可以根据二分法查找,快速确定待查找的时间戳对应的offset
  • 查找普通索引文件:根据上述查到的offset查找普通索引文件,由于普通索引文件采用稀疏矩阵存储,所以也可以采用二分法快速确定message在日志文件的相对偏移位置;
  • 查找日志文件:根据上面查找的相对偏移位置查找日志文件,可以直接进行定位读取日志内容;

比如根据如下图查找时间戳1555553312开始的数据

1. 先找到这个时间戳对应的segment

2. 查找时间索引,查找到这个时间戳对应的offset1

3. 查找普通索引,由于普通索引采用稀疏矩阵存储,所以只能查找小于等于该offset的最大索引;在本图中查找到的offset0,对应的相对position0

4. 查找日志文件,从position=0开始查找,直到查找到offset=1
 

2. 通过cursor查找消息

  • 查找普通索引文件:由于segment都是以offset命名,并且都是顺序有序,所以根据二分法查找,快速定位是哪个索引文件;由于普通索引文件以稀疏矩阵存储,并且是有序的,所以可以根据二分法快速确定message在日志文件的相对偏移位置;
  • 查找日志文件:根据上面查找的相对偏移位置查找日志文件,可以直接进行定位读取日志内容;
阅读(982) | 评论(0) | 转发(0) |
0

上一篇:设置irq affinity

下一篇:没有了

给主人留下些什么吧!~~