迎接大數據來臨!MongoDB 操作實錄
迎接 NoSQL 大數據革命
典型關聯式資料庫管理系統 (RDBMS) 歷史相當悠久,我想這應該是目前最被廣泛使用的資料處理架構,也是IT科系必修科目。隨著資訊爆炸時代的來臨,RDBMS 的效能與彈性遭遇相當大的樽頸,因此我們開始需要一個可以處理大量資料 (Big Data) 的儲存方式,這時 NoSQL 已經悄悄誕生。
談 NoSQL 之前我們最好先有個概念,如果直接拿關聯式資料庫與 NoSQL 資料庫做比較,其實沒有太大的意義。這個情況就很像百貨公司的扶手梯與電梯,貌似功能相同,但實際應用並不衝突。那什麼是 NoSQL 呢?我們都知道關聯式資料庫的那套理論,正規化、Schema、SQL Query 等等,這些概念在 NoSQL 資料庫都是看不到的 (顧名思義才叫 NoSQL),NoSQL 最廣泛的實作大概就是 Document DB 與 Key/Value DB,今天要介紹的 MongoDB 就是 Document DB 的實作之一。
基本上使用 NoSQL 不需要定義 Schema,資料你想要怎麼存就怎麼存,想儲存檔案當然也是一樣。NoSQL 沒有 RDBMS 的嚴謹,換來的是效能速度與彈性,特別在 Cloud 與 Big Data 的領域被廣泛使用。以 MongoDB 來說,資料全面支援全文檢索,搜尋速度比 MySQL 優異許多,分散式架構可以很容易進行水平擴充 (當然也支援 Map/Reduce)。由於沒有 Schema,你可以隨時加入你想要的欄位,不然如果是傳統 RDBMS 的情況,一張表如果幾億筆資料,當一按ALTER TABLE 語法大概可以足足浪費一整天!
Linux CentOS 安裝 MongoDB
今天我們示範的作業系統是 Linux CentOS 6.7,其他的 Linux Distribution 大同小異,基本上不會有太大的問題。
我們打算直接透過 yum 進行套件安裝,由於 mongodb 不在預設的套件中,但我們可以透過 EPEL (Extra Packages for Enterprise Linux) 或者 MongoDB Yum Repository 進行安裝 (二擇一即可),透過 EPEL 安裝方式如下,mongodb 與 mongo-server 分別是 Client 與 Server 套件。
[root@server ~]# wget http://mirror01.idc.hinet.net/EPEL/6/x86_64/epel-release-6-8.noarch.rpm
[root@server ~]# rpm -ivh epel-release-6-8.noarch.rpm
[root@server ~]# yum install mongodb mongodb-server
如果是 32 Bit RPM 可以改用「http://mirror01.idc.hinet.net/EPEL/6/i386/epel-release-6-8.noarch.rpm」路徑,但比較建議裝 64 Bit 才不會有檔案大小 2G 限制的問題。
如果您想安裝更新版本的 MongoDB 也可透過 MongoDB Yum Repository,需手動加入 Repos 設定檔,請建立 /etc/yum.repos.d/mongodb.repo 檔案,並加入以下內容:
32 位元系統
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/
gpgcheck=0
enabled=1
64 位元系統 (推薦)
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
接著一樣透過 yum 進行安裝:
[root@server ~]# yum install mongodb-org
安裝完後記得將 Mongo Server 設為開機啟動(如果有需要的話),命令如下:
[root@server ~]# chkconfig –levels 345 mongod on
確認一下設定結果:
[root@server ~]# chkconfig –list | grep mongod
mongod 0:off 1:off 2:off 3:on 4:on 5:on 6:off
啟動 mongod service:
[root@server ~]# service mongod start
預設 MongoDB 使用 TCP 27017 Port,我們也可以透過以下命令查詢:
[root@server ~]# netstat -tpln | grep mongod
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1615/mongod
預設 MongoDB 的資料庫檔案是放在 /var/lib/mongodb 或 /var/lib/mongo 目錄下,正確的位置請參考 /etc/mongod.conf 中的 dbpath 設定。
透過 Mongo Client 進行 DB 基本操作
MySql 有 mysql 命令、PostgreSql 有 psql 命名,MongoDB 當然也有操作命令,那就是 mongo 囉。使用之前,我先介紹幾個最基本的元素:
- Database:就是一般我們傳統的資料庫概念,每個操作都必須在資料庫中
- Collection:可以想像為放資料的容器,每一筆新增的資料都一定要有存放的 Collection,概念類似 Table 但是沒有限定要放那種格式 (沒有 Schema 這招)!
- Object:MongoDB 最基本的資料單位,每一筆資料都是以 Object 型態存在 Collection 中,新增後會自動產生一個不會重複的 ID (類似 UUID 而非流水號),為什麼要這樣設計其實很簡單,用於分散式系統中,使用不重複的 ID 將會是關鍵。
有了一點點基本認識後,那我們先開始測試看看囉,先透過 mongo 命令進入 test 資料庫,注意喔,預設裝起來是沒有任何驗證程序的(以後我們會再介紹如何啟用驗證功能)。我們先用 mongo test 命令試看看,如下:
[root@server ~]# mongo test
MongoDB shell version: 2.6.4
connecting to: test
顯示所有資料庫:show dbs; 與顯示目前資料庫中的 Collections:show collections;。接著我們透過 db 命令新增一筆資料,如下:
> show dbs;
admin (empty)
local 0.078GB
test (empty)
> show collections;
> db.createCollection(“myCollection”);
{ “ok” : 1 }
> db.myCollection.insert({
… “first_name” : “SJ”,
… “last_name” : “GG.”,
… “roles” : [
… “developer”,
… “bug maker”
… ]
… });
WriteResult({ “nInserted” : 1 })
上述透過 db.createCollection(“myCollection”); 建立命為 myCollection 的 Collection。接著透過 db.myCollection.insert({Object}) 建立資料,命令示意圖如下:
看來很容易就建立資料了,Mongo Client 所有資料庫的操作都是透過 db 這個物件,可以在 db. 之後按下「Tab 鍵」就會顯示所有可以使用的函式,用起來是不是有點像是 JavaScript 呢!
前面不是提過 MongoDB 是沒有 Schema 的設計嗎?為了證明我有時候不會說謊,我們就在同一個 Collection 新增一個不同結構的物件看看,如下:
> db.myCollection.insert({
… “name” : “sj”,
… “action” : “use”,
… “value” : “MongoDB”
… });
WriteResult({ “nInserted” : 1 })
>
太好了,貌似成功了!趕快查詢看看!
> db.myCollection.find();
{ “_id” : ObjectId(“53f21b7400bf44b07be32db8”), “first_name” : “SJ”, “last_name” : “GG.”, “roles” : [ “developer”, “bug maker” ] }
{ “_id” : ObjectId(“53f21e9500bf44b07be32db9”), “name” : “sj”, “action” : “use”, “value” : “MongoDB” }
> exit
bye
[root@server ~]#
上述範例透過 db.myCollection.findOne(); 顯示 Collection 中的資料,其中的 ObjectId 就是 MongoDB 自動產生的流水號,最後可以透過 exit 命名離開 Mongo Client。
完成後我們可以偷看一下 /var/lib/mongo 目錄中的檔案,正確的話可以看到我們剛剛測試的 test 資料庫,要注意 32 Bit 系統檔案大小有 2G 的限制,因此還是比較推薦 64 Bit 系統。