2. 特點
3 mongodb 複製(副本集)
4 mongodb分片(sharding)技術
最近將前段時間做的日誌服務進行了改進,資料儲存改為mongodb,資料流轉為:
filebeats收集-->logstash過濾-->mongodb儲存
它是乙個文件資料庫,號稱是最像關係型資料庫的非關係型資料庫,屬於nosql資料庫類,在mongodb中的一條記錄就是乙個文件,是乙個資料結構,由字段和值對組成。mongodb文件與json物件類似,叫做bson。欄位的值有可能包括其它文件、陣列以及文件陣列。
下面是他的資料結構:
,
"outside":
}},"outside": }}
從上面可以看出,他的資料全是以鍵值對的形式出現,可能現在你還是對他的資料結構不太清楚,就拿後端最熟悉的關係型資料庫對比下一下就立馬明了了。
oracle
mongodb
acid transactions
acid transactions
table
collection
rowdocument
column
field
secondary index
secondary index
group_by
aggregation pipeline
oracle的表(table)就是它的集合(collection),oracle的行(row)就是它的文件(document),oracle的列(column)就是它的字段(field)。
需要注意的是:
文件中的鍵/值對是有序的。
文件中的值不僅可以是在雙引號裡面的字串,還可以是其他幾種資料型別(甚至可以是整個嵌入的文件)。
mongodb區分型別和大小寫。
mongodb的文件不能有重複的鍵。
文件的鍵是字串。除了少數例外情況,鍵可以使用任意utf-8字元。
文件鍵命名規範:
鍵不能含有\0 (空字元)。這個字元用來表示鍵的結尾。
.和$有特別的意義,只有在特定環境下才能使用。
以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
聚合查詢:aggregation pipelineaggregation pipeline的功能類似於關係型資料庫的group_by,可以做很多統計查詢操作。
以下是mongodb的幾條基本操作對比:
mongodb與關係型資料庫有乙個非常大的不同點,關係型資料庫的列都是固定的,無法實現對字段的任意擴充套件。而mongodb不同,它支援對字段的任意擴充套件,比如上文中提到過的
,
"outside":
}},"outside": }}
可以發現:前後inside的屬性是不同的,可以隨意對錶結構進行靈活變換,增加/減少字段,所以非常適合那種對錶結構變動頻繁的場景。
早前的mongodb版本被人所詬病的就是無事務,抑或是事務很雞肋,但是今年新出的4.x版本已經解決了這些疑問,4.2版本已經可以完美支援分布式事務,如果有事務方面需求的可以去關注一下他的新特性。
索引通常能夠極大的提高查詢的效率,如果沒有索引,mongodb在讀取資料時必須掃瞄集合中的每個檔案並選取那些符合查詢條件的記錄。這種掃瞄全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對**的效能是非常致命的。索引是特殊的資料結構,索引儲存在乙個易於遍歷讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構
如何建立索引?
>db.collection.createindex(keys, options)
mongodb複製是將資料同步在多個伺服器的過程。複製提供了資料的冗餘備份,並在多個伺服器上儲存資料副本,提高了資料的可用性, 並可以保證資料的安全性。複製還允許從硬體故障和服務中斷中恢復資料。
保障資料的安全性
資料高可用性 (24*7)
災難恢復
無需停機維護(如備份,重建索引,壓縮)
分布式讀取資料
1)mongodb的副本集至少需要兩個節點。其中乙個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的資料。
2)mongodb各個節點常見的搭配方式為:一主一從、一主多從。
3)主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然後對自己的資料副本執行這些操作,從而保證從節的資料與主節點一致。
(ps:話說這個同步過程還和redis主從同步過程蠻像的)
分片(sharding) 是mongodb用來將大型集合分割到不同伺服器(或者說乙個集群)上所採用的方法。儘管分片起源於關係型 資料庫分割槽,但mongodb分片完全又是另一回事。
和mysql分割槽方案相比,mongodb的最大區別在於它幾乎能自動完成所有事情,只要告訴mongodb要分配資料,它就能自動維護資料在不同伺服器之間的均衡。
分片是一種用於在多台計算機之間分配資料的方法。mongodb使用分片來支援具有非常大的資料集和高吞吐量操作的部署。具有大資料集或高吞吐量應用程式的資料庫系統可能會挑戰單個伺服器的容量。例如,高查詢率可能會耗盡伺服器的cpu容量。大於系統ram的工作集大小會增加磁碟驅動器的i / o容量。
為了解決這些問題,有兩個基本的方法: 垂直擴充套件和水平擴充套件。
水平擴充套件:將資料集分布在多個伺服器上。水平擴充套件即分片。
mongodb 通過分片支援水平擴充套件。
分片為應對高吞吐量與大資料量提供了方法。使用分片減少了每個分片需要處理的請求數,因此,通過水平擴充套件,集群可以提高自己的儲存容量和吞吐量。舉例來說,當插入一條資料時,應用只需要訪問儲存這條資料的分片。使用分片減少了每個分片儲存的資料。
例如:
如果資料庫1tb的資料集,並有4個分片,然後每個分片可能僅持有256 gb的資料。如果有40個分片,那麼每個切分可能只有25gb的資料。
(1)
(2)(3)
mongodb的索引相關
最近開始使用mongodb,用了一段時間後,發現有索引的需求。就把學習和使用過程寫下來。先使用mongodb的shell模式,然後再用python通過pymongo使用來試試。新建索引 db.collection.createindex 如 db.collection.createindex 索引型...
mongodb索引相關
索引是提高查詢查詢效率最有效的手段。索引是一種特殊的資料結構,索引以易於遍歷的形式儲存了資料的部分內容 如 乙個特定的字段或一組字段值 索引會按一定規則對儲存值進行排序,而且索引的儲存位置在記憶體中,所在從索引中檢索資料會非常快。如果沒有索引,mongodb必須掃瞄集合中的每乙個文件,這種掃瞄的效率...
mongoDB相關規範
mongodb資料庫命名規範 db x 禁止使用任何 下劃線 外的特殊字元 禁止使用數字打頭的庫名 資料庫名最多為 64字元 mongodb 集合命名規範 t x 集合名全部小寫 禁止使用任何 下劃線 以外的特殊字元 禁止使用數字打頭的集合名稱 集合名稱最多為 64字元 文件中的 key 禁止使用任...