一. MongoDB簡介
MongoDB 是一個基于分布式文件存儲的面向文檔的、NoSQL、內(nèi)存數(shù)據(jù)庫,是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的:
模式自由 :可以把不同結(jié)構(gòu)的文檔存儲在同一個數(shù)據(jù)庫里
面向集合的存儲:適合存儲 JSON風(fēng)格文件的形式,
完整的索引支持:對任何屬性可索引,
復(fù)制和高可用性:支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目的是提供冗余及自動故障轉(zhuǎn)移。
自動分片:支持云級別的伸縮性:自動分片功能支持水平的數(shù)據(jù)庫集群,可動態(tài)添加額外的機(jī)器。
豐富的查詢:支持豐富的查詢表達(dá)方式,查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中的內(nèi)嵌的對象及數(shù)組。
快速就地更新:查詢優(yōu)化器會分析查詢表達(dá)式,并生成一個高效的查詢計(jì)劃。
高效的傳統(tǒng)存儲方式:支持二進(jìn)制數(shù)據(jù)及大型對象(如照片或圖片)
MongoDB與關(guān)系型數(shù)據(jù)庫的對照關(guān)系:
| RDBMS概念 | MongoDB概念 | 說明 |
|---|---|---|
| database | database | 數(shù)據(jù)庫 |
| table | collection | 數(shù)據(jù)庫表/集合 |
| row | document | 行數(shù)據(jù)/文檔 |
| column | field | 字段 |
| index | index | 索引 |
| table joins | aggregate + $lookup | MongoDB 3.2 版本過后,我們可以使用 $lookup 進(jìn)行連表查詢 |
| 嵌入文檔 | MongoDB可以通過嵌入文檔,實(shí)現(xiàn)表連接的功能 | |
| primary key | primary key | 主鍵,mysql中建表時指定,MongoDB自動將_id自動設(shè)置為主鍵 |
二. MongoDB的集群方案
MongoDB 有三種集群部署模式,分別為:主從復(fù)制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)
實(shí)際生產(chǎn)環(huán)境中,通常將 Replica Set 和 Sharding 兩種技術(shù)結(jié)合使用:每個分片上部署一個副本集
2.1 主從復(fù)制(不推薦)
MongoDB 官方建議用副本集替代主從復(fù)制
主從復(fù)制是 MongoDB 中最簡單的數(shù)據(jù)庫同步備份的集群技術(shù),其基本的設(shè)置方式是建立一個主節(jié)點(diǎn)、和一個或多個從節(jié)點(diǎn):
-
一個主節(jié)點(diǎn)(Primary):
提供所有的增、刪、查、改服務(wù);主節(jié)點(diǎn)要記錄所有操作;當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時,只能人工介入,指定新的主節(jié)點(diǎn),從節(jié)點(diǎn)不會自動升級為主節(jié)點(diǎn);主節(jié)點(diǎn)故障時,該集群架構(gòu)只能處于只讀狀態(tài)
-
一個/多個從節(jié)點(diǎn)(Secondary):
默認(rèn)不提供任務(wù)服務(wù),也可以通過設(shè)置使從節(jié)點(diǎn)提供查詢服務(wù);從節(jié)點(diǎn)要知道主節(jié)點(diǎn)的地址;從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)記錄的操作,并在本節(jié)點(diǎn)執(zhí)行
2.2 副本集(Replica Set)
類似'主從復(fù)制',為一主多從的架構(gòu),主要區(qū)別在于:主節(jié)點(diǎn)發(fā)生故障時,副本集可以自動投票,選舉出新的主節(jié)點(diǎn),即 副本集是自帶故障轉(zhuǎn)移功能的主從復(fù)制
Replica Set 使用的是 N 個 mongod 節(jié)點(diǎn)構(gòu)建的具備自動容錯功能、自動恢復(fù)功能的高可用方案:
-
一個主節(jié)點(diǎn)(Primary):
主節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的寫入和更新,并在更新數(shù)據(jù)的同時,將操作信息寫入名為 oplog 的日志文件當(dāng)中
主節(jié)點(diǎn)還負(fù)責(zé)指定其他節(jié)點(diǎn)為從節(jié)點(diǎn),并設(shè)置從節(jié)點(diǎn)數(shù)據(jù)的可讀性,從而讓從節(jié)點(diǎn)來分擔(dān)集群讀取數(shù)據(jù)的壓力
-
多個從節(jié)點(diǎn)(Secondary):
從節(jié)點(diǎn)會定時輪詢讀取 oplog 日志,根據(jù)日志內(nèi)容同步更新自身的數(shù)據(jù),保持與主節(jié)點(diǎn)一致
-
仲裁節(jié)點(diǎn)(Arbiter):
該類節(jié)點(diǎn)可以不用單獨(dú)存在,如果配置為仲裁節(jié)點(diǎn),就主要負(fù)責(zé)在復(fù)本集中監(jiān)控其他節(jié)點(diǎn)狀態(tài),投票選出主節(jié)點(diǎn);仲裁節(jié)點(diǎn)不會用于存放數(shù)據(jù);如果沒有仲裁節(jié)點(diǎn),那么投票工作將由所有節(jié)點(diǎn)共同進(jìn)行
-
無效節(jié)點(diǎn)(Down):
當(dāng)服務(wù)器掛掉或掉線時就會處于該狀態(tài)

