MongoDB淺析

清風許許發表於2019-06-28

MongoDB簡介

MongoDB 是一個基於分散式檔案儲存的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB下載及安裝

本文件基於MongoDB3.0.6的版本

下載

官網下載
如果下不了,可以去百度網盤 下載 ,提取碼ikka

安裝

  • 解壓壓縮檔案
  • 修改/etc/profile檔案,新增export PATH=<mongodb-install-directory>/bin:$PATH
  • 在根目錄下新增目錄/data/db,因為mongodb的資料儲存預設在該目錄下,如果不建立,則在啟動的時候通過--dbpath來指定
  • 在解壓目錄/bin通過命令./mongod啟動mongodb服務

將MongoDB配置為後臺服務

  • 在安裝目錄下新增mongodb.conf檔案,檔案內容如下:
# 設定MongoDB埠
port=10008
# 設定資料儲存目錄路徑
dbpath=/data/db/
# 設定日誌路徑
logpath=/data/log/mongodb.log
# 日誌檔案是否追加
logappend=true
複製程式碼
  • 在/etc/init.d/目錄下新建檔案mongodb,檔案內容如下
#!/bin/sh
#
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database
# ### BEGIN INIT INFO
# Short-Description: mongodb
# Description: mongo db server
### END INIT INFO

# 將該路徑設定為mongoDB安裝路徑
PROGRAM=<mongodb-install-directory\>/bin/mongod
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in
  start)
     ulimit -n 3000
     echo "Starting MongoDB server"
     # 將該路徑設定為mongoDB安裝路徑
     $PROGRAM --fork --quiet -f <mongodb-install-directory\>/mongodb.conf
     echo "Started MongoDB server"
     ;;
  stop)
     echo "Stopping MongoDB server"
     if [ ! -z "$MONGOPID" ]; then
        kill -15 $MONGOPID
     fi
     echo "Stopped MongoDB server"
     ;;
  status)
     ;;
  *)
     echo "Usage: mongodb {start|stop|status}"
     exit 1
esac

exit 0
複製程式碼
  • 執行命令
chmod +x /etc/init.d/mongodb
chkconfig --add mongodb
chkconfig mongodb on
複製程式碼
  • 執行完命令後,就可以通過service mongodb start/stop來啟動/停止mongoDB了

MongoDB客戶端

在mongoDB安裝目錄/bin下,執行./mongo即可開啟mongoDB客戶端shell,同時也可以下載圖形客戶端,這個網上搜尋有很多,我使用的是Studio 3T。MongoDB預設連線的資料庫是test

MongoDB概念解析

為了方便理解,我們拿SQL中的概念來做對比

SQL概念 MongoDB概念 說明
database database 資料庫
table collection(集合)
row document(文件)
column field(欄位)
index index 索引
table joins 不支援,只能嵌入 表連線
primary key primary key 主鍵,MongoDB自動將_id欄位設定為主鍵

MongoDB資料型別

資料型別 說明
String 字串
Integer 整型
Boolean 布林值
Double 雙精度浮點值
Min/Max keys 將一個值與BSON元素的最低值和最高值相對比
Array 用於將陣列或列表或多個值儲存為一個鍵
Timestamp 時間戳
Object 內嵌文件
Null 空值
Symbol 符號
Date 日期時間
Object ID 物件ID
Binary Data 二進位制資料
Code 程式碼型別
Regular expression 正規表示式型別

MongoDB命令

  • show dbs:顯示所有資料庫的列表
  • db:顯示當前資料庫物件或集合
  • user [database name]:連線到資料庫,如果資料庫不存在則建立資料庫,新建立的資料庫不會顯示,需要新增資料後才會顯示
  • db.dropDatabase():刪除當前資料庫,即先切換到要刪除的資料庫
  • db.[collection.name].drop():刪除集合
  • db.createCollection(name, options):建立集合,name-集合名稱,options-可選引數,可選引數如下
欄位 型別 說明
capped 布林 true-固定集合,如果為true,則必須指定size引數,當達到最大值時,會自動覆蓋最早的文件
autoIndexId 布林 false-預設,true-自動在_id欄位建立索引
size 數字 為固定集合指定一個最大值(按位元組計算)
max 數字 指定固定集合中包含文件的最大數量
  • show collections|show tables:檢視集合
  • db.[collection.name].insert(document):插入文件
  • db.collection.update(,,{upsert:,multi:,writeConcern:}):更新文件,可選引數如下:
    • query:update的查詢條件
    • update:update的物件
    • upsert:這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
    • multi:mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。
    • writeConcern:丟擲異常的級別

Mongo複製集

概述

Mongodb複製集(replica set)由一組Mongod例項(程式)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有資料都寫入Primary,Secondary通過oplog來同步Primary的資料,保證主從節點資料的一致性;複製集在完成主從複製的基礎上,通過心跳機制,一旦Primary節點出現當機,則觸發選舉一個新的主節點,剩下的secondary節點指向新的Primary,時間應該在10-30s內完成感知Primary節點故障,實現高可用資料庫叢集。特點如下:

  • Primary節點是唯一的,但不是固定的
  • 由大多資料原則保證資料的一致性
  • Secondary節點無法寫入(預設情況下,不使用驅動連線時,也是不能查詢的)
  • 相對於傳統的主從結構,複製集可以自動容災

