12 物联网中的数据存储
物联网设备连接上云平台之后,会源源不断的将数据发送到云平台。云平台要怎样存储这些原始数据,以及进一步存储经过初步处理过的数据?
我们在日常的程序开发中,最头痛的是数据库的升级。因为在目前的程序开发中,通常应用都是无状态的,应用的升级和替换有了很多成熟的方案。而数据是有状态的,并且数据是公司重要的数字资产,不能轻易丢弃。因此数据库的升级和替换,每一次都是伤筋动骨。
从最开始的数据库选型开始,我就必须慎之又慎。数据库选型的基本原则,就是根据数据的类型和业务使用的方式来选择。
数据大体上可以分为3类:
- 结构化数据 (Structured Data)
- 半结构化数据 (Semi-Structured Data)
- 非结构化数据 (Unstructured Data)
针对这些数据的特性,以及使用的业务场景,我们可以选择不同类型的数据库。
12.1 关系型数据库
我们会采用关系型数据库来保存结构化数据。关系型数据库可以很容易的实现数据的CRUD,很容易的实现关联插叙。同时可以支持事务管理,保证数据操作的ACID特性。
但是传统的单机型关系型数据库很难支撑物联网所产生的海量数据,因此需要新的方案来解决。最初的方案是对数据库进行分库分表,然后使用例如MyCat这样的数据库中间件实现数据库操作。随着这方面需求越来越多,出现了分布式关系型数据库,也就是NewSQL数据库。NewSQL数据库可以选择开源的TiDB,CockroachDB,也有商业化的OceanBase等等。
12.2 时序数据库
物联网中的一些数据具有很强的时间顺序特性,例如传感器上报的温度信息等。这些数据在读写、存储和分析处理方面有下面的这些特点:
- 持续不断的写入,写入频率基本固定。数据基本不做更新。
- 在业务中读取的频率很低,通常是进行数据分析时进行读取。
- 时效性强,新数据价值高,就数据会迅速失去价值。
- 旧数据被查询的概率不高,并且一般是按照时间范围的粗颗粒度的读取分析。
针对这种特性,业界推出了时序数据库。时序数据库最开始应该是出现在工业应用中,但是随着物联网的兴起,在物联网中应用的也越来越广泛。时序数据库也有很多开源实现,比如InfluxDB,KairousDB,OpenTSDB等。
12.3 非关系型数据库
对于半结构化数据,我们通常会采用非关系型数据库,也就是NoSQL来存储。通常非关系型数据库都是采用键值对来存储,以记录的主键作为key,value则是各种各样的。例如MongoDB中的value是类似JSON结构的数据,Redis中的value可以有各种不同的类型。
通常,非关系数据库不强调数据的一致性,不支持事务操作,也不关注关联表查询。并且对数据格式没有固定的要求,便于扩展。
在不同的应用场景中,可以使用不同的NoSQL数据库。例如CouchDB,Redis,Cassandra,MongoDB等等。
12.4 分布式文件系统
对于非结构化数据,典型的就是例如图片、音频、视频等数据。这些数据完全不能按照结构化的方法来描述,也无法预定义数据模型。对这类数据的大规模存储,我们只能使用分布式文件系统。
分布式文件系统最出名的就是HDFS,其他的还有FastDFS和Ceph等等。