2.3 分片(Sharding)
Sharding模式,通過將數(shù)據(jù)分開存儲,不同服務(wù)器保存不同的數(shù)據(jù)(
所有服務(wù)器數(shù)據(jù)的總和即為整個數(shù)據(jù)集),來實(shí)現(xiàn)處理大量數(shù)據(jù)。幾個核心詞匯掃盲:
- mongod:核心數(shù)據(jù)庫進(jìn)程,是mongoDB的核心守護(hù)進(jìn)程,用于處理數(shù)據(jù)請求、管理數(shù)據(jù)訪問、執(zhí)行后臺管理操作
- mongos:
MongoDB Shard Utility,分片群集的控制器和查詢路由器
- mongo:交互式MongoDB Shell
構(gòu)建一個 MongoDB 的分片集群,需要三個重要的組件,分別是分片服務(wù)器、配置服務(wù)器和路由服務(wù)器
-
分片服務(wù)器(Shard Server)
即一個
mongod數(shù)據(jù)庫實(shí)例,用于存儲實(shí)際的數(shù)據(jù)塊;在實(shí)際生產(chǎn)中,一個 Shard Server 可由幾臺機(jī)器組成一個副本集來承擔(dān),防止因主節(jié)點(diǎn)單點(diǎn)故障導(dǎo)致整個系統(tǒng)崩潰 -
配置服務(wù)器(Config Server)
即一個獨(dú)立的
mongod進(jìn)程,保存集群和分片的元數(shù)據(jù),在集群啟動最開始時建立,保存各個分片包含數(shù)據(jù)的信息 -
路由服務(wù)器(Route Server)
即一個獨(dú)立的
mongos進(jìn)程,在集群中可作為路由使用,客戶端由此接入,讓整個集群看起來像是一個單一的數(shù)據(jù)庫,提供客戶端應(yīng)用程序和分片集群之間的接口;Route Server 本身不保存數(shù)據(jù),啟動時從 Config Server 加載集群信息到緩存中,并將客戶端的請求路由給每個 Shard Server,在各 Shard Server 返回結(jié)果后進(jìn)行聚合并返回客戶端

