MongoDB基礎篇
一、走進MongoDB
MongoDB 是一個高性能,開源,面向集合,無模式的文檔型數據庫。它在許多場景下可用於替代傳統的關係型數據庫或鍵-值存儲方式,MongoDB 使用C++開發。
1.1、初識MongoDB
MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。
他支持的數據結構非常鬆散,是類似json 的bjson 格式,因此可以存儲比較複雜的數據類型。MongoDB 最大的特點是他支持的查詢語言非常強大,
其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
它是一個面向集合的,模式自由的文檔型數據庫。
1.1.1 面向集合(Collenction-Orented)
數據被分組存儲在數據集中, 被稱爲一個集合(Collenction)。每個集合在數據庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關係型數據庫(RDBMS)裏的表(table),不同的是它不需要定義任何模式(schema)。
1.1.2 模式自由(Schema-free)
存儲在MongoDB 數據庫中的文件,我們不需要知道它的任何結構定義。
1.1.3 文檔型(Document File)
存儲的數據是鍵-值對的集合"JSON",鍵是字符串,值可以是數據類型集合裏的任意類型,包括數組和文檔。我們把這個數據格式稱作 “BSON” 即 “Binary Serialized DocumentNotation.”
1.2、MongoDB的特點
面向集合存儲,易於存儲對象類型的數據
模式自由
支持動態查詢
支持完全索引,包含內部對象
支持複製和故障恢復
使用高效的二進制數據存儲,包括大型對象(如視頻、圖片等)
自動處理碎片,以支持雲計算層次的擴展性
支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及C++語言的驅動程序,社區中也提供了對Erlang 及.NET 等平臺的驅動程序 文件存儲格式爲BSON(一種JSON 的擴展)
可通過網絡訪問
1.3、MongoDB的功能
面向集合的存儲:適合存儲對象及JSON 形式的數據
動態查詢:MongoDB 支持豐富的查詢表達式。查詢指令使用JSON 形式的標記,可輕易查詢文檔中內嵌的對象及數組
完整的索引支持:包括文檔內嵌對象及數組。MongoDB 的查詢優化器會分析查詢表達式,並生成一個高效的查詢計劃
查詢監視:MongoDB 包含一系列監視工具用於分析數據庫操作的性能
複製及自動故障轉移:MongoDB 數據庫支持服務器之間的數據複製,支持主-從模式及服務器之間的相互複製。複製的主要目標是提供冗餘及自動故障轉移
高效的傳統存儲方式:支持二進制數據及大型對象(如照片或視頻)
自動分片以支持雲級別的伸縮性:自動分片功能支持水平的數據庫集羣,可動態添加額外的機器。
1.4、MongoDB的場景
適用場景:
網站數據:MongoDB 非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性
緩存:由於性能很高,MongoDB 也適合作爲信息基礎設施的緩存層。在系統重啓之後,由MongoDB 搭建的持久化緩存層可以避免下層的數據源過載
大尺寸,低價值的數據:使用傳統的關係型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲
高伸縮性的場景:MongoDB 非常適合由數十或數百臺服務器組成的數據庫。MongoDB的路線圖中已經包含對MapReduce 引擎的內置支持
用於對象及JSON 數據的存儲:MongoDB 的BSON 數據格式非常適合文檔化格式的存儲及查詢
不適用場景:
高度事務性的系統,例如銀行或會計系統。
傳統的商業智能應用:針對特定問題的BI數據庫會對產生高度優化的查詢方式。
極爲複雜的SQL查詢
二、安裝和配置
MongoDB 的官方下載站是http://www.mongodb.org/downloads,可以去上面下載最新的安裝程序下來。
在下載頁面可以看到,它對操作系統支持很全面,如OS X、Linux、Windows、Solaris都支持,
而且都有各自的32 位和64 位版本。 注意:
MongoDB 1.8.1 Linux 版要求glibc 必須是2.5 以上。
在32 位平臺MongoDB 不允許數據庫文件(累計總和)超過2G,而64 位平臺沒有這個限制。
這裏主要介紹Linux平臺的安裝:
步驟一: 下載MongoDB下載安裝包:curl -O http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz
步驟二: 設置MongoDB程序存放目錄將其解壓到/Apps,再重命名爲mongo,路徑爲/Apps/mongo
步驟三: 設置數據文件存放目錄建立/data/db 的目錄, mkdir –p /data/db
步驟四: 啓動MongoDB服務/Apps/mongo/bin/mongod --dbpath=/data/db;(MongoDB 服務端的默認連接端口是 27017)
步驟五: 將MongoDB作爲 Linux 服務隨機啓動;先創建/Apps/mongo/logs/mongodb.log 文件,用於存儲MongoDB 的日誌文件vi /etc/rc.local, 使用vi 編輯器打開配置文件,並在其中加入下面一行代碼/Apps/mongo/bin/mongod --dbpath=/data/db --logpath=/Apps/mongo/logs/mongodb.log
步驟六: 客戶端連接驗證;新打開一個Shell 輸入:/Apps/mongo/bin/mongo,就可以開始我們的mongo之旅了。
步驟七: 查看MongoDB日誌;
三、體系結構
MongoDB 是一個可移植的數據庫,它在流行的每一個平臺上都可以使用,即所謂的跨平臺特性。在不同的操作系統上雖然略有差別,但是從整體構架上來看,MongoDB 在不同的平臺上是一樣的,如數據邏輯結構和數據的存儲等等。 一個運行着的MongoDB 數據庫就可以看成是一個MongoDB Server,該Server 由實例和數據庫組成,在一般的情況下一個MongoDB Server 機器上包含一個實例和多個與之對應的數據庫,但是在特殊情況下,如硬件投入成本有限或特殊的應用需求,也允許一個Server 機器上可以有多個實例和多個數據庫。 MongoDB 中一系列物理文件(數據文件,日誌文件等)的集合或與之對應的邏輯結構(集合,文檔等)被稱爲數據庫,簡單的說,就是數據庫是由一系列與磁盤有關係的物理文件的組成。
3.1 數據邏輯結構
MongoDB 的邏輯結構是一種層次結構。主要由:文檔(document)、集合(collection)、數據庫(database)這三部分組成的。 邏輯結構是面向用戶的,用戶使用MongoDB 開發應用程序使用的就是邏輯結構。
MongoDB 的文檔(document),相當於關係數據庫中的一行記錄。
多個文檔組成一個集合(collection),相當於關係數據庫的表。
多個集合(collection),邏輯上組織在一起,就是數據庫(database)。
一個MongoDB 實例支持多個數據庫(database)。
3.2 數據存儲結構
MongoDB 內部有預分配空間的機制,每個預分配的文件都用0進行填充,由於有了這個機制,MongoDB 始終保持額外的空間和空餘的數據文件,從而有效避免了由於數據暴增而帶來的磁盤壓力過大的問題。 由於表中數據量的增加,數據文件每新分配一次,它的大小都會是上一個數據文件大小的2倍,每個數據文件最大2G。這樣的機制有利於防止較小的數據庫浪費過多的磁盤空間,同時又能保證較大的數據庫有相應的預留空間使用。 數據庫的每張表都對應一個命名空間,每個索引也有對應的命名空間。這些命名空間的元數據都集中在*.ns 文件中。每個命名空間可以包含多個不同的盤區,這些盤區並不是連續的。與數據文件的增長相同,每一個命名空間對應的盤區大小的也是隨着分配的次數不斷增長的。這樣做的目的是爲了平衡命名空間浪費的空間與保持某一個命名空間中數據的連續性。每當命名空間需要分配新的盤區的時候,都會先查看$freelist (用於記錄不再使用的盤區的命名空間)是否有大小合適的盤區可以使用,這樣就回收空閒的磁盤空間。
四、快速入門
4.1 啓動數據庫
4.1.1 命令行啓動方式
MongoDB 默認存儲數據目錄爲/data/db/ (或者 c:\data\db), 默認端口27017,默認HTTP 端口28017。當然你也可以修改成不同目錄,只需要指定dbpath 參數:
$mongod -h
$mongod --dbpath=/data/db --logpath=/tmp/mongod.log
4.1.2 配置文件啓動方式
爲減少命令後參數過多和維護成本,MongoDB 也支持同mysql 一樣的讀取啓動配置文件的方式來啓動數據庫,配置文件的內容如下:
# cat /etc/mongodb.conf
fork = true
bind_ip = 127.0.0.1
port = 27017
quiet = true
dbpath = /data/db
logpath = /tmp/mongod.log
logappend = true
journal = true
# mongod -f /etc/mongodb.conf
4.1.3 Daemon方式啓動
前面兩種都提供的前臺啓動mongodb進程,但當mongodb進程的session被關閉時,mongodb進程也隨之停止,這是非常不安全的。MongoDB提供了一種後臺啓動的選擇,只需要加上一個--fork參數即可。
# mongod --dbpath=/data/db --logpath=/tmp/mongod.log --fork
4.2 停止數據庫
MongoDB 提供的停止數據庫命令也非常豐富,如果Control-C、發送shutdownServer()指令及發送Unix 系統中斷信號等。
4.2.1 Control-C
$ mongo
> Control-C
4.2.2 shutdownServer()
$ mongo
> db.shutdownServer()
4.2.3 linux 系統中斷信號
$ ps aux|grep mongod
$ kill -9 pid
4.3 Mongo API
$ ./mongo
>help //查看客戶端幫忙命令
>db.help() //查看db的api
>db.mycroll.help() //查看collection的api
4.3.1 插入操作
>use mydb
>db.things.save({name:"mongo"})
>db.things.insert({x:1})
4.3.2 更新操作
>use mydb
>db.things.update({name:"mongo"},{$set:{name:"new_mongo"}})
4.3.3 刪除操作
>use mydb
>db.things.remove({name:"mongo"})
4.3.4 查詢操作
>use mydb
>db.things.find({name:"mongo"})
4.4 常用工具集
MongoDB 在bin 目錄下提供了一系列有用的工具,這些工具提供了MongoDB 在運維管理上的方便。
bsondump: 將bson 格式的文件轉儲爲json 格式的數據
mongo: 客戶端命令行工具,其實也是一個js 解釋器,支持js 語法
mongod: 數據庫服務端,每個實例啓動一個進程,可以fork 爲後臺運行
mongodump/ mongorestore: 數據庫備份和恢復工具
mongoexport/ mongoimport: 數據導出和導入工具
mongofiles:GridFS 管理工具,可實現二制文件的存取
mongos: 分片路由,如果使用了sharding 功能,則應用程序連接的是mongos 而不是mongod
mongosniff: 這一工具的作用類似於tcpdump,不同的是他只監控MongoDB 相關的包請求,並且是以指定的可讀性的形式輸出
mongostat: 實時性能監控工具
4.6 客戶端工具
MongoVUE:一個桌面程序,提供了對MongoDB 數據庫的基本操作,如查看、查詢、更新、刪除等,簡單易用,但是功能還比較弱,以後發展應該不錯。
RockMongo:是一個PHP5 寫的MongoDB 管理工具。
MongoHub:是一個針對Mac 平臺的MongoDB 圖形管理客戶端,可用來管理MongoDB 數據的應用程序。
參考資料:
http://docs.mongodb.org/manual/
http://docs.mongodb.org/manual/administration/configuration/