本篇將幫助讀者大體瞭解網絡存儲數據的大環境。初步認識分佈式系統,傳統型數據庫,NoSQL及歸屬其下的MongoDB。
先了解一下大環境
隨着網絡的普及,交互的數據量呈指數型增長。從最初的關係數據庫管理系統(RDBMS)便可以從容應對的業務操作到的NoSQL的提出並踐行。都是技術革新的必然結果
分佈式系統(分佈式系統)
由多臺計算機和通信的軟件組件通過計算機網絡連接(本地網絡或廣域網)組成。
分佈式系統是建立在網絡之上的軟件系統。正是因爲軟件的特性,所以分佈式系統具有高度的內聚性和透明性。
因此,網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操作系統),而不是硬件。
分佈式系統可以應用在不同的平臺上如:PC,工作站,局域網和廣域網上等。
優點
可靠性(容錯):
簡言之,就是一臺機子掛了不會影響到其他機子〜
可擴展性:
需要(有錢)的話,想加幾臺機子就加幾臺..
資源共享:
共享數據是必不可少的應用,如銀行,預訂系統。
靈活性:
便於安裝,實施和調試新的服務。
更快的速度:
分佈式計算系統可以有多臺計算機的計算能力,使得它比其他系統有更快的處理速度。
開放系統:
由於它是開放的系統,本地或者遠程都可以訪問到該服務。
更高的性能:
相較於集中式計算機網絡集羣可以提供更高的性能(及更好的性價比)。
缺點
故障排除:
故障排除和診斷問題。
軟件:
更少的軟件支持是分佈式計算系統的主要缺點。
網絡:
網絡基礎設施的問題,包括:傳輸問題,高負載,信息丟失等。
安全性:
開放系統的特性讓分佈式計算系統存在着數據的安全性和共享的風險等問題。
關係型數據庫
ACID規則
事務在英文中是交易,和現實世界中的交易很類似,它有如下四個特性:
- A(Atomicity)原子性
即事務中的所有組成行爲必須全部成功,否則回滾。
例:銀行轉賬,從甲賬戶轉100元至乙賬戶
分爲兩個步驟:
1)從一個賬戶取100元;
2)存入100元至乙賬戶。
這兩步要麼一起完成,要麼一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。
- C(Consistency)一致性
即事務的運行不會改變數據庫原本的一致性約束。
例如現有完整性約束A + B = 10,如果一個事務改變了一個,那麼必須得改變B,使得事務結束後依然滿足A + B = 10,否則事務失敗。
- I (Isolation) 獨立性
所謂的獨立性是指併發的事務之間不會互相影響,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。
例:A的銀行卡有存款10000元.B,C同時用A的卡消費了7000,4000元而產生了兩個併發的扣費事務。此時率先執行完畢並提交的事務會成功,而後執行的事務在執行時因另一個事務正在執行並未提交而讀到A的卡依然爲10000元,直至提交事務時被回滾。
- D(Durability)持久性
持久性是指一旦事務提交後,它所做的修改將會永久的保存在數據庫上,即使出現宕機也不會丟失。
非關係型數據庫
回到NoSQL的,用於超大規模數據的存儲。這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。
BASE規則
較於酸,這是一種弱規則。是的NoSQL數據庫通常對可用性及一致性的弱要求原則
- 基本上是Availble - 基本可用
- 軟狀態 - 軟狀態/柔性事務。“軟狀態”可以理解爲“無連接”的,而“硬狀態”是“面向連接”的
- 最終一致性 - 最終一致性,也是是ACID的最終目的。
那麼,爲什麼要用NoSQL的?
最主要的原因:數據量真的是太太太大了傳統數據庫表示無能爲力..
當然,並不是說的NoSQL比傳統數據庫更優秀就會取代啊什麼的。由於各具特點,他們在實際項目中其實是相輔相成的
RDBMS
- 規範化的數據
- 結構化查詢語言
- 數據和關係都存儲在
單獨的表中 - 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務
NoSQL
- 代表着不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
- 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理(布魯爾定理,見底注①)
- 高性能,高可用性和可伸縮性
以上全部,基本能對分佈式系統SQL / NoSQL有一個大概的瞭解,接下來講MongoDB
什麼是MongoDB的
MongoDB是由C ++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。
在高負載的情況下,添加更多的節點,可以保證服務器性能。
MongoDB將數據存儲爲一個文檔,數據結構由鍵值(key => value)對組成.MongoDB文檔類似於JSON對象。字段值可以包含其他文檔,數組及文檔數組。比如:
{
//field : value
name : "zhangsan",
age : 18,
score : "A",
groups : ["news","sports"]
}
MongoDB中的用處
爲WEB應用提供可擴展的高性能數據存儲解決方案。
簡單的講,就是作爲NoSQL的一員的屬性:解決傳統型數據庫最無力的大數據量處理業務
MongoDB中的特點
- MongoDB是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設置任何屬性的索引(如:FirstName =“Sameer”,Address =“8 Gandhi Road”)來實現更快的排序。
- 你可以通過本地或者網絡創建數據鏡像,這使得MongoDB中有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力),它可以分佈在計算機網絡中的其他節點上這就是所謂的分片。
- 蒙戈支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段。
- MongoDB的中的地圖/減少主要是用來對數據進行批量處理和聚合操作。
- 地圖和Reduce.Map函數調用EMIT(鍵,值)遍歷集合中所有的記錄,將鍵與值傳給減少函數進行處理。
- 地圖函數和減少函數是使用的JavaScript編寫的,並可以通過db.runCommand或MapReduce的命令來執行的MapReduce操作。
- GridFS的是MongoDB的中的一個內置功能,可以用於存放大量小文件。
- MongoDB的允許在服務端執行腳本,可以用使用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
- MongoDB的支持各種編程語言:RUBY,PYTHON,JAVA,C ++,PHP,C#等多種語言。
- MongoDB的安裝簡單。
MongoDB中的使用
以下是使用MongoDB在實際使用中要注意的地方(明確但不僅限隨時可能補充):
- MongoDB中並不請立即獲取iTunes事務(大多數的NoSQL似乎都不支持)。所以並不適用於複雜的事務邏輯操作
由於其分佈式的特點,導致一系列寫命令的操作要訪問的數據可能位於不同的分區服務器。這樣一來事務就變成分佈式事務,在分佈式事務中實現原子性需要彼此協調,這是很耗時間的。需要制定一個協議保證一個事務中的所有機器都操作成功
最致命的是,只要協調沒有全部完成,其他操作無法讀取事務中寫操作的結果,如果協調過程發現某個寫操作不能完成,先前寫成功的必須全部回滾。針對分佈式事務的分佈式協調對整體數據庫性能有嚴重影響,所以大部分的NoSQL選擇不提供分佈式事務。
那麼,MongoDB的能幹些啥?
Emmm ...
當前已知的項目應用中,一般用它來處理一些隨着時間數據量逐漸增大的表,比如訂單表,日誌表等...
雖然傳統型數據庫可以通過分表等操作來規避,但是時間一長,查詢什麼的還是會很麻煩
把這些表扔到MongoDB弄好片鍵分片,查詢就會簡單很多
(本篇暫且寫到這裏..東查西查了一大堆資料,再次衷心鳴謝大佬們!)
注
①CAP定理(布魯爾定理)
- 一致性(Consistency)(所有節點在同一時間具有相同的數據)
- 可用性(Availability)(保證每個請求不管成功或者失敗都有響應)
- 分隔容忍(Partition tolerance)(系統中任意信息的丟失或失敗不會影響系統的繼續運作)
CAP理論的核心是:一個分佈式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的滿足兩個。
因此,根據CAP原理將NoSQL數據庫分成了滿足CA原則,滿足CP原則和滿足AP原則三大類:
- CA - 單點集羣,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
- CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
- AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。