復制
MongoDB復制是將數據同步在多個服務器的過程。
復制提供了數據的冗余備份,並在多個服務器上存儲數據副本,提高了數據的可用性, 並可以保證數據的安全性。
-
保障數據的安全性
-
數據高可用性 (24*7)
-
災難恢復
-
無需停機維護(如備份,重建索引,壓縮)
-
分布式讀取數據
MongoDB復制是主從結構:一主一從或一主多從
主從節點設置
-
啟動一個MongoDB服務,連接后使用命令rs.initiate()來啟動一個新的副本集
-
使用rs.conf()來查看副本集的配置,使用rs.status()命令查看副本集狀態
-
-
添加從節點:使用rs.add(HOST_NAME:PORT)方法來添加副本集的成員
-
使用命令db.isMaster()判斷當前運行的Mongo服務是否為主節點
-
MongoDB中只能通過主節點將Mongo服務添加到副本集中,主從在主機宕機后所有服務將停止,而副本集在主機宕機后,副本會接管主節點成為主節點,不會出現宕機的情況。
分片
分片:是另一種集群,當MongoDB存儲海量的數據時,一台機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時就可以通過在多台機器上分割數據,使得數據庫系統能存儲和處理更多的數據。
-
復制所有的寫入操作到主節點
-
延遲的敏感數據會在主節點查詢
-
單個副本集限制在12個節點
-
當請求量巨大時會出現內存不足。
-
本地磁盤不足
-
垂直擴展價格昂貴
下圖展示了在MongoDB中使用分片集群結構分布:

上圖中主要有如下所述三個主要組件:
-
Shard:
用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾台機器組個一個replica set承擔,防止主機單點故障
-
Config Server:
mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk信息。
-
Query Routers:
前端路由,客戶端由此接入,且讓整個集群看上去像單一數據庫,前端應用可以透明使用。
備份和恢復
備份
mongodump命令可以導出所有數據到指定目錄中
mongodump -h dbhost -d dbname -o dbdirectory
-
-h:MongDB所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
-
-d:需要備份的數據庫實例,例如:test
-
-o:備份的數據存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里面存放該數據庫實例的備份數據。
恢復
mongorestore 命令恢復備份的數據
mongorestore -h <hostname><:port> -d dbname <path>
-
--host <:port>, -h <:port>:
MongoDB所在服務器地址,默認為: localhost:27017
-
--db , -d :
需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
-
--drop:
恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,備份后添加修改的數據都會被刪除,慎用哦!
-
<path>:
mongorestore 最后的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。
你不能同時指定 <path> 和 --dir 選項,--dir也可以設置備份目錄。
-
--dir:
指定備份的目錄
你不能同時指定 <path> 和 --dir 選項。
監控
MongoDB中提供了mongostat 和 mongotop 兩個命令來監控MongoDB的運行情況
mongostat
mongostat是mongodb自帶的狀態檢測工具,在命令行下使用。它會間隔固定時間獲取mongodb的當前運行狀態,並輸出;進入mongodb\bin執行mongostat命令
mongotop
mongotop也是mongodb下的一個內置工具,跟蹤一個MongoDB的實例,查看哪些大量的時間花費在讀取和寫入數據。 mongotop提供每個集合的水平的統計數據。默認情況下,mongotop返回值的間隔為一秒
進入mongodb\bin執行mongotop命令,可以在后面指定間隔時間
