MongoDB數據庫瞭解與學習筆記

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可視化軟件安裝

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章