Page 95 - 《软件学报》2021年第5期
P. 95
尤勇 等:一种监控系统的链路跟踪型日志数据的存储设计 1319
Segment 中最后一个 Entry 的值为当前最新的 index 值,即,更新索引文件的最后 8 个字节即可.此方案不需要在
单独的文件中存储 index 值,并且在每次更新索引文件时就可更新 index 值,不仅减少了文件 IO 操作,且本方案
可以有效降低 id 值重复的频率.之前通过单独文件存储 index 的方式在宕机后会造成上当前 3s 周期内所有
index 都会重复,而当前方案只会导致在内存块中的 LogView 对应 index 出现重复.
Fig.11 Design scheme of Index value
图 11 Index 值的设计方案
(5) 是否引入对 LogView 的缓存
理论上可以引入缓存机制,在内存中维护固定量的 LogView,并使用 LRU 策略进行更新.但是在第 1.3 节中
提到了 LogView 的查询具有偶发性、离散性的特点,在较小时间段内,某一条 LogView 被多次请求的情况极少,
即不存在热点数据,缓存机制无法有效的发挥作用,反而造成了额外的性能开销,所以此应用场景并不合适引入
缓存机制.
6 总结与未来工作
本文不仅介绍了我们针对 CAT 这个 APM 框架而设计的日志存储系统的整体架构,而且详细讲解了存储的
设计方案:使用内存块批量写入文件的方式提高写入效率、存储时采用了 Snappy 压缩算法节省磁盘空间,以及
设计了两层索引来提供较高的日志查询效率.从最后的性能测试结果来看,本文的存储方案基本满足了前文提
到的多项目标,且具有以下几个特点.
(1) 设计简单.在 LogView 的存储上,本文的两级索引结构与 hash 索引同样简捷、高效、易理解,而 B+树
索引则相对复杂.在索引结构中,它仅需记录地址信息,而另外两种需要额外记录 id 标识,所以在代码
的实现上也更容易,并且在索引构建时耗时相对更少.
(2) 性能稳定.存储方案中设计了更轻量的分布式系统架构,能够满足系统的整体读写性能;此外,两级的
索引结构也提供了稳定、高效的查询效率.在第 4.1 节的性能结果中展示了线上真实运行数据,一条
LogView 查询过程的平均耗时在 32.29ms,满足第 2.3 节中提出的业务需求.
(3) 通用性.本文的存储方案原则上是可以通用的,只要对应的日志数据具有全局唯一的 id 标识即可,该
方案也同样适用于前面所提到的 Tracing 类型数据的存储.
相对于已有的存储方案而言,除了上述几个显著特点以外,还存在其他设计优势:
(1) 该轻量级的分布式存储设计在 LogView 生成的时候就做了对应的“分库”操作,而其他现有的成熟数
据库则需要在后期数据量庞大的时候做“分库、分表、同步”等操作,造成性能上的问题.
(2) 存放在同一个数据文件中的 LogView 数据来自于同一个应用实例,而来自于同一个实例的日志存在
更多的相似数据,能够使得压缩算法具有更高的压缩率,节省更多的存储空间.
本文设计方案的创新性与贡献也同样在于上述特点与优势.