選舉機制

每個節點通過優先順序定義出節點的型別(標準、被動、投票) 標準節點通過對比自身資料進行選舉出primary節點或者secondary節點
影響選舉的因素:

  1. 心跳檢測:複製集內成員每隔兩秒向其他成員傳送心跳檢測資訊,若10秒內無響應,則標記其為不可用
  2. 連線:在多個節點中,最少保證兩個節點為活躍狀態,如果叢集中共三個節點,掛掉兩個節點,那麼剩餘的節點無論狀態是primary還是處於選舉過程中,都會直接被降權為secondary

觸發選舉的情況:

  1. 初始化狀態
  2. 從節點們無法與主節點進行通訊
  3. 主節點辭職 主節點辭職的情況:
  4. 在接收到replSetStepDown命令後
  5. 在現有的環境中,其他secondary節點的資料落後於本身10s內,且擁有更高優先順序
  6. 當主節點無法與群集中多數節點通訊

:當主節點辭職後,主節點將關閉自身所有的連線,避免出現客戶端在從節點進行寫入操作

MongoDB分片

概述

分片是指將資料庫拆分,將其分散在不同的機器上的過程。分片叢集是一種水平擴充套件資料庫系統效能的方法,能夠將資料集分散式儲存在不同的分片上,每個分片只儲存資料集的一部分,MongoDB保證各個分片之間不會有重複的資料,所有分片儲存的資料之和就是完整的資料集。分片叢集將資料集分散式儲存,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分資料,充分利用了各個shard的系統資源,提高資料庫系統的吞吐量。注:在3.2版本後,分片技術必須結合複製集完成

儲存原理

MongoDB淺析

  • Config Server:負責追蹤資料塊在shard上的分佈資訊,每個分片儲存哪些資料塊,叫做分片的後設資料,儲存在config server上的資料庫config中,一般使用3臺config server,所有config server中的config資料必須完全相同
  • Shard Server:資料塊真正存放的單位
  • Mongos Server:資料庫叢集請求的入口,所有的請求都通過mongos進行協調,檢視後設資料,查詢資料塊的存放位置,相當於一個請求分發中心,在生產環境中通常有多個mongos作為請求的入口,提高可用性。
  • 請求示意圖如下:

MongoDB淺析

分片的片鍵

定義:片鍵是文件的一個屬性欄位或是一個複合索引欄位,一旦建立後不可改變,片鍵是拆分資料的關鍵,決定了資料在分片過程中資料的儲存位置。建立片鍵時,需要有一個支撐片鍵執行的索引。
片鍵的分類如下:

  • 遞增片鍵:使用時間戳、日期、自增主鍵,ObjectID,_id等,此類片鍵的寫入操作集中在一個分片伺服器上,寫入不具有分散性,分割容易,但比較容易導致單臺伺服器壓力較大
mongos> use 庫名
mongos> db.集合名.ensureIndex({"鍵名":1})                ##建立索引                
mongos> sh.enableSharding("庫名")                        ##開啟庫的分片
mongos> sh.shardCollection("庫名.集合名",{"鍵名":1})        ##開啟集合的分片並指定片鍵
複製程式碼
  • 雜湊片鍵:使用一個雜湊索引欄位作為片鍵,使資料在各節點分佈比較均勻,但是無法實現範圍區分
mongos> use 庫名
mongos> db.集合名.ensureIndex({"鍵名":"hashed"})                ##建立索引                
mongos> sh.enableSharding("庫名")                        ##開啟庫的分片
mongos> sh.shardCollection("庫名.集合名",{"鍵名":1})        ##開啟集合的分片並指定片鍵
複製程式碼
  • 組合片鍵:資料庫中沒有比較合適的鍵值供片鍵選擇,可以選另一個欄位使用組合片鍵,甚至可以新增冗餘欄位來組合
  • 標籤片鍵:資料儲存在指定的分片伺服器上,可以為分片新增tag標籤,然後指定相應的tag

MongoDB備份與恢復

mongodump -h dbhost -d dbname -o dbdirectory:

  • -h MongoDB所在伺服器地址
  • -d 需要備份的資料庫例項
  • -o 備份的資料存放位置

mongorestore -h <:port> -d dbname

  • -h MongoDB所在伺服器地址
  • -d 需要恢復的資料庫例項
  • path 設定備份資料所在位置

MongoDB與Spring Boot整合

  1. 引入jar包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
複製程式碼
  1. 新增配置
spring:
  data:
    mongodb:
      host: 127.0.0.1
      port: 10008
      database: test
複製程式碼
  1. 在程式碼中引入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
複製程式碼

更多詳情請參考專案https://github.com/xsj1987/mongodb-test

MongoDB監控

在安裝目錄/bin/下有兩個命令可以用來監控

  • mongostat:通過間隔固定時間獲取mongodb的當前執行狀態
  • mongotop:用來跟蹤一個MongoDB例項,提供每個集合的水平的統計資料