
MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統,旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介于??關系數據庫???和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。它支持的數據結構非常松散,是類似??json???的??bson???格式,因此可以存儲比較復雜的數據類型。
(1)優點
Json的數據格式本身就便于開發,而且支持多種編程語言(eg:Java、Python、C、C++、go等)水平擴展可以應對高并發。通過增加服務器數量來對數據庫擴容支持高可用。MongoDB的復制工具稱為副本集(replica set),它包含提供自動故障轉移和數據同步。靈活的數據模型。這意味著沒有預定義的模式,并且文檔可以基于任何鍵保存任何值集合。而Mysql需要事先建庫建表、定義表結構、字段、數據類型等,數據結構是相對固定的。表結構一旦有調整,里面的數據就會受影響(2)缺點
【資料圖】
SQL術語/概念? | MongoDB術語/概念? | 解釋/說明? |
database? | database? | 數據庫? |
table? | collection? | 數據庫表/集合? |
row? | document? | 數據記錄行/文檔? |
column? | field/key? | 數據字段(列)/(域)鍵? |
index? | index? | 索引? |
value? | value? | 值? |
table joins? | 表連接,MongoDB不支持? | |
primary key? | primary key? | 主鍵,MongoDB自動將_id字段設置為主鍵? |
基于Ubuntu 20.04操作系統,采用軟件包形式安裝MongoDB
#導入公鑰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
#日志配置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
3.還可以用可視化界面MongoDB Compass進行管理。默認端口27017可以不寫
#顯示數據庫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})
MongoDB默認無用戶名和密碼,即無權限訪問限制。為了便于數據庫的管理和對安全的考慮,宜啟用認證和創建數據庫用戶
在mongod.conf做如下配置:
security: authorization: enabled
之后重啟mongod
#先進入驗證庫,創建用戶的同時完成授權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的相關配置,重啟服務后再去創建用戶。創建成功再將配置文件的驗證功能打開
常用角色? | 權限說明? |
Read? | 允許用戶讀取指定數據庫? |
readWrite? | 允許用戶讀寫指定數據庫? |
dbAdmin? | 允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile? |
userAdmin? | 允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶? |
clusterAdmin? | 只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。? |
readAnyDatabase? | 只在admin數據庫中可用,賦予用戶所有數據庫的讀權限? |
readWriteAnyDatabase? | 只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限? |
userAdminAnyDatabase? | 只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限? |
dbAdminAnyDatabase? | 只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。? |
root? | 只在admin數據庫中可用。超級賬號,超級權限? |
類似于Redis的主從+哨兵,它也是一個主從+高可用的實現方案。MongoDB復制集是將數據同步在多個服務器的過程。它在多個服務器上存儲數據副本,保證數據的安全性。
一主兩從,主節點負責處理客戶端請求,從節點復制主節點的數據。由于寫入操作都在主節點上,因此增加節點不會提升寫的性能,只會提升讀性能。當主節點發生故障時,自動選舉出新的從節點,實現故障轉移。
成員? | 說明? |
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節點的數據來恢復到之前的時間點。? |
讀寫模式? | 說明? |
primary? | 主節點,默認模式,讀操作只在主節點。主節點不可用則報錯? |
primaryPreferred? | 首選主節點,大多數情況下讀操作在主節點。如果主節點不可用(如故障轉移),讀操作在從節點? |
secondary? | 從節點,讀操作只在從節點。從節點不可用則報錯? |
secondaryPreferred? | 首選從節點,大多數情況下讀操作在從節點。特殊情況(如單主架構)讀操作在主節點? |
nearest? | 通過ping探測出最鄰近節點。讀請求發送到最近的可達節點,可能是主節點或從節點? |
使用三臺機器(基于Ubuntu20.04)部署mongod,在配置文件中添加如下內容:
replication: replSetName: myrepl指定復制集名稱,三臺機器保持一致
之后重啟Mongod
進入任意一臺機器的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說明該節點服務異常,否則節點服務正常。
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)
#進入當前主節點,先刪除節點再添加仲裁節點rs.remove("192.168.1.105:27017")rs.addArb("192.168.1.105:27017")
它可以實現邏輯備份,類似于mysqldump,可以導出json或csv格式的文件。只針對單表導出/導入,不支持庫的導出/導入。 應用場景:
異構平臺遷移,比如Mysql和MongoDBMongoDB跨版本的數據導入導出,比如MongoDB 5 à MongoDB 6它可以實現物理備份,日常備份使用。導出的是二進制文件(bson格式)。
Mongodump可以在mongodb運行時進行備份。其工作原理是對運行的mongodb作查詢,將所有查到的文檔寫入磁盤,但是產生的備份不一定是實時快照
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