MongoDB數據庫
一、MongoDB認識
MongoDB是一款C語言開源開發的,跨平臺,面向文檔的NoSQL數據庫
什麼是NoSQL?
存儲數據不以關係模型爲依據,不需要固定的表格式。非關係型數據庫作爲關係型數據庫的一個補充,在日益快速發展的網站時代,發揮着高效與高性能,NoSQL用於超大規模數據的存儲
常用的非關係型數據庫:MongoDB、Memcache Redis、HBase
非關係型數據庫的優點:1.數據庫高併發讀寫的需求
2.對海量數據高效率存儲與訪問
3.數據庫的高擴展性與高可用性的需求
MangoDB的定義
MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的
爲 Web 應用提供可擴展的高性能數據存儲解決方案,主要適用於網站數據、數據緩存、分佈式場景和JSON文檔格式存儲,適合大數據量,高併發、弱事務的互聯網應用上
MongoDB的優缺點
優點:高可擴展性、分佈式計算、低成本、架構的靈活性,半結構化數據、沒有複雜的關係
MongoDB提供了複製、高可用性和自動分片功能,支持豐富的查詢表達式,支持各種編程語言,比如RUBY,PYTHON,JAVA,C++,PHP,C#等
缺點:沒有標準化、有限的查詢功能
MongoDB運行的兩大概念:集合(collection)和文檔(document)
在MongoDB中表的概念換成了集合,數據的概念換成了文檔
二、MongoDBLinux下的安裝
1.下載安裝依賴包和MongoDB安裝包
yum -y install openssl-devel
tar zxf mongodb-linux-x86_64-rhel62-3.2.10.tgz
mv mongodb-linux-x86_64-rhel62-3.2.10 /usr/local/mongodb
2.創建MongoDB的數據存儲目錄/data/mongodb1,日誌目錄/data/logs,日誌文件,並加權限
注意:大多類似UNIX的操作系統,包括Linux和OS X,都提供了限制每個進程和每個基本用戶使用線程,文件和網絡連接等系統資源的一些方法
mkdir -p /data/mongodb1
mkdir -p /data/logs/mongodb
touch /data/logs/mongodb/mongodb1.log
chmod -R 777 /data/logs/mongodb/mongodb1.log
當MongDB處於頻繁訪問狀態,如果shell啓動進程所佔用的資源設置過低,將會產生錯誤導致無法連接MongoDB,需要設置
Linux系統默認一個進程最大文件打開數目爲1024,有時,這些限制的默認值太小,這會導致正常MongoDB操作過程中出現一系列問題
ulimit -u 25000(單個進程文件打開數)
ulimit -n 25000(可打開的進程/線程)
3.創建MangoDB配置文件和設置啓動參數
vim /usr/local/mongodb/bin/mongodb1.conf
port=27017 \\默認服務端口號
dbpath=/data/mongodb1 \\數據存儲目錄
logpath=/data/logs/mongodb/mongodb1.log \\日誌文件
logappend=true \\使用追加的方式寫日誌
fork=true \\後臺運行
maxConns=5000 \\最大同時連接數,默認是2000
storageEngine=mmapv1 \\指定存儲引擎爲內存映射文件
4.設置內核參數
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
5.啓動和停止MongoDB
啓動:/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf
停止:/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
MongoDB的多實例
創建MongoDB新的數據存儲目錄/data/mongodb2,日誌文件並添加權限
mkdir /data/mongodb2
touch /data/logs/mongodb/mongodb2.log
chmod -R 777 /data/logs/mongodb/mongodb2.log
在存放主配置文件的目錄創建新主配置文件,內容對比第一個實例的配置文件修改下面參數即可(需要創建幾個實例就複製編輯幾個,名字不同)
vim /usr/local/mongodb/bin/mongodb2.conf
port=27018
dbpath=/data/mongodb2
logpath=/data/logs/mongodb/mongodb2.log
啓動實例(啓動方式跟第一個實例一樣)
三、MongoDB基礎
MongoDB的存儲結構
邏輯結構主要由集合(collection)、文檔(Document)、數據庫(database)三個部分組成,其中文檔是核心概念,它是MongoDB邏輯存儲最小的存儲單元
★集合:
合法的集合名:1.集合名不能是空字符串""。
2.集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
3.集合名不能以"system."開頭,這是爲系統集合保留的前綴。
4.用戶創建的集合名字不能含有保留字符,有些驅動程序的確支持在集合名裏面包含,這是因爲某些系統生成的 集合中包含該字符,除非你要訪問這種系統創建的集合,否則千萬不要在名字裏出現$
★文檔:
文檔是一組鍵值(key-value)對(即BSON),MongoDB 的文檔不需要設置相同的字段,並且相同的字段不需要相同的數據類型,這與關係型數據庫有很大的區別,也是 MongoDB 非常突出的特點
需要注意的是:1.文檔中的鍵/值對是有序的
2.文檔中的值不僅可以是在雙引號裏面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)
3.MongoDB區分類型和大小寫
4.MongoDB的文檔不能有重複的鍵
5.文檔的鍵是字符串,除了少數例外情況,鍵可以使用任意UTF-8字符
物理存儲結構:
數據存儲結構:命名空間文件(.ns結尾文件) 數據文件(.0,1,2,3...)
日誌存儲結構:journal日誌文件:用於MongDB崩潰恢復的保障
oplog複製操作日誌文件:只有在主從複製開啓之後纔會出現
慢查詢日誌:需要開啓後纔可以
★數據庫:
初始內建數據庫:admin:admin庫主要存放有數據庫帳號相關信息。
local:local數據庫永遠不會被複制到從節點,可以用來存儲限於本地單臺服務器的任意集合
config:config數據庫用於分片集羣環境,存放了分片相關的元數據信息。
test:MongoDB默認創建的一個測試庫
MongoDB數據類型
String:字符串,存儲數據常用的數據類型,在 MongoDB 中,UTF-8 編碼的字符串纔是合法的
Integer:整型數值,用於存儲數值,根據你所採用的服務器,可分爲 32 位或 64 位
Boolean:布爾值,用於存儲布爾值(真/假)
Double:雙精度浮點值,用於存儲浮點值
Min/Max keys:將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比
Array:用於將數組或列表或多個值存儲爲一個鍵
Timestamp:時間戳,記錄文檔修改或添加的具體時間
Object:用於內嵌文檔
Null:用於創建空值
Symbol:符號,該數據類型基本上等同於字符串類型,但不同的是,它一般用於採用特殊符號類型的語言
Date:日期時間,用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創建 Date 對象,傳入年月日信息
Object ID:對象 ID,用於創建文檔的 ID
Binary Date:二進制數據,用於存儲二進制數據
Code:代碼類型,用於在文檔中存儲 JavaScript 代碼
Regular expression:正則表達式類型。用於存儲正則表達式
MongoDB的基礎操作
本地登錄:/usr/local/mongodb/bin/mongo(默認登錄27017端口,數據庫test,默認無密碼登錄)
遠程登錄:mongodb://zhangsan:[email protected]:27017
查看數據庫:>show dbs
顯示用戶:>show users
切換數據庫:>use 數據庫名(如果數據庫不存在,則創建數據庫,否則切換到指定數據庫)
顯示數據庫操作命令:>db.help()
查看集合:>show collections
顯示集合操作命令:>db.集合名.help()
查找文檔:>db.集合名.find()
創建集合:>db.createCollection(name,options)
options參數:
capped(布爾):(可選)如果爲 true,則創建固定集合,固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最早的文檔,當該值爲 true 時,必須指定 size 參數
autoIndexId(布爾):(可選)如爲 true,自動在 _id 字段創建索引,默認爲 false
size(數值):(可選)爲固定集合指定一個最大值(以字節計),如果 capped 爲 true,也需要指定該字段
max(數值):(可選)指定固定集合中包含文檔的最大數量
創建固定集合 test,整個集合空間大小 6142800 KB, 文檔最大個數爲 10000 個
>db.createCollection("test", { capped : true, autoIndexId : true, size : 6142800, max : 10000})
集合被設置成了固定集合 ,固定集合的數據不能被修改,只能查找-刪除-再插入,也就是創建集合的時候設置了capped參數爲true
插入文檔自動創建集合:
>db.test.insert({"name":"zhangsan"}
創建文檔:
自動產生_id:>db.集合名.insert({"key":"value"})
可以手動指定_id:>db.集合名.save(document)
四、MongoDB日常維護
MongoDB備份與恢復管理
數據導出工具:mongoexport
MongoDB中的mongoexport工具可以把一個collection導出成JSON格式或CSV格式的文件
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
數據導入工具:mongoimport
mongoimport -d dbname -c collectionname --file filename --type json/csv -f field
-d:指定數據庫名
-c:指定collection集合名
-f:指定導出哪些列
-o:指定要導出的文件名
-q:指定導出數據的過濾條件
注意:在MySQL導入的時候,之前MySQL導出的時候加個database的選項,導入的時候就可以不用創建
MongoDB數據庫備份與恢復:mongodump
備份:mongodump -h dbhost -d dbname -o dir
恢復:mongorestore -h dbhost -d dbname -dir dir
-h:MongoDB所在的服務器IP地址(可以在後面加指定端口號)
-d:指定需要備份的數據庫實例
-o:指定備份的數據庫存放的位置(該目錄要提前創建好,備份數據會存放在該目錄下自動創建的test目錄下)
在MongoDB數據庫中複製數據庫
>db.copyDatabase("db1","db2","localhost")
克隆集合(從遠程MongoDB實例中複製集合到當前MongoDB實例,集合名稱是一致的)
>db.runCommand({"cloneCollection":"abc.test","from":"192.168.100.7:27017"})
MongoDB安全管理
限制監聽的IP地址和端口(在配置文件中設置)
vim /usr/local/mongodb/conf/mongodb.conf
bind_ip=192.168.0.111 \\只允許這個IP地址進行訪問
port = 27017 \\只允許這個端口號進行訪問
授權啓動登錄userAdminAnyDatabase(MongoDB第一次默認不需要密碼,也沒有任何用戶)
1.登錄進入數據庫,切換到admin庫
> use admin
2.創建管理用戶
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
roles:指定用戶的角色,可以用一個空數組給新用戶設定空角色,在roles字段,可以指定內置角色和用戶定義的角色
Built-In Roles(內置角色):
數據庫用戶角色:read、readWrite;
數據庫管理角色:dbAdmin、dbOwner、userAdmin
集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
備份恢復角色:backup、restore
所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超級用戶角色:root
補充:這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
內部角色:__system
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫裏創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和複製集相關函數的管理權限
3.啓動用戶驗證功能
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongodb.conf --auth
或者編輯配置文件:vim /usr/local/mongodb/conf/mongodb.conf
添加auth = true
查看已有用戶:> show users或> db.system.users.find()
4.登錄MongoDB,使用admin用戶對admin庫進行驗證登錄
> use admin
> db.auth("admin","123456")
使用管理用戶的用戶admin 來創建其他數據庫的用戶名和密碼
> use test
> db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
更新用戶:> db.updateUser('testuser',{pwd:"111111",roles:[{role:"readWrite",db:"test"}]})
刪除用戶:> db.dropUser("testuser")
注意:使用有管理用戶的權限的用戶admin登陸之後才能刪除用戶
進程管理
查詢正在執行的操作進程:> db.currentOp()
終止進程:> db.killOp("shard3:466404288")
MongoDB監控
1.數據庫命令查看
查看數據庫實例狀態信息:> db.serverStatus()
查看當前數據庫的統計信息:> db.stats()
查看集合統計信息:> db.users.stats()
查看集合大小:> db.users.dataSize()
2.通過網頁來進行監控(編輯配置文件):vim /usr/local/mongodb/conf/mongodb.conf
添加httpinterface=true
通過http://localhost:28017進行網頁訪問
3.三方監控工具:Nagios
補充:Windows下安裝MongoDB
mongo.exe啓動
MongoDB可視化軟件安裝