MongoDB的學習&復制集搭建

2023-01-03 15:22:03 來源:51CTO博客

一、MongoDB介紹

1.1 簡介

MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統,旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介于??關系數據庫???和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。它支持的數據結構非常松散,是類似??json???的??bson???格式,因此可以存儲比較復雜的數據類型。

1.2 主要用途

網站數據(eg:銀行、保險公司的流水信息)。MongoDB 非常適合實時的插入、更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性緩存。由于性能很高,MongoDB 也適合作為信息基礎設施的緩存層。在系統重啟之后,由MongoDB 搭建的持久化緩存層可以避免下層的數據源過載。高伸縮性。MongoDB 非常適合由數十或數百臺服務器組成的數據庫,MongoDB 的路線圖中已經包含對MapReduce 引擎的內置支持。用于對象及json數據的存儲。MongoDB的bson數據格式非常適合文檔化格式的存儲及查詢。

1.3 優缺點

(1)優點

Json的數據格式本身就便于開發,而且支持多種編程語言(eg:Java、Python、C、C++、go等)水平擴展可以應對高并發。通過增加服務器數量來對數據庫擴容支持高可用。MongoDB的復制工具稱為副本集(replica set),它包含提供自動故障轉移和數據同步。靈活的數據模型。這意味著沒有預定義的模式,并且文檔可以基于任何鍵保存任何值集合。而Mysql需要事先建庫建表、定義表結構、字段、數據類型等,數據結構是相對固定的。表結構一旦有調整,里面的數據就會受影響

(2)缺點


【資料圖】

不支持事務操作無法進行關聯表查詢

1.4 MongoDB與關系型數據庫的對比

1.5 什么時候會用MongoDB(應用特征)

數據量有億萬級別或需要不斷擴容?系統需要大量的地理位置查詢或文本查詢應用需要99.999%高可用新應用,需求會變,數據模型無法確定需要2000~3000及以上的讀寫qps

1.6 MongoDB的實際應用案例

游戲場景。使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新物流場景。使用 MongoDB 存儲訂單信息,訂單狀態在運送過程中會不斷更新,以 MongoDB 內嵌數組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來。?社交場景。使用 MongoDB 存儲存儲用戶信息,以及用戶發表的朋友圈信息,通過地理位置索引實現附近的人、地點等功能?物聯網場景。使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,并對這些信息進行多維度的分析?視頻直播。使用 MongoDB 存儲用戶信息、禮物信息等

1.7 MongoDB與Mysql的邏輯結構對比

SQL術語/概念?

MongoDB術語/概念?

解釋/說明?

database?

database?

數據庫?

table?

collection?

數據庫表/集合?

row?

document?

數據記錄行/文檔?

column?

field/key?

數據字段(列)/(域)鍵?

index?

index?

索引?

value?

value?

值?

table joins?

表連接,MongoDB不支持?

primary key?

primary key?

主鍵,MongoDB自動將_id字段設置為主鍵?

二、MongoDB部署

2.1 環境介紹

基于Ubuntu 20.04操作系統,采用軟件包形式安裝MongoDB

2.2 安裝

#導入公鑰wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -#配置倉庫文件echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list#更新安裝源apt-get -y update#安裝apt-get -y install mongodb-org#將配置文件/etc/mongod.conf的綁定IP改為0.0.0.0,之后啟動systemctl enable --now mongod#安裝mongo客戶端工具apt-get -y install mongodb-clientsapt-get -y install mongodb-mongosh

2.3 mongod配置文件詳解

#日志配置systemLog: destination: file日志位置 path: "/var/log/mongodb/mongodb.log"追加 logAppend: true#存儲配置storage:數據路徑 dbPath: "/var/lib/mongodb"#進程控制processManagement:后臺守護進程 fork: true#網絡配置net: bindIp: 0.0.0.0 port: 27017#安全驗證配置security:#是否打開用戶名密碼驗證,默認此項為關掉   authorization: enabled

三、客戶端連接

MongoMongosh。簡單的理解為Mongo的加強版

3.還可以用可視化界面MongoDB Compass進行管理。默認端口27017可以不寫

四、MongoDB管理

4.1 MongoDB數據庫操作

MongoDB默認存在的庫admin庫:系統預留庫,MondoDB系統管理庫local庫:本地預留庫,存儲日志config庫:MongoDB配置信息庫test庫:登錄時默認存在的測試庫庫的相關命令?
#顯示數據庫show dbs#查看當前所在的數據庫db#利用use自動建庫。如果庫內無數據,在不使用時會刪除數據庫use xxx#刪除當前所在庫,狀態為1表示刪除成功db.dropDatabase()

3.表的相關命令?

#當插入一個文檔的時候,一個集合就會自動創建。這里people為集合名,也可以結合for循環做批量添加文檔use xxxdb.people.insert({name:”li”})#查看庫中的集合列表show tablesshow collections#查看集合信息db.people.stats()#刪除集合db.people.drop()

