做物聯網平台,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" }