做物联网平台,MongoDB是首选
- 2019 年 10 月 6 日
- 筆記
至少前天接触了有致于做物联网平台的某鞋业集团,发现对MongoDB文档数据库理解还是不够深刻。今天再次在两台Linux CentOS主机安装了MongoDB数据库,对其高级特性进行了验证。有以下经验。
一、MongoDB无初始结构化的定义,有利于物联网数据的松散化管理。
1、我们插入两条文档数据,"name","color","failure" 元数据事先并未定义
> db.mxCollection.insert({"name":"car1","color":"yello"})
WriteResult({ "nInserted" : 1 })
> db.mxCollection.insert({"name":"car1","failure":"yes"})
WriteResult({ "nInserted" : 1 })
2、查询这两条数据,发现数据显示不像mysql,单元列存储无规则;而且默认有_id元数据,有利于进行唯一性的检索
> db.mxCollection.find()
{ "_id" : ObjectId("5cee854cc74bc88162353db6"), "name" : "car1", "color" : "yello" }
{ "_id" : ObjectId("5cee8589f918f3b3837a6c81"), "name" : "car1", "failure" : "yes" }
3、MongoDB直接架构在磁盘上,并未在HDFS上
标粗的两个文件即为数据库文件。
[root@ecs-maxing-0001 bin]# cd /data/db
[root@ecs-maxing-0001 db]# ls
journal local.0 local.ns maxing.0 maxing.ns mongod.lock storage.bson _tmp
二、MongoDB原生支持读写分离,以及自动主备切换
1、用rs.add命令在primary节点加入secondary节点,当主节点死亡时,将自动连接备节点。
2、比起mysql主从同步后,mysql切换节点需要proxy软件支持,而MongoDB数据库原生支持。不得不说,后起之秀的数据库的确先进了很多。
三、MongoDB原生支持数据切片,支持自动横向伸缩
Shard节点为真正的数据存储节点,而ConfigServer则进行数据的分配管理,RouterSDK安装在App端。通过RouterSDK与configServer的通信,实现自动选择Shard节点,满足数据在不同服务器存储的需求。Router前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用,实现了去中心化。
同时Shard节点支持自动弹性扩展、伸缩,任意增加、减少服务器不影响业务的运行。
MongoDB去中心、支持不中断业务的扩展,比Mysql的复杂分布式数据库配置的确先进、简单了不少。
因篇幅有限,明天我们测试一下数据库分片的实际效果。
四、MongoDB通过建索引可以极大加速数据检索时间
物联网的时代,数据增加非常之快,且数据量非常之在。比如一个物联网的智能穿戴手环,一天可能增加10M的数据量,后期的数据检索时间将非常痛苦。例如,想查询一年内,所有的走路步数,实际已经完成了一次count()计算。如果没有建索引,如果数据量很多,有可能十几分钟都难以得到结果。建索引后效果将提升很多,有利于物联网数据的大数据快速检索。
1、建立索引
> db.mxCollection.createIndex({"name":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
2、实测在1GB左右的数据量,从优化前的执行15.15S到优化后降至0.013S,性能提升了1000多倍。
> db.mxCollection.find({"name":"hello"}).pretty()
{ "_id" : ObjectId("5cee8b41d0e361b43e717d4d"), "name" : "hello" }