1妆偏、MongoDB簡(jiǎn)介
MongoDB是非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)府怯。最近幾年發(fā)展勢(shì)頭很猛。傳統(tǒng)SQL數(shù)據(jù)庫(kù)與NoSQL數(shù)據(jù)庫(kù)相比矗烛,劣勢(shì)有:
(1)集中式單點(diǎn)架構(gòu):數(shù)據(jù)模型僵硬玫镐、可擴(kuò)展性差倒戏;
(2)固定數(shù)據(jù)模型缺乏處理半結(jié)構(gòu)和非結(jié)構(gòu)化數(shù)據(jù)的能力;
(3)擴(kuò)容成本高:處理海量數(shù)據(jù)是存在性能瓶頸恐似,大數(shù)據(jù)時(shí)代的存儲(chǔ)需求下杜跷,成本指數(shù)上漲。
關(guān)系型數(shù)據(jù)庫(kù)的核心優(yōu)勢(shì)在于強(qiáng)一致性的關(guān)系模型,支持事務(wù)操作葱椭。當(dāng)人們發(fā)現(xiàn)并不是所有的數(shù)據(jù)都要求強(qiáng)一致性捂寿,同時(shí)對(duì)于性能和數(shù)據(jù)量的需求越來(lái)越高時(shí),NoSQL就應(yīng)運(yùn)而生了孵运。NoSQL主要將可擴(kuò)展性放在首位秦陋,而一致性則放到了第二位,這種設(shè)計(jì)與原本的關(guān)系模型產(chǎn)生了極大的差異治笨。
所以說(shuō)驳概,NoSQL只是一種新型的數(shù)據(jù)庫(kù)設(shè)計(jì)方式,它不是為了取代傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)而被設(shè)計(jì)的旷赖,他們分別代表了不同的數(shù)據(jù)庫(kù)設(shè)計(jì)思路顺又。
隨著當(dāng)前數(shù)據(jù)庫(kù)的發(fā)展和使用來(lái)看,現(xiàn)在很多公司在研究NewSQL的新數(shù)據(jù)庫(kù)等孵,希望吸取關(guān)系型數(shù)據(jù)和非關(guān)系型數(shù)據(jù)庫(kù)各自的優(yōu)點(diǎn)稚照。
2、MongoDB的特點(diǎn)和使用場(chǎng)景
MongoDB是最流行的NoSQL數(shù)據(jù)庫(kù)俯萌。MongoDB推崇的哲學(xué)史是:your data is schema果录,意思是你想要的數(shù)據(jù)是什么樣子的,存在數(shù)據(jù)庫(kù)里就是什么樣子的咐熙。大多數(shù)時(shí)候弱恒,你不用去多個(gè)table做join,你也不用處理表之間復(fù)雜的關(guān)系棋恼。
(1)實(shí)用性
MongoDB是一個(gè)面向文檔的數(shù)據(jù)庫(kù)返弹,它直接存取BSON(JSON),這意味著MongoDB很靈活爪飘,可以在文檔中直接插入數(shù)組之類的復(fù)雜數(shù)據(jù)類型义起,并且文檔的key和value不是固定的數(shù)據(jù)類型和大小,所以開發(fā)者在使用MongoDB時(shí)無(wú)須預(yù)定義關(guān)系型數(shù)據(jù)庫(kù)中的“表”等數(shù)據(jù)對(duì)象悦施,設(shè)計(jì)數(shù)據(jù)庫(kù)將變得非常方便并扇,可以大大提高開發(fā)進(jìn)度。
注:雖然這樣說(shuō)抡诞,但是MongoDB的schema很重要,特別在大型產(chǎn)品中土陪,要好好設(shè)計(jì)“表”昼汗。否則等產(chǎn)品上線,數(shù)據(jù)量不斷增大鬼雀、需求不斷增多(查詢條件變得越來(lái)越復(fù)雜)的情況下顷窒,只建立對(duì)應(yīng)的索引都會(huì)占巨大的內(nèi)存。到了后期,由于表設(shè)計(jì)的不合理鞋吉,會(huì)存在頻繁的多表查詢鸦做,到時(shí)MongoDB即難以保證數(shù)據(jù)一致性,也難以提供很高的吞吐量谓着。
(2)可用性和負(fù)載均衡
MongoDB在高可用和負(fù)載均衡上的實(shí)現(xiàn)非常簡(jiǎn)潔和友好泼诱,MongoDB自帶了副本集的概念,通過(guò)設(shè)計(jì)適合自己業(yè)務(wù)的副本集和驅(qū)動(dòng)程序赊锚,可以非常有效和方便地實(shí)現(xiàn)高可用治筒。而在其他數(shù)據(jù)產(chǎn)品中要想實(shí)現(xiàn)這樣的功能,往往需要額外的中間件舷蒲。
(3)擴(kuò)展性
在擴(kuò)展性方面耸袜,假設(shè)應(yīng)用數(shù)據(jù)增長(zhǎng)非常迅猛的話,通過(guò)不斷地添加磁盤容量和內(nèi)存容量往往是不現(xiàn)實(shí)的牲平,而手動(dòng)的分庫(kù)分表又會(huì)帶來(lái)非常繁重的工作量和技術(shù)復(fù)雜度堤框。MongoDB自帶的mongos集群,只需在適當(dāng)?shù)臅r(shí)候繼續(xù)添加MongoDB分片纵柿,就可以實(shí)現(xiàn)程序段自動(dòng)水平擴(kuò)展和路由胰锌,一方面緩解單個(gè)節(jié)點(diǎn)的讀寫壓力,另一方面可有效地均衡磁盤容量藐窄。整個(gè)mongos集群對(duì)應(yīng)用層完全透明资昧,并可完美地做到各個(gè)mongos集群組件的高可用性。
(4)讀寫速度
MongoDB會(huì)充分使用系統(tǒng)內(nèi)存作為緩存荆忍,這是一種非常優(yōu)秀的特性格带。如果內(nèi)存資源豐富的話,這將極大的提高數(shù)據(jù)庫(kù)的查詢速度刹枉,畢竟內(nèi)存I/O效率比磁盤高多了叽唱。
3、動(dòng)手部署最簡(jiǎn)易的MongoDB服務(wù)器
下面我們開始動(dòng)手搭建一個(gè)最簡(jiǎn)易的MongoDB服務(wù)器微宝,開始逐漸認(rèn)識(shí)mongo棺亭。
(1)從官網(wǎng)下載對(duì)應(yīng)的MongoDB二進(jìn)制文件版本
筆者的測(cè)試環(huán)境為Ubuntu系統(tǒng),所以選擇的ubuntu版本蟋软。在Package中可以選擇安裝包還是二進(jìn)制文件軟件包镶摘,筆者選擇的二進(jìn)制文件包。
(2)解壓二進(jìn)制文件傳到環(huán)境上
(3)創(chuàng)建數(shù)據(jù)目錄
mkdir -p /data/db/mongodb/single
注:保證當(dāng)前用戶對(duì)新創(chuàng)建的目錄有讀寫可執(zhí)行權(quán)限岳守。
(4)隨意指定一個(gè)端口凄敢,以單節(jié)點(diǎn)模式拉起mongo服務(wù)進(jìn)程
./mongod --port 30001 --dbpath /data/db/mongodb/single
(5)當(dāng)服務(wù)啟動(dòng)后,另外開啟一個(gè)窗口湿痢,然后執(zhí)行以下命令連接mongo
./mongo --port 30001
可以試著插入一條數(shù)據(jù)涝缝,然后查看:
其他mongo的簡(jiǎn)單實(shí)用方法可以參考MongoDB教程。
MongoDB支持從配置文件中讀取啟動(dòng)配置參數(shù)。如果參數(shù)比較多的話拒逮,將啟動(dòng)參數(shù)寫入配置文件是個(gè)不錯(cuò)的選擇罐氨。例如上面第(4)步拉起mongo進(jìn)程可以用下面方法代替:
(1)建立一個(gè)啟動(dòng)參數(shù)配置文件,比如名字為mongod.conf滩援,內(nèi)容如下:
storage:
dbpath:"/data/db/mongodb/single"
net:
port:30001
(2)以-f選項(xiàng)加載啟動(dòng)配置文件:
./mongo -f mongod.f
注:mongo啟動(dòng)參數(shù)還有許多栅隐,可以參考MongoDB啟動(dòng)參數(shù)配置選項(xiàng)。在后續(xù)博客中筆者會(huì)結(jié)合自己的經(jīng)驗(yàn)給出一個(gè)可在生產(chǎn)環(huán)境使用的配置參數(shù)狠怨。
4 尾聲
本文給大家介紹了MongoDB的特點(diǎn)和使用場(chǎng)景约啊,并且手動(dòng)搭建了一個(gè)MongoDB單節(jié)點(diǎn)環(huán)境。到此佣赖,大家對(duì)MongoDB有了一個(gè)最基本的認(rèn)識(shí)恰矩,其他很多mongo命令需要大家自己動(dòng)手操作和學(xué)習(xí)。MongoDB單節(jié)點(diǎn)環(huán)境搭建較簡(jiǎn)單憎蛤,但是可靠性得不到保證外傅,當(dāng)節(jié)點(diǎn)掛掉后,上層應(yīng)用服務(wù)也就直接中斷了俩檬。所以單節(jié)點(diǎn)環(huán)境只適合當(dāng)做測(cè)試環(huán)境萎胰,不可能在生產(chǎn)環(huán)境中使用。為了提供MongoDB服務(wù)的可靠性棚辽,在下一章我們一起學(xué)習(xí)下MongoDB復(fù)制集技竟。