4.數據相關命令?

#數據錄入db.people.insert({name:”li”})db.people.insertone({name:”zhang”})#查詢數據行數db.people.count()#全表查詢,默認每頁顯示20行。按it繼續顯示后面的內容db.people.find()#只顯示前n個數據db.people.find.limit(n)#跳過前面n個顯示后面的數據db.people.find.skip(n)#刪除集合中指定內容db.people.remove({name:”wang”})#刪除集合內所有數據,但表還存在db.people.remove({})#設置每頁顯示n條記錄DBQuery.shllBatchsize=n#按照條件查詢db.people.find({uid: 10})#刪除指定的文檔db.people.remove({uid: 10})#修改文檔,如果沒有加multi: true,默認只修改第一個符合條件的文檔db.people.update({uid: 1},{$set:{age: 20}},{multi: true})

4.2 用戶及權限管理

MongoDB默認無用戶名和密碼,即無權限訪問限制。為了便于數據庫的管理和對安全的考慮,宜啟用認證和創建數據庫用戶

4.2.1 關于用戶驗證庫

創建用戶時,use所在的庫即為用戶的驗證庫登錄時必須指定驗證庫才能登錄(即用戶名+主機+密碼+驗證庫)一個數據庫可成為多個用戶的驗證庫,但一個用戶只能使用一個驗證庫對于管理員用戶,必須在admin下創建,即管理員用的驗證庫是admin普通用戶的驗證庫一般是所管理的庫如果直接登錄到數據庫,不進行use,默認的驗證庫是test從3.6版本開始,配置文件不添加bindIp參數時,默認不允許遠程登錄,只能本地管理員登錄

4.2.2 開啟用戶認證

在mongod.conf做如下配置:

security:  authorization: enabled

之后重啟mongod

4.2.3 用戶管理

#先進入驗證庫,創建用戶的同時完成授權use testdb.createUser(  {    user: "myTester",    pwd:  passwordPrompt(),   // or cleartext password    roles: [ { role: "readWrite", db: "test" },             { role: "read", db: "reporting" } ]  })

以上操作的含義是創建一個myTester用戶,需要交互輸入密碼,針對test數據庫有讀寫權限,針對reporting數據庫只有讀權限

另外使用passwordPrompt()可避免密碼在屏幕中顯示。

創建超級管理員可以管理數據庫,需要進入admin庫再創建。因為超級用戶的信息存放于admin庫。命令如下:

use admindb.createUser({user: "root",pwd: passwordPrompt(),roles: [{role: "root",db: "admin"}]})

#驗證用戶

#交互式驗證use admindb.auth("root","xxxxxx")#非交互式驗證,不寫驗證庫則登錄后在test庫而非adminmongosh -u root -p xxx adminmongosh -u root -p xxx 192.168.1.103/admin

#查看當前庫中用戶

use testdb.getUsers()

#用超級管理員查詢所有用戶信息

use admindb.system.users.find()

#刪除用戶。以管理員身份登錄,需要進入被刪除用戶的驗證庫

use testdb.dropUser("xxx")

注意:如果創建用戶有問題,就先注釋掉mongod.conf的security的相關配置,重啟服務后再去創建用戶。創建成功再將配置文件的驗證功能打開

4.2.4 用戶權限說明

常用角色?

權限說明?

Read?

允許用戶讀取指定數據庫?

readWrite?

允許用戶讀寫指定數據庫?

dbAdmin?

允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile?

userAdmin?

允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶?

clusterAdmin?

只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。?

readAnyDatabase?

只在admin數據庫中可用,賦予用戶所有數據庫的讀權限?

readWriteAnyDatabase?

只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限?

userAdminAnyDatabase?

只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限?

dbAdminAnyDatabase?

只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。?

root?

只在admin數據庫中可用。超級賬號,超級權限?

五、MongoDB復制集

5.1 介紹

類似于Redis的主從+哨兵,它也是一個主從+高可用的實現方案。MongoDB復制集是將數據同步在多個服務器的過程。它在多個服務器上存儲數據副本,保證數據的安全性。

5.2 復制集架構

一主兩從,主節點負責處理客戶端請求,從節點復制主節點的數據。由于寫入操作都在主節點上,因此增加節點不會提升寫的性能,只會提升讀性能。當主節點發生故障時,自動選舉出新的從節點,實現故障轉移。

5.3 復制集中的成員說明

成員?

說明?

Secondary?

正常情況下,復制集的Secondary會參與Primary選舉(自身也可能會被選為Primary),并從Primary同步最新寫入的數據,以保證與Primary存儲相同的數據。Secondary可以提供讀服務,增加Secondary節點可以提供復制集的讀服務能力,同時提升復制集的可用性。另外,Mongodb支持對復制集的Secondary節點進行靈活的配置,以適應多種場景的需求。?

Arbiter?

