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節點
影響選舉的因素:
- 心跳檢測:複製集內成員每隔兩秒向其他成員傳送心跳檢測資訊,若10秒內無響應,則標記其為不可用
- 連線:在多個節點中,最少保證兩個節點為活躍狀態,如果叢集中共三個節點,掛掉兩個節點,那麼剩餘的節點無論狀態是primary還是處於選舉過程中,都會直接被降權為secondary
觸發選舉的情況:
- 初始化狀態
- 從節點們無法與主節點進行通訊
- 主節點辭職 主節點辭職的情況:
- 在接收到replSetStepDown命令後
- 在現有的環境中,其他secondary節點的資料落後於本身10s內,且擁有更高優先順序
- 當主節點無法與群集中多數節點通訊
注:當主節點辭職後,主節點將關閉自身所有的連線,避免出現客戶端在從節點進行寫入操作
MongoDB分片
概述
分片是指將資料庫拆分,將其分散在不同的機器上的過程。分片叢集是一種水平擴充套件資料庫系統效能的方法,能夠將資料集分散式儲存在不同的分片上,每個分片只儲存資料集的一部分,MongoDB保證各個分片之間不會有重複的資料,所有分片儲存的資料之和就是完整的資料集。分片叢集將資料集分散式儲存,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分資料,充分利用了各個shard的系統資源,提高資料庫系統的吞吐量。注:在3.2版本後,分片技術必須結合複製集完成
儲存原理
- Config Server:負責追蹤資料塊在shard上的分佈資訊,每個分片儲存哪些資料塊,叫做分片的後設資料,儲存在config server上的資料庫config中,一般使用3臺config server,所有config server中的config資料必須完全相同
- Shard Server:資料塊真正存放的單位
- Mongos Server:資料庫叢集請求的入口,所有的請求都通過mongos進行協調,檢視後設資料,查詢資料塊的存放位置,相當於一個請求分發中心,在生產環境中通常有多個mongos作為請求的入口,提高可用性。
- 請求示意圖如下:
分片的片鍵
定義:片鍵是文件的一個屬性欄位或是一個複合索引欄位,一旦建立後不可改變,片鍵是拆分資料的關鍵,決定了資料在分片過程中資料的儲存位置。建立片鍵時,需要有一個支撐片鍵執行的索引。
片鍵的分類如下:
- 遞增片鍵:使用時間戳、日期、自增主鍵,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整合
- 引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
複製程式碼
- 新增配置
spring:
data:
mongodb:
host: 127.0.0.1
port: 10008
database: test
複製程式碼
- 在程式碼中引入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
複製程式碼
更多詳情請參考專案https://github.com/xsj1987/mongodb-test
MongoDB監控
在安裝目錄/bin/下有兩個命令可以用來監控
- mongostat:通過間隔固定時間獲取mongodb的當前執行狀態
- mongotop:用來跟蹤一個MongoDB例項,提供每個集合的水平的統計資料