1. 程式人生 > >三、MongoDB的組成結構

三、MongoDB的組成結構

本文主要討論這幾個問題:

  1. MongoDB的體系結構
  2. MongoDB的資料邏輯結構
  3. MongoDB的資料儲存結構

1. MongoDB的體系結構

當我們下載了MongoDB進行解壓安裝後,會發現MongoDB主要包括這幾部分:
這裡寫圖片描述

  • 資料庫服務(mongod)
  • 分片叢集部署中,資料和查詢的路由服務(mongos)
  • shell客戶端(mongo)
  • 匯入匯出工具(mongoimport / mongoexport)
  • 備份恢復工具(mongodump / mongorestore)
  • 拉取並重放oplog的工具(mongooplog)
  • 監控工具(mongostat、mongotop、mongosniff)
  • GridFS的命令列操作工具(mongofiles)
  • 效能測試工具(mongoperf,暫時只能測I/O)
  • 檢視bson檔案的工具(bsondump)

其中最主要的程式當然是mongod(資料庫服務),mongod在不同的部署方案中(單機部署,副本集部署,分片叢集部署),通過不同的配置,可以扮演多種不同的角色:

  • 在單機部署中扮演 資料庫伺服器(提供所有讀寫功能)
  • 在副本集部署中,通過配置,可以部署為 primary節點(主伺服器,負責寫資料,也可以提供查詢)、secondary節點(從伺服器,它從主節點複製資料,也可以提供查詢)、以及arbiter節點(仲裁節點,不儲存資料,主要用於參與選舉投票)
  • 在分片叢集中,除了在每個分片中扮演上述角色外,還扮演著配置伺服器的角色(儲存有分片叢集的所有元資料資訊,mongos的資料路由分發等都要依賴於它)

在一臺伺服器上,可以啟動多個mongod服務。但在實際生產部署中,通常還是建議一臺伺服器部署一個mongod例項,這樣不僅減少資源競爭,而且伺服器故障也不會同時影響到多個服務。

2. MongoDB的資料邏輯結構

當啟動mongod服務後(我們也稱建立了一個mongod例項),我們就可以通過客戶端(比如預設提供的shell客戶端mongo)連線mongod服務進行資料操作。
在進行資料操作前,我們有必要先了解一下MongoDB的資料邏輯結構。
在MongoDB中,資料邏輯結構分為資料庫(database)、集合(collection)、文件(document)三層,熟悉關係型資料庫的同學可以分別把它們對應為關係型資料庫中的資料庫(database)、表(table)、行(row)。

  • 一個mongod例項中允許建立多個數據庫。
  • 一個數據庫中允許建立多個集合(集合相當於關係型資料庫的表)。
  • 一個集合則是由若干個文件構成(文件相當於關係型資料庫的行,是MongoDB中資料的基本單元)。

下面我們詳細介紹下MongoDB中的資料庫,集合,文件:

  1. 資料庫

    • 在一個數據庫中可以建立多個集合,原則上我們通常把邏輯相近的集合都放在一個數據庫中,當然出於效能或者資料量的關係,也可能進行拆分。
    • 在MongoDB中有幾個內建的資料庫:
      • admin
        • admin庫主要存放有資料庫帳號相關資訊。
      • local
        • local資料庫永遠不會被複制到從節點,可以用來儲存限於本地單臺伺服器的任意集合
        • 副本集的配置資訊、oplog就儲存在local庫中。
        • 注意:重要的資料不要儲存在local庫,因為沒有冗餘副本,如果這個節點故障,儲存在local庫的資料就無法正常使用了。
      • config
        • config資料庫用於分片叢集環境,存放了分片相關的元資料資訊。
      • test
        • MongoDB預設建立的一個測試庫,連線mongod服務時,如果不指定連線的具體資料庫,預設就會連線到test庫。
  2. 集合

    • 集合由若干條文件記錄構成。
    • 前面介紹MongoDB的時候提到過,集合是schema-less的(無模式或動態模式),這意味著集合不需要在讀寫資料前建立模式就可以使用,集合中的文件也可以擁有不同的欄位,隨時可以任意增減某個文件的欄位。
    • 在集合上可以對文件進行增刪改查以及進行聚合操作。
    • 在集合上還可以對文件中的欄位建立索引。
    • 除了一般的集合外,還可以建立一種叫做定容集合(capped collection)型別的集合,這種集合與一般集合主要的區別是,它可以限制集合的容量大小,在資料寫滿的時候,又可以從頭開始覆蓋最開始的文件進行迴圈寫入。副本集就是利用這種型別的集合作為oplog,記錄primary節點上的寫操作,並且同步到從節點重放,以實現主副節點資料複製的功能。
  3. 文件

    • 文件是MongoDB中資料的基本儲存單元,它以一種叫做BSON文件的結構表示。
    • BSON,即Binary JSON,多個鍵及其關聯的值有序地存放在其中,類似對映,雜湊或字典。
    • 需要注意的是,文件中的鍵/值對是有序的,不同序則是不同文件。並且鍵是區分大小寫的,否則也為不同文件。
    • 文件的鍵是字串,而值除了字串,還可以是int, long, double,boolean,子文件,陣列等多種型別。
    • 文件中不能有重複的鍵。
    • 每個文件都有一個預設的_id鍵,它相當於關係型資料庫中的主鍵,這個鍵的值在同一個集合中必須是唯一的,_id鍵值預設是ObjectId型別,在插入文件的時候,如果使用者不設定文件的_id值得花,MongoDB會自動生成生成一個唯一的ObjectId值進行填充。

3. MongoDB的資料儲存結構

MongoDB的資料目錄下主要儲存有 預寫日誌(journal)、集合的資料(collection)、集合的索引(index)。
預寫日誌(journal),相當於關係型資料庫中redo log的作用,它主要用於減少隨機IO,以及可以用來在mongod服務崩潰重啟後,恢復崩潰前還沒來得及刷寫到資料檔案的寫操作。
集合的資料檔案(collection)則存放的是集合的BSON文件。
集合的索引檔案(index)則存放的是集合中的索引資料。
當然除了這些資料外,MongoDB還維護有其他資料,另外不同的儲存引擎,資料的儲存結構也有差異,這個留待後面介紹儲存引擎的時候再討論。
下圖是3.2.6版本wiredTiger中集合的資料、索引、journal檔案結構(如果配置directoryPerDB=true的話,每個資料庫的資料和索引檔案會分別存放在以各自db name命名的資料夾中)
這裡寫圖片描述