學習MongoDB過程中零散的知識

    本人小白,學習mongodb倆月不到,以前也沒接觸過其他數據庫,現在慢慢在啃MongoDB,本帖貼一些平常學習過程中搜集到的零散的知識、技巧。


以下內容由以下文章提取並加入自己的平常蒐集到的零散知識,不斷更新。謝謝原po.

http://database.51cto.com/art/201012/241103.htm 

http://www.programmer.com.cn/9999/


【51CT0經典譯文】我之所以喜歡MongDB,主要是因爲在動態語言中使用它是如此簡單,自然。到目前爲止,我已經在兩個項目(Encode 和 Sparrw)中使用過它了,雖然對這個選擇我非常滿意,但是有些問題我還是沒有注意到,這些問題讓我抓了好幾個小時的頭皮才解決。如果你有多臺機器,然後爲數據庫多分配幾臺機器,那麼有些問題可以迎刃而解,但是我的項目是運行在單個(虛擬)服務器之上的低流量Web應用程序。

(關於MongoDB,具體可以參考:http://www.mongodb.org/)

(關於作者的兩個項目Encode 和 Sparrw,分別可以參考:http://en.co.de/和http://sparrw.com/)

1.使用64位版本MongoDB

    32位版本最多存儲2.5GB數據。因爲MongoDB在內部實現上是通過內存映射的方式來提高性能的,32位系統的內存地址本身就限制了數據容量。當然,做練習用,32位已足夠。但當你開始配置你的生產性(或用於演示)的時候,推薦選擇64位版本,因爲以後無法通過“修復”來解決此問題,只能重新安裝。

2.在另外一臺機器上創建一個從數據庫作爲副本

            如果用單臺服務器(一個mongodb服務器進程),指示用作學習和開發,是可以的。但是,如果用到生產環境中,風險會很高:若服務器崩潰了或者不可訪問,數據庫至少會有一段時間不可用。如果是硬件出了問題,可能需要將數據轉移到另一臺機器上。在最壞的情況下,磁盤或者網絡問題可能會導致數據損壞或者數據不可訪問。

    如果你的MongoDB實例崩潰了(或者由於OOM[Out of Memorya內存溢出]掛掉了,或者整個系統崩潰),那麼誰也無法保證你的數據庫會怎麼樣。你可以進行修復,但這無法保證結果是什麼。所以最好的辦法就是,如果你真的珍惜你的數據,你應該把數據庫放到另一個服務器上,VPS(Virtual Private Server虛擬專用服務器)可以考慮。

    總是使用Replicca Sets:Replica Sets通過自動failover機制提供MongoDB的高可用性。在應用中,如果primary機器出現故障,那麼某一臺secondary機器就會通過選舉成爲新的primary,整個集羣的仍然能夠提供正常服務。我們的服務不會支持無同步機制的MongoDB佈置方案,如果開發者自己的環境中個同步機制的代價過高,我們建議其使用一些雲存儲服務。Engine Yard目前已近關於MongoHQ和MongoLab都建立了合作關係。開發者可以在合作者頁面找到更多這方面信息。

3.讓他更安全

    在默認情況下,MongoDB不會進行身份驗證,並且會監聽所有的網絡端口(如果你是從他們的官方站點獲得的版本;各種Linux發行版,例如Debian和Ubuntu)在默認情況下都只綁定到127.0.0.1,這纔是明智的),這就是說如果你在一個面向公衆的服務器上使用它,在世界上任何地方,任何人都可以訪問你的數據庫。

    所以最好將MongoDB設置成身份驗證,或者讓MongoDB之監聽loclahost.

4.經常使用getLastError()

    如果你不需要閃電般的速度,花一點時間來確保你的變更對於這個數據庫是OK的,並且對數據庫進行修改並沒與造成什麼問題,絕對是值得的。因爲一旦存在問題,那麼應該在你的應用程序中把它們記錄下來,一旦出了故障,可以在需要的時候恢復。

    另:如果你確定你需要使用getLastError(),那麼至少不要混合使用,也不要再同一個集合上使用它。MongoDB無法確保命令會按照指定的順序來執行。在我的測試代碼中,我做了一個一步的remove()調用,即無需等待這個函數執行完畢,然後在remove(可能是全部移除也可能是隻移除一部分)以前,我插入了一些新的條目。

5.保持版本更新

    保持版本更新很重要,10gen(10gen 既是一個雲平臺,又是一個可下載的開放源代碼包,可用於創建您自己的私有云。)在每個版本中都會修復一些問題,使MongoDB運行更出色。

6.默認開啓journaling日誌

    MongoDB支持在寫操作前紀錄journal日誌來提高節點的可用性(設置寫入安全writeConcern級別)。強烈建議在部署時開啓journaling日誌。注意數據文件的存放位置。在使用時,確認數據文件處於一個持久化存儲中比如(/data/mongodb目錄)。也可以使用費持久化的設備進行數據文件存儲,不過一定小心,可能會對集羣架構造成影響。推薦使用EBS進行MongoDB的數據文件存儲。熱數據最好能存放在內存中。能夠保持熱數據(以及索引數據)一直放在內存中,會提高整個集羣性能。


7.一個I/O請求到達磁盤前,可能經過多層緩存:

①系統級文件系統緩存;

②存儲控制器軟件級緩存;

③磁盤設備本身自帶的硬件緩存。


8.清除緩存注意

在drop_caches之前一定先用sync命令將所有未寫的緩衝區寫到磁盤。


9.MongoDB下載源碼安裝

(以2.6.5爲例)

下載並解壓後源碼文件夾:mongo-r2.6.5

進入文件夾:cd mongo-r2.6.5

編譯全部:scons all

(若cup有多核,可執行” scons all -j cup核數 “  來加速編譯過程)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章