mongodb選型問題

1、Mongodb的介紹mysql

MongoDB 是一個跨平臺的,面向文檔的數據庫,提供高性能,高可用性和可擴展性方便。 MongoDB 工做在收集和文件的概念。redis

數據庫

數據庫是一個物理容器集合。每一個數據庫都有本身的一套文件系統上的文件。一個單一的MongoDB服務器一般有多個數據庫。sql

集合

集合是一組MongoDB的文檔。它至關於一個RDBMS表。收集存在於一個單一的數據庫。集合不執行模式。集合內的文檔能夠有不一樣的領域。一般狀況下,一個集合中的全部文件是相同或相關的目的。mongodb

文檔

文檔是一組鍵 - 值對。文件動態模式。動態模式是指,在相同集合中的文檔不須要具備相同的字段或結構組的公共字段的集合的文檔,能夠容納不一樣類型的數據。數據庫

下面給出的表顯示RDBMS術語使用 MongoDB 的關係服務器

 

RDBMS MongoDB
Database Database
Table Collection
Tuple/Row Document
column Field
Table Join Embedded Documents
Primary Key Primary Key (Default key _id provided by mongodb itself)
數據庫服務器和客戶端
Mysqld/Oracle mongod
mysql/sqlplus mongo

2、Mongodb與傳統RDBMS的對比架構

MongoDB比RDBMS的優點

  • 架構:MongoDB是文檔型數據庫,其中一個集合保存不一樣的不一樣的文件。字段的數量,內容和該文件的大小能夠是不一樣於從一個文件複製到另外一個。app

  • 一個單一的對象,結構相對清晰運維

  • 沒有複雜的鏈接yii

  • 深查詢能力。 MongoDB支持動態查詢使用基於文檔的查詢語言,如SQL幾乎同樣強大的文件

  • 調優

  • 易於規模化:MongoDB是易於擴展

  • 不須要數據庫對象的應用程序對象轉換/映射

  • 使用內部存儲器存儲(窗口)工做組,從而實現更快的數據存取

爲何要使用MongoDB

  • JSON風格文件的形式,面向文檔存儲:數據存儲
  • 對任何屬性可索引

  • 複製和高可用性

  • 自動分片

  • 豐富的查詢

  • 快速就地更新

  • MongoDB的專業技術支持

應該在哪裏使用MongoDB?

  • 大數據

  • 內容管理和交付

  • 移動和社交基礎設施

  • 用戶數據管理

  • 數據平臺

3、Mongodb的不足

  •  隨意的結構定義,引來後期管理上的困難
  • 無事務支持
  • 運維技術不成熟

 

 

4、Mongodb的三種部署方案

Replica Set

       中文翻譯叫作副本集,不過我並不喜歡把英文翻譯成中文,老是感受怪怪的。其實簡單來講就是集羣當中包含了多份數據,保證主節點掛掉了,備節點能繼續提供數據服務,提供的前提就是數據須要和主節點一致。以下圖:

       Mongodb(M)表示主節點,Mongodb(S)表示備節點,Mongodb(A)表示仲裁節點。主備節點存儲數據,仲裁節點不存儲數據。客戶端同時鏈接主節點與備節點,不鏈接仲裁節點。

       默認設置下,主節點提供全部增刪查改服務,備節點不提供任何服務。可是能夠經過設置使備節點提供查詢服務,這樣就能夠減小主節點的壓力,當客戶端進行數據查詢時,請求自動轉到備節點上。這個設置叫作Read Preference Modes,同時Java客戶端提供了簡單的配置方式,能夠沒必要直接對數據庫進行操做。

       仲裁節點是一種特殊的節點,它自己並不存儲數據,主要的做用是決定哪個備節點在主節點掛掉以後提高爲主節點,因此客戶端不須要鏈接此節點。這裏雖然只有一個備節點,可是仍然須要一個仲裁節點來提高備節點級別。我開始也不相信必需要有仲裁節點,可是本身也試過沒仲裁節點的話,主節點掛了備節點仍是備節點,因此我們仍是須要它的。

介紹完了集羣方案,那麼如今就開始搭建了。

 

Sharding

ongoDB集羣包括必定數量的mongod(分片存儲數據)、mongos(路由處理)、config server(配置節點)、clients(客戶端)、arbiter(仲裁節點:爲了選舉某個分片存儲數據節點那臺爲主節點)。


一、shards:一個shard爲一組mongod,一般一組爲兩臺,主從或互爲主從,這一組mongod中的數據時相同的,具體可見《mongodb分佈式之數據複製》。數據分割按有序分割方式,每一個分片上的數據爲某一範圍的數據塊,故可支持指定分片的範圍查詢,這同google的BigTable 相似。數據塊有指定的最大容量,一旦某個數據塊的容量增加到最大容量時,這個數據塊會切分紅爲兩塊;當分片的數據過多時,數據塊將被遷移到系統的其餘分片中。另外,新的分片加入時,數據塊也會遷移。 

二、mongos:能夠有多個,至關於一個控制中心,負責路由和協調操做,使得集羣像一個總體的系統。mongos能夠運行在任何一臺服務器上,有些選擇放在shards服務器上,也有放在client 服務器上的。mongos啓動時須要從config servers上獲取基本信息,而後接受client端的請求,路由到shards服務器上,而後整理返回的結果發回給client服務器。

三、config server:存儲集羣的信息,包括分片和塊數據信息。主要存儲塊數據信息,每一個config server上都有一份全部塊數據信息的拷貝,以保證每臺config server上的數據的一致性。

 

Master-Slaver

這個是最簡答的集羣搭建,不過準確說也不能算是集羣,只能說是主備。而且官方已經不推薦這種方式,因此在這裏只是簡單的介紹下吧,搭建方式也相對簡單。

 

以上三種集羣搭建方式首選Replica Set,只有真的是大數據,Sharding才能顯現威力,畢竟備節點同步數據是須要時間的。Sharding能夠將多片數據集中到路由節點上進行一些對比,而後將數據返回給客戶端,可是效率仍是比較低的說。

       我本身有測試過,不過具體的機器配置已經不記得了。Replica Set的ips在數據達到1400w條時基本能達到1000左右,而Sharding在300w時已經降低到500ips了,二者的單位數據大小大概是10kb。你們在應用的時候仍是多多作下性能測試,畢竟不像Redis有benchmark。

       Mongodb如今用的仍是比較多的,可是我的以爲配置太多了。。。。我看官網都看了好多天,才把集羣搭建的配置和注意要點弄明白。並且用過的人應該知道mongodb吃內存的問題,解決辦法只能經過ulimit來控制內存使用量,可是若是控制很差的話,mongodb會掛掉。。。

相關文章
相關標籤/搜索