简介
作为阿里在APM和IOT领域的重要布局,时序数据库承载着阿里对于物理网和未来应用监控市场的未来和排头兵,作为业内排名第一的时序数据库InfluxDB,其在国内和国际都拥有了大量的用户,阿里适逢其时,重磅推出了阿里云 InfluxDB®。
限于篇幅,本文仅就InfluxDB的其中一个功能:不限数据库数量进行介绍。
为什么开发不限数据库数量的功能
Snapshot机制
InfluxDB采用的是TSM引擎,TSM 存储引擎主要由几个部分组成: cache、wal、tsm file、compactor。
TSM存储引擎,其核心思想类似于LSM Tree,它会将最近的数据缓存在磁盘中,在达到预设的阈值之后就会触发snapshot,也就是我们常说的快照刷盘。
使用内存的作用是为了缓存,加速查询。snapshot主要是解决数据持久化落盘问题。
开源的InfluxDB为什么需要限制数据库的数量?
因为在开源的方案中,Cache是否做snapshot和限制写入是仅仅以单个cache占用大小来判断的。而这个大小的阈值是一个预先配置的固定参数:
详见配置文件:
# CacheMaxMemorySize is the maximum size a shard's cache can
# reach before it starts rejecting writes.
# Valid size suffixes are k, m, or g (case insensitive, 1024 = 1k).
# Values without a size suffix are in bytes.
# cache-max-memory-size = "1g"
# CacheSnapshotMemorySize is the size at which the engine will
# snapshot the cache and write it to a TSM file, freeing up memory
# Valid size suffixes are k, m, or g (case insensitive, 1024 = 1k).
# Values without a size suffix are in bytes.
# cache-snapshot-memory-size = "25m"
默认情况下:cache-max-memory-size = "1g" ,而cache-snapshot-memory-size = "25m", 单单凭借着两个阈值的对于不同的用户场景而言是很难做到好的平衡的。尤其是对于数据库个数不确定的情况下(例如增加了数据库,减少了数据库等情况)很难适应。比方说,为了提高内存的利用率,我们倾向于一开始就设定较高的阈值,结果当某一天,用户的数据库数量增长时,可能会导致整体的内存占用超出,从而进一步导致InfluxDB服务不稳定的情况的出现。除此之外,不同的用户,使用的数据库数量本身是不一样的,如果设置一个统一的阈值,这显然无法将多数用户的内存利用率保持在一个较优的水平上。
阿里云InfluxDB®的解决方案
方案
基于前面的分析,我们知道,需要一套整体的全局解决方案,来适应不同的用户之间,以及同一个用户不同场景下的需求。
我们的处理方案主要思路是通过对于全局Cache的统计分析来做,具体的话分为两个部分:
在处理Write请求时:
写入请求时检查是否超出了全局内存控制的Limit阈值,如果超出,则直接返回错误。以全局限流的方式实现对于内存使用量上升趋势的控制,并以此来强化系统的稳定性。
在判定是否需要做snapshot时:
在判断是否需要做snapshot时,先判断全局的Cache占用的大小是否超出了阈值,如果没有,直接跳过snapshot。
只有在全局的Cache需要做snapshot && 单个cache也需要做snapshot的时候,才去触发snapshot。
效果
在我们阿里云的4c16g,8c32g,16c64g的机器上进行的对比测试中,与限制DB数的版本想比较,不限DB数之后,其实现的snapshot的机制其效果基本上等同于前者。但同时,在用户的数据库数据量进行变化的时候,又能够自适应的动态调整单个snapshot的阈值,效果符合我们的预期。同时我们发现,对于不同数据库之间内存占用差异明显的场合,还能够提升写入的阈值,从而提升写入性能。
总结
阿里云InfluxDB基于开源InfluxDB做了很多提升与完善。本文介绍的不限数据库解决方案是其中重要的一环。它一定程度上化解了开源InfluxDB的配置参数缺乏整体性和自适应性的缺陷,既提升了内存的利用率,又很好地兼容了稳定性的要求,并且在数据库数量量差异较大的场景下做到了对于写入性能的提升。
未来阿里云InfluxDB还将在内存管理方面继续探索和优化,给用户提供最佳的服务和体验。
商业化
阿里云InfluxDB®现已正式商业化,欢迎访问购买页面(https://common-buy.aliyun.com/?commodityCode=hitsdb_influxdb_pre#/buy)与文档(https://help.aliyun.com/document_detail/113093.html?spm=a2c4e.11153940.0.0.57b04a02biWzGa)。