T级数据存储方案的选型

近期在开发一个物联网项目,终端设备会采集下位机的信息,并每隔几秒(或有事件触发)向平台上报数据。目前初步观察的数据量为14G/天,数据在平台的有效期至少半年,所以这半年下来,需要存储的数据量大概为2.5T,而且终端设备在不断的增加,上报的数据量也在增加,所以需要选择一种比较好的数据存储方案来应对这些大数据的存储和项目的需求。

数据规模分析

据现有数据分析:

  1. 平台数据至少需要留存半年(6个月)
  2. 每分钟终端大致会上报10M左右的数据,一天内有14G,半年大致有2.5T
  3. 终端设备数仍在不断的增加,需要存储的数据也在增加

用户对数据的需求分析

  1. 实时数据:查看当前终端设备的状态信息
  2. 较高频次数据:当天、3天内、7天内的数据
  3. 冷数据:7天后的历史数据
    ⇒ 冷数据占据了整个的数据量

各类型数据库分析

关系型数据库:

  • 关系型数据库(如:MySQL、SqlServer等)
    常用的关系型数据库更便于存储结构化的数据,对事务、复杂查询等都有很好的支持,比较适合那些数据量不是非常大(1000w数据以下)、有事务或复杂查询等需求的场景。
    由于我这个数据量比较大,而且冷数据所占比重很大。如果用此类数据库作存储的话,一是有些不划算(很多时间很可能就存储了,后面几乎不用),二是比较难以支撑大数据存储。

非关系型数据库:

  • Redis
    Redis属于内存数据库,所有的数据都在内存之中(虽然可以磁盘化,但是运行的都是,所有的数据都会载入内存)。
    Redis比较适合做可允许可能会丢失数据的缓存数据库(服务器在异常掉电或关闭情况下,Redis可能会丢失数据)。
  • Redis为内存型KV系统,处理的数据量要小于HBase与MongoDB
  • Redis很适合用来做缓存,但除此之外,它实际上还可以在一些“读写分离”的场景下作为“读库”来用,特别是用来存放Hadoop或Spark的分析结果。
  • Redis的读写性能在100,000 ops/s左右,时延一般为10~70微妙左右;而HBase的单机读写性能一般不会超过1,000ops/s,时延则在1~5毫秒之间。
  • Redis的魅力还在于它不像HBase只支持简单的字符串,他还支持集合set,有序集合zset和哈希hash
  • SSDB
    SSDB是一个开源的高性能数据库,使用Google LevelDB作为存储引擎,可以支持T级别的数据,可以非常方便的把数据迁移到SSDB上。官网说是作为Redis的替代方案的数据库,同时有分布式方案。
    如果既想快速的提供数据的读写,又想对数据进行可靠存储的话,使用SSDB是一种可选方案。
  • MongoDB
    MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系数据库中功能最丰富(支持索引、较复杂查询等),最像关系数据库;是一个基于分布式文件存储(BSON)的数据库。
  • HBase
    HBase是建立在Hadoop体系中的大数据存储方案,数据扩展简单、开源、分布式、版本化、列存储的数据库,主要用于存储海量数据以及对海量数据的数据分析。
    但是它在完全分布式部署(生产部署)时,至少需要3台机器才可以有效的跑起来,同时对他的部署和学习成本相对会高些(后续文章中会说到HBase在部署时所遇到的坑)。

结论

通过调研、查询文档和部分测试以及考虑到未来的扩展性,并和客户沟通(主要是机器成本)后,最终选择 HBase 作为我们的存储方案。