MongoDB基礎
一、MongoDB概述
1、非關係型數據庫
(1)存儲數據不以關係型模型爲依據,不需要固定的格式表。非關係型數據庫作爲關係型數據庫的一個補充,在日益發展的網站時代,發揮着高效與高性能。
(2)優點
①數據庫高併發讀寫
②對海量數據高效率存儲與訪問
③數據庫高擴展性與高可用性
(3)常用非關係型數據庫
①MongoDB
②Memcache
③Redis
④HBase
2、MongoDB簡介
(1)一款跨平臺、面向文檔的數據庫。可實現高性能、高可用性,並且能夠輕鬆擴展
(2)是一個介於關係型數據庫和非關係型數據庫之間的產品,是非關係型數據庫當中功能最豐富,最像關係型數據庫的
(3)不採用關係模型,主要是爲了獲得更好的擴展性,它不再有行的概念,運行方式主要基於兩個概念:集合(colletion)和文檔(document)
3、MongoDB的特點
(1)面向集合存儲、模式自由、豐富的查詢語句和多索引、複製集機制、易於水平擴展、可插入存儲引擎、跨平臺多語言支持
(2)安裝簡單,提供了面向文檔存儲功能,操作起來比較容易
(3)提供了複製、高可用性和自動分片功能。分片:如果負載增加,可以嗎分佈在計算機網絡中的其他節點上
(4)支持豐富的查詢表達式,查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組
(5)支持各種語言:Ruby、Python、Java、C++、PHP、C#等多種語言
4、適用領域
(1)可以爲web應用提供可擴展的高性能數據存儲解決方案。主要適用領域有網站數據、分佈式場景、數據緩存和JSON文檔格式存儲。
(2)適合大數據量、高併發、弱事務的互聯網應用,內置的水平擴展機制提供了從幾百萬到十億級別的數據處理能力,可以很好滿足web2.0和異動互聯網應用數據存儲的要求
二、MongoDB的安裝
1、安裝及運行控制
(1)安裝
①安裝支持軟件:yum install -y openssl-devel
②安裝MongoDB
③創建相關目錄
1)存儲目錄
a.mkdir -p /data/mongodb1
2)日誌目錄
a.mkdir -p /data/logs/mongodb
b.touch /data/logs/mongodb/mongodb1.log
c.chmod -R 777 /data/logs/mongodb/mongodb1.log
3)進程佔用資源設置
a.ulimit -n 25000
(2)運行控制
①創建配置文件和啓動參數
1)vim /usr/local/mongodb/mongodb1.conf
port = 27017
dbpath = /data/mongodb1
logpath = /data/logs/mongodb/mongodb1.log
fork = true
maxConns = 5000
storageEngine = mmapv1
2)
②設置內核參數
echo 0 > /proc/sys/vm/zone_reclaim_mode
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2、啓動和停止MongoDB
(1)啓動
①usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb1.conf
②usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf
(2)停止
①usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
②非正常關閉需手動刪除mongod.lock文件:rm -rf /data/mongodb1/mongodb1.lock
(3)設置開機啓動
(4)連接並訪問MongoDB
①/usr/local/mongodb/bin/mongo
三、MongoDB的存儲結構
1、邏輯存儲結構
(1)常用術語及說明
(2)數據庫
①默認數據庫:text
②保留數據庫
1)admin:root數據庫。如果將一個用戶添加到這個數據庫,則它將自動集成所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行
2)local:這個數據永遠不被複制,可以用來存儲限於本地單臺服務器的任意集合
3)config:當用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息
(3)集合
①MongoDB的文檔組,類似於關係數據庫中的表格
②集合沒有固定的結構,可以插入不同格式和類型的數據,但通常情況下插入的數據都會有一定關聯性
③合法的集合名字不能使空字符串,不能含有\0(空字符),這個祖父表示集合名的結尾,不能以system.開頭,這是爲系統集合保留的前綴
(4)文檔
①文檔是一個鍵值,即BSON。
②文檔不需要設置相同的字段,並且相同字段不需要相同的數據類型
③文檔中的鍵值對是有序的
④文檔中的值可以使雙銀行裏面的字符串,也可以是其他幾種數據類型
⑤區分類型和大小寫
⑥文檔不能有重複鍵
⑦文檔的鍵是字符串,除了少數情況,鍵可以使用任意UTF-8字符
⑧鍵不能含有空字符,空字符用來標識結尾
⑨.和$有特別意義,只有在特定環境下才能使用
⑩以_開頭的鍵是保留的
2、物理存儲結構
(1)數據存儲
①數據目錄由dbpath指定
②每個數據庫都包含一個.ns文件和一些數據文件,隨着數據量不斷增大,文件數量也會增多。
③數據文件每次生成一個新文件,大小都會比上一個文件大兩倍
④文件使用MMAP進行內存映射,會將所有數據文件映射到內存中,但只是虛擬內存,只有訪問到這塊數據時纔會交換到物理內存
(2)日誌存儲
①存放位置由logpath指定
②journal日誌文件,用於MongoDB崩潰恢復的保障
③oplog複製操作日誌文件在啓動主從複製時出現
④man查詢日誌文件,需要在配置文件中指定profile=1與slowms=200,查看慢查詢的命令爲:>db.system.profile.find()
3、數據類型
四、MongoDB基本操作
1、常用基本操作
2、連接數據庫
(1)/usr/local/mongodb/bin/mongo
(2)mongodb://zhangsan:[email protected]:27017
3、創建和刪除數據庫
(1)創建:use database_name
(2)刪除(先進入相應庫):db.dropDatabase()
4、集合和文檔的操作
(1)直接創建集合:
①db.createCollection(“name”,{capped:true,autoIndexId:true,size:6142800,max:10000})
②capped:是否啓用集合限制,如果開啓需要制定一個限制條件,默認爲不啓用,這個參數沒有實際意義
③autoindexid:是否使用_id作爲索引,默認爲使用(true或false)
④size:限制集合使用空間的大小,默認爲沒有限制
⑤max:集合中最大條數限制,默認爲沒有限制
(2)向集合中插入文檔:db.collection_name.insert({“key”:”value”})
①不指定_id:db.collection_name.save(document)
(3)跟新文檔:db.collection_name.update({“_id”:1},{“key”:”value”})
①只更新一條記錄:db.collection_name.update({“_id”:1},{$set:(“key”:”value”)})
②也可用save命令進行跟新
(4)刪除文檔:db.collection_name.remove()
①deleteOne()
②deleteMany()
五、MongoDB日常維護
1、備份與恢復管理
(1)導入導出
①導出:mongoexport -d dbname -c collectionname -o filename.json
②導入:mongoimport -d bdname -c collectioname file
③d:數據庫名字
④c:collection名字
⑤f:導出哪些列
⑥o:要導出的文件
⑦q:導出數據的過濾條件
(2)備份與恢復
①備份:mongodump -h dbhost -d dbname -o dbdirectory
②h:數據庫服務器地址
③d:需要備份的實例
④o:備份的數據存放位置,備份後會自動在此目錄建立相應文件夾及備份文件
⑤恢復:mongorestore -h dbhost -d dbname --dir dbdirectory
(3)複製數據庫
①db.copyDatabase(“db1”,”db2”,”127.0.0.1:27017”)
(4)克隆集合
①db.runCommand({“cloneCollection”:”test.user”,”from”:”127.0.0.1:27018”})
(5)不同數據庫之間數據遷移(擴展知識)
2、安全管理
(1)限定監聽特定IP和端口(配置文件)
①bind_ip=192.168.11.30
②port=27017
(2)授權啓動
①配置文件添加auth=true
②添加用戶
1)use admin
2)db.createUser({“user”:”root”,”pwd”:”111111”,”roles”:[“root”]})
a.“rules”:[{role:”userAdminAnyDatabase”,db:”admin”}]
③使用用戶
1)use admin
2)db.auth(“root”,”111111”)
④查看用戶
1)db.system.users.find()
2)show users
⑤刪除用戶
1)db.system.users.remove({user:”root”})
⑥數據庫內置角色
1)數據庫用戶角色:
a.read:指定數據庫讀取權限
b.readWrite:指定數據庫讀寫權限
2)數據庫管理角色:
a.dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
b.dbOwner:允許在當前DB中執行任意操作
c.userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫裏創建、刪除和管理用戶
3)集羣管理角色:
a.clusterAdmin:賦予管理集羣的最高權限,只在admin數據庫中可用
b.clusterManager:賦予管理和監控集羣的權限
c.clusterMonitor:賦予監控集羣的權限,對監控工具具有readonly的權限
d.hostManager:賦予管理Server
4)備份恢復角色:
a.backup:備份權限
b.restore:恢復備份權限
5)所有數據庫角色:
a.readAnyDatabase:賦予用戶所有數據庫的讀權限,只在admin數據庫中可用
b.readWriteAnyDatabase:賦予用戶所有數據庫的讀寫權限,只在admin數據庫中可用
c.userAdminAnyDatabase:賦予用戶所有數據庫管理User的權限,只在admin數據庫中可用
d.dbAdminAnyDatabase:賦予管理所有數據庫的權限,只在admin數據庫中可用
6)超級用戶角色:
a.root:超級賬號,超級權限,只在admin數據庫中可用
b.這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
7)內部角色:
a.__system
(3)進程管理
①查看進程:db.currentOp()
3、MongoDB監控
(1)查看數據庫統計信息
①查看數據庫實例狀態信息:db.serverStatus()
②查看當前數據庫統計信息:db.stats()
③通過web界面查看:在配置文件中添加httpinterface=true
(2)查看集合統計信息
①查看集合統計信息:db.users.stats()
②查看集合大小:db.user.dataSize()
(3)第三方監控工具
①可以再Nagios中配置使用MongoDB插件來監控MongoDB數據庫