MongoDB集群部署

一. 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ù)庫的:

  1. 模式自由 :可以把不同結(jié)構(gòu)的文檔存儲在同一個數(shù)據(jù)庫里

  2. 面向集合的存儲:適合存儲 JSON風(fēng)格文件的形式,

  3. 完整的索引支持:對任何屬性可索引,

  4. 復(fù)制和高可用性:支持服務(wù)器之間的數(shù)據(jù)復(fù)制,支持主-從模式及服務(wù)器之間的相互復(fù)制。復(fù)制的主要目的是提供冗余及自動故障轉(zhuǎn)移。

  5. 自動分片:支持云級別的伸縮性:自動分片功能支持水平的數(shù)據(jù)庫集群,可動態(tài)添加額外的機(jī)器。

  6. 豐富的查詢:支持豐富的查詢表達(dá)方式,查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中的內(nèi)嵌的對象及數(shù)組。

  7. 快速就地更新:查詢優(yōu)化器會分析查詢表達(dá)式,并生成一個高效的查詢計(jì)劃。

  8. 高效的傳統(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):

    1. 主節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的寫入和更新,并在更新數(shù)據(jù)的同時,將操作信息寫入名為 oplog 的日志文件當(dāng)中

    2. 主節(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)

image-20210310135432516

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)行聚合并返回客戶端

image-20210310141049537

三. 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

3.2 分片集群部署

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)據(jù)副本 MongoDB中的一組副本是一群mongod進(jìn)程,這些進(jìn)程維護(hù)同樣的數(shù)據(jù)集。副本集提供了冗余和高可用性,...
    宇哥聊AI閱讀 661評論 1 11
  • 來自公眾號:馬哥Linux運(yùn)維作者:趙峰峰 mongodb是最常用的nosql數(shù)據(jù)庫,在數(shù)據(jù)庫排名中已經(jīng)上升到了前...
    碼農(nóng)小光閱讀 522評論 0 2
  • 數(shù)據(jù)副本 MongoDB中的一組副本是一群mongod進(jìn)程,這些進(jìn)程維護(hù)同樣的數(shù)據(jù)集。副本集提供了冗余和高可用性,...
    大蟒傳奇閱讀 2,733評論 4 16
  • 本人博客同步發(fā)表,排版更佳本文主要介紹MongoDB集群部署的過程,對于其中涉及的組件概念,不做解釋。 服務(wù)器規(guī)劃...
    峰巢閱讀 1,892評論 0 7
  • Mongodb分片概括 分片在多臺服務(wù)器上分布數(shù)據(jù)的方法, Mongodb使用分片來支持具有非常大的數(shù)據(jù)集和高吞吐...
    平凡的運(yùn)維之路閱讀 14,319評論 0 7

友情鏈接更多精彩內(nèi)容