三. Mongo集群部署
3.1 簡單副本集部署
1)下載&解壓
cd /usr/local/mongodb/
# 下載
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz
# 復(fù)制至其他服務(wù)器
scp -P ${ssh端口} /usr/local/mongodb-linux-x86_64-4.0.0.tgz ${用戶名}@${主機(jī)}:/usr/local
# 解壓
tar -zxvf mongodb-linux-x86_64-4.0.0.tgz
# 將解壓包拷貝到指定目錄
mv mongodb-linux-x86_64-4.0.0/ /usr/local/mongodb
# 構(gòu)建軟連接
ln -s /usr/local/mongodb/bin/mongod /usr/bin/
ln -s /usr/local/mongodb/bin/mongo /usr/bin/
2)修改配置
# 創(chuàng)建相關(guān)存儲目錄
cd /usr/local/mongodb
# 創(chuàng)建db存放目錄
mkdir -p ./data/db
# 創(chuàng)建日志存放目錄
mkdir -p ./logs
# 利用touch命令創(chuàng)建空白日志文件
touch ./logs/mongodb.log
vim mongodb.conf
########### 編輯mongodb配置文件 ###########
#端口號
port=27017
#db目錄
dbpath=/usr/local/mongodb/data/db
#日志目錄
logpath=/usr/local/mongodb/logs/mongodb.log
#kfile地址
keyFile=/data/mongodb/mongodb-keyfile
#日志增加而不是覆蓋
logappend=true
#進(jìn)程ID文件路徑
pidfilepath=/var/run/mongod.pid
#允許遠(yuǎn)程IP連接
bind_ip=0.0.0.0
#操作日志大小
oplogSize=10000
#是否后臺運(yùn)行 進(jìn)程在后臺運(yùn)行的守護(hù)進(jìn)程模式
fork=true
#開啟用戶認(rèn)證
#auth=true
3)創(chuàng)建副本集認(rèn)證key文件
# 創(chuàng)建目錄
mkdir -p /data/mongodb
# 創(chuàng)建key文件
openssl rand -base64 741 > /data/mongodb/mongodb-keyfile
# 復(fù)制key文件至其他服務(wù)器
scp -P ${ssh端口} /data/mongodb/mongodb-keyfile ${用戶名}@${主機(jī)}:/home/weihu/
scp -P ${ssh端口} /data/mongodb/mongodb-keyfile ${用戶名}@${主機(jī)}:/home/weihu/
# 移動至指定目錄
mv /home/weihu/mongodb-keyfile /data/mongodb/mongodb-keyfile
# 修改成 600 的文件屬性
chmod 600 /data/mongodb/mongodb-keyfile
4)啟動服務(wù)
# 啟動服務(wù)
mongod -f /usr/local/mongodb/mongodb.conf
5)組建副本集
# 選擇admin數(shù)據(jù)庫
use admin
# 創(chuàng)建配置項(xiàng)
config = {_id: 'replSet', members: [{_id: 0, host: '172.17.0.3:27018'},{_id: 1, host: '172.17.0.4:27018'},{_id: 2, host:'172.17.0.5:27018'}]}
{
"_id" : "replSet",
"members" : [
{
"_id" : 0,
"host" : "${主機(jī)1}:27018"
},
{
"_id" : 1,
"host" : "${主機(jī)2}:27018"
},
{
"_id" : 2,
"host" : "${主機(jī)3}:27018"
}
]
}
# 初始化副本集:返回{ "ok" : 1 }即成功
rs.initiate(config)
# 查看副本集狀態(tài),找到primary節(jié)點(diǎn)的IP
rs.status()
6)創(chuàng)建帳戶密碼
# 連接主節(jié)點(diǎn)
mongo --port 27018
# 切換數(shù)據(jù)庫
use admin
#創(chuàng)建分配用戶權(quán)限的帳戶:admin
db.createUser(
{
user: "admin",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)
# 驗(yàn)證
db.auth('admin', '123456')
# 查詢用戶
show users
db.system.users.find()
#沒有則創(chuàng)建mytest數(shù)據(jù)庫
use mytest
# 創(chuàng)建數(shù)據(jù)庫用戶
db.createUser({user:"mytest",pwd:"mytest",roles:[{role:"dbOwner",db:"mytest"}]})
7)設(shè)置開機(jī)啟動
vi /etc/rc.d/rc.local #加入下面的自啟動腳本
/root/mongodb/bin/mongod -f /root/mongodb/mongo.conf
8)測試驗(yàn)證
# 連接服務(wù)
/usr/local/mongodb/bin/mongo
# 測試
show dbs