Arbiter節點只參與投票,不能被選為Primary,并且不從Primary同步數據。比如你部署了一個2個節點的復制集,1個Primary,1個Secondary,任意節點宕機,復制集將不能提供服務了(無法選出Primary),這時可以給復制集添加一個Arbiter節點,即使有節點宕機,仍能選出Primary。Arbiter本身不存儲數據,是非常輕量級的服務,當復制集成員為偶數時,最好加入一個Arbiter節點,以提升復制集可用性。?

Priority0?

默認Priority為1,值越大優先級越高。設置Priority0節點的選舉優先級為0,則不會被選舉為Primary,只能投票。比如你跨機房A、B部署了一個復制集,并且想指定Primary必須在A機房,這時可以將B機房的復制集成員Priority設置為0,這樣Primary就一定會是A機房的成員。(注意:如果這樣部署,最好將『大多數』節點部署在A機房,否則網絡分區時可能無法選出Primary)?

Vote0?

Mongodb 3.0里,復制集成員最多50個,參與Primary選舉投票的成員最多7個,其他成員(Vote0)的vote屬性必須設置為0,即不參與投票。?

Hidden?

Hidden節點不能被選為主(Priority為0),并且對Driver不可見。因Hidden節點不會接受Driver的請求,可使用Hidden節點做一些數據備份、離線計算的任務,不會影響復制集的服務。?

Delayed?

Delayed節點必須是Hidden節點,并且其數據落后與Primary一段時間(可配置,比如1個小時)。因Delayed節點的數據比Primary落后一段時間,當錯誤或者無效的數據寫入Primary時,可通過Delayed節點的數據來恢復到之前的時間點。?

5.4 復制集的讀寫設置

讀寫模式?

說明?

primary?

主節點,默認模式,讀操作只在主節點。主節點不可用則報錯?

primaryPreferred?

首選主節點,大多數情況下讀操作在主節點。如果主節點不可用(如故障轉移),讀操作在從節點?

secondary?

從節點,讀操作只在從節點。從節點不可用則報錯?

secondaryPreferred?

首選從節點,大多數情況下讀操作在從節點。特殊情況(如單主架構)讀操作在主節點?

nearest?

通過ping探測出最鄰近節點。讀請求發送到最近的可達節點,可能是主節點或從節點?

5.5 復制集部署

使用三臺機器(基于Ubuntu20.04)部署mongod,在配置文件中添加如下內容:

replication: replSetName: myrepl指定復制集名稱,三臺機器保持一致

之后重啟Mongod

5.6 配置復制集:一主兩從

進入任意一臺機器的mongo客戶端執行如下操作:

#指定復制集的所有成員信息cnotallow={_id: "myrepl", members: [{_id: 0, host: "192.168.1.103:27017"}, {_id: 1, host: "192.168.1.104:27017"}, {_id: 2, host: "192.168.1.105:27017"}]}#初始化并啟動復制集rs.initiate(config)

可以用rs.status()查看復制集狀態。如果health的值為0說明該節點服務異常,否則節點服務正常。

5.7 配置復制集:一主一從一Arbiter

config={_id: "myrepl", members: [{_id: 0, host: "192.168.1.103:27017"}, {_id: 1, host: "192.168.1.104:27017"}, {_id: 2, host: "192.168.1.105:27017", "arbiterOnly": true}]}rs.initiate(config)

5.8 修改已有集群為一主一從一Arbiter

#進入當前主節點,先刪除節點再添加仲裁節點rs.remove("192.168.1.105:27017")rs.addArb("192.168.1.105:27017")

六、MongoDB備份恢復

6.1 備份恢復工具介紹

6.1.1 mongoexport/mongoimport說明

它可以實現邏輯備份,類似于mysqldump,可以導出json或csv格式的文件。只針對單表導出/導入,不支持庫的導出/導入。 應用場景:

異構平臺遷移,比如Mysql和MongoDBMongoDB跨版本的數據導入導出,比如MongoDB 5 à MongoDB 6

6.1.2 mongodump/mongorestore說明

它可以實現物理備份,日常備份使用。導出的是二進制文件(bson格式)。

Mongodump可以在mongodb運行時進行備份。其工作原理是對運行的mongodb作查詢,將所有查到的文檔寫入磁盤,但是產生的備份不一定是實時快照

6.2 備份命令

Mongodump/mongorestore做備份和恢復操作如下:

mongodump --collection students --db test
mongorestore -d test dump/test/students.bson

Mongoexport/mongoimport做備份和恢復操作如下:

mongoexport -d test -c students -o backup.jsonmongoimport -d test -c students backup.json

標簽: 配置文件 創建用戶 關系數據庫

上一篇:即時:【深入淺出Sentinel原理及實戰】「基礎實戰專題」零基礎實現服務流量控制實戰開發指南(2)
下一篇:【全球聚看點】編程初學者:關于我學習編程這件事