一、什么是 Data-Intensive applications
Data-Intensive applications是相對于 Cpu-Intensive而言的寸认,由于摩爾定律的發(fā)展,cpu已經(jīng)不是瓶頸盾戴,而隨著大數(shù)據(jù)時代的到來油吭,導(dǎo)致Data-Intensive 稱為了新的關(guān)注點
二勾扭、Data Systems 關(guān)鍵的3個三個方面
databases矫钓,queue要尔,cache等,由于目前框架都支持多種傳統(tǒng)分類的功能新娜,因此可以將他們通通當(dāng)做data systems進(jìn)行處理
- 說一千赵辕,道一萬,對于一個 數(shù)據(jù)系統(tǒng)概龄,我們最關(guān)心的就3個还惠,reliablity,scalability私杜,maintainability
2.1 Reliablity
可持續(xù)地正確工作
設(shè)計一個 fault-tolerant 系統(tǒng)蚕键,有很多方面可以考慮,但反直覺的是歪今,人為的引發(fā)錯誤對系統(tǒng)也是有意義嚎幸。這是因為颜矿,很多情況下寄猩,嚴(yán)重的bug是源于糟糕的容錯能力,在開發(fā)骑疆,測試和生產(chǎn)上主動引發(fā)bug可以解決更嚴(yán)重的bug
例如:netflix的 chaos monkey
- hardware fault
通過備用電源等硬件技術(shù)可以粗略的估算一臺服務(wù)器可以平穩(wěn)工作數(shù)年田篇,但不是100%保證硬件系統(tǒng)不會宕機(jī) - software errors
第一部分是系統(tǒng)錯誤,這些很難處理箍铭。如千年蟲等泊柬,帶寬等。但這些問題很少诈火,每次發(fā)生都很嚴(yán)重 - human errors
最常見的fault了
2.2 Scalability
面向未來擴(kuò)展的角度兽赁,處理未來增長負(fù)載的能力
舉例:twitter的2種實現(xiàn)方式:
第一版twitter:所有人發(fā)出的tweet被插入一個中心化的tweets擂达,每個人讀取的時候钻趋,去tweets讀取自己發(fā)的和自己follow的人的tweet功炮,再merge返回瞧柔。
隨著規(guī)模擴(kuò)大很難持續(xù)第二版twitter瓢湃,為每個用戶維護(hù)一個時間線述吸,假設(shè)你發(fā)了一個tweet盏求,就會推送到每個follow你twitter用戶噪漾,那個用戶就加入到自己的時間線上充活,在放入緩存
這個潛在的問題時蜂莉,你維護(hù)的規(guī)模擴(kuò)大了蜡娶,假設(shè)某個明星有3000W的follow,此明星發(fā)一個tweet映穗,意味著要為3000W個用戶維護(hù)新增時間線內(nèi)容窖张,twitter設(shè)立了要在5s內(nèi)完成的目標(biāo)最終實現(xiàn),為大部分人采用維護(hù)單獨時間線方式蚁滋,因為一個人平均75個followee荤堪,但為少部分擁有很大規(guī)模follower的人,采用方案1的中心時間線枢赔。 read twitter的時候采用2者的結(jié)合澄阳,你關(guān)注的普通人就從你的時間線讀取,你關(guān)注的名人從中心時間線讀取踏拜,再結(jié)合在一起
關(guān)于指標(biāo):通常不采用平均時間碎赢,而是采用百分比,90%的用戶響應(yīng)時間等速梗。
2.3 Maintainability
legacy-system是一個令人頭痛的問題肮塞,你無法避免可能接收別人的爛代碼,但要盡量避免自己也對別人造成這樣的問題姻锁。
最重要是關(guān)注3方面:
- Operability
即操作順暢:這塊其實可以參考ElasticSearch
進(jìn)程狀態(tài)枕赵,heathly,錯誤的追蹤位隶,安全系統(tǒng)拷窜,相應(yīng)的輔助控制插件,即你可能關(guān)心的涧黄,最好都有相應(yīng)的支持 - Simplicity
從代碼到模塊設(shè)計到架構(gòu)篮昧,關(guān)鍵點就是抽象,抽象可明晰這個環(huán)節(jié)各個組成的功能范圍笋妥,減少復(fù)雜性 - Evolvablity/entensibility
三懊昨、數(shù)據(jù)模型和查詢語言
3.1 數(shù)據(jù)庫模型
- relational database
- NoSQL--not only SQL
優(yōu)點:1、scalability春宣,更大的吞吐量 2酵颁、商業(yè)上免費 3.傳統(tǒng)數(shù)據(jù)庫不支持的特殊查詢 4、不需要嚴(yán)格的關(guān)系型表月帝,使用更為靈活
3.2 Object-Relation Mismatch
指的就是 Object-oriented progreamming 和 SQL data model之前的錯位
因此產(chǎn)生了許多 ORM框架(Object-relational mapping)
舉例了一個 one-to-many 例子
每一個簡歷選項躏惋,如工作經(jīng)歷,可能還有很多
演變歷程
1.傳統(tǒng)數(shù)據(jù)庫:一個主表嫁赏,然后通過外鍵關(guān)聯(lián)其他表
2.later:數(shù)據(jù)庫支持row存儲 multi-valued data其掂,大大減少關(guān)聯(lián)的復(fù)雜度
3.第三種選擇:一個document包含所有,在one-to-many的情景中潦蝇,大大減少了復(fù)雜度
3.3 many-to-one 和 Many-to-many 關(guān)系的處理
Join 成本款熬,傳統(tǒng)數(shù)據(jù)庫新增數(shù)據(jù) join是非常簡單的深寥,但document并不是特別容易,設(shè)計時需要適合應(yīng)用贤牛,盡量 join-free
如這個例子惋鹅,將變動的工作經(jīng)歷,單獨作為了一個entity的引用殉簸,以減少整個大文檔的變動闰集。這在我理解中其實也是和關(guān)系型數(shù)據(jù)庫一樣,進(jìn)行了外鍵連接般卑,還有更為復(fù)雜的many-to-many關(guān)系武鲁,必須實際考慮修改的頻率,文檔的大小蝠检,服務(wù)器性能等因為沐鼠。
在這個簡歷的例子中,由于簡歷并不是一個更新頻率高的文檔叹谁,其實整個文檔重建的刷入性能消耗一點時間是完全可以接受的饲梭,并不需要特殊處理。使用文檔焰檩,加速查詢時的速度才是關(guān)鍵的
3.4 Query Languages for Data
這里將查詢分為2類憔涉,一類是 declarative query,如SQL析苫,CSS等兜叨,另一類是利用 imperative code去查詢?nèi)鏹ava等
2者的區(qū)別
- imperative code:如java使用DOM時,你知道每一步是如何解析的藤违,知道每一個細(xì)節(jié)
- declarative query:你只是提供了你所需數(shù)據(jù)的條件浪腐,符合這些的都會返回纵揍,數(shù)據(jù)引擎對于你封裝了實現(xiàn)細(xì)節(jié)顿乒,你不用去關(guān)心底層到底是如何得到這些數(shù)據(jù)的
- MapReduce 的query
MapReduce作為處理數(shù)據(jù)流的理念流行起來,那么對此應(yīng)該如何進(jìn)行查詢
MapReduce是介于 imperative code 和 imperative code 的一個維度 ,就是一個進(jìn)化未完成的東西泽谨,較低層次的編程模型
MongoDB的例子
db.observations.mapReduce(
function map() {
var year = this.observationTimestamp.getFullYear();
var month = this.observationTimestamp.getMonth() + 1;
emit(year + "-" + month, this.numAnimals);
},
function reduce(key, values) {
return Array.sum(values);
},
{
query: { family: "Sharks" },
out: "monthlySharkReport"
}
);
3.5 Graph-Like Data Models
many-to-many的關(guān)系璧榄,一般不選用document 模型,而使用relational database吧雹,但如果你的數(shù)據(jù)大部分全是many-to-many骨杂,哪怕你用了relational database,你的查詢?nèi)匀皇菑?fù)雜的雄卷。為應(yīng)對這種情況搓蚪,有專門的 graph-like Data Models進(jìn)行處理
Graph-Like Data Models 基本組成
- node (entities)
- edge (relationships)
舉例:
Social graphs
Vertices are people, and edges indicate which people know each other.
The web graph
Vertices are web pages, and edges indicate HTML links to other pages.
Road or rail networks
Vertices are junctions, and edges represent the roads or railway lines between
them.
為了集中重點,此部分寫在數(shù)據(jù)庫系列中
因為這塊圖不怎么了解丁鹉,寫在另一個篇中
http://www.reibang.com/p/830e7664f8b1
四妒潭、總結(jié)
主要講了3種數(shù)據(jù)模型悴能,relational,document雳灾,graph漠酿,這些是主要的,但為了很多特殊的用途谎亩,還有許多其他的模型
如基因組炒嘲,物理研究大數(shù)據(jù),全文搜索等