版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
CC++服務(wù)器開(kāi)發(fā)】中間件的含義及常?中間件介紹?、中間件的定義中間件這個(gè)術(shù)語(yǔ)第?次出現(xiàn)是1968年在德國(guó)加爾?施帕滕基興舉辦的NATO軟件?程?會(huì)結(jié)束后發(fā)表的?份報(bào)告中。這屆?會(huì)正式確定了軟件?程(SoftwareEngineering)的概念,同時(shí)還探討了軟件設(shè)計(jì)、?產(chǎn)和分發(fā)等主題。中間件(英語(yǔ):Middleware),?譯中間件、中介層,是?類提供系統(tǒng)軟件和應(yīng)?軟件之間連接、便于軟件各部件之間的溝通的軟件,應(yīng)?軟件可以借助中間件在不同的技術(shù)架構(gòu)之間共享信息與資源。中間件位于客戶機(jī)服務(wù)器的操作系統(tǒng)之上,管理著計(jì)算資源和?絡(luò)通信。–維基百科我們按照類別來(lái)看?些經(jīng)常會(huì)遇到的?些不是中間件的概念-業(yè)務(wù)平臺(tái)不是中間件,業(yè)務(wù)平臺(tái)是從服務(wù)的視?抽象的能同時(shí)?撐多個(gè)業(yè)務(wù),業(yè)務(wù)之間的信息能形成交互和增強(qiáng)的平臺(tái)。-營(yíng)銷(xiāo)?具不是中間件,營(yíng)銷(xiāo)?具是直接作?于最終消費(fèi)者?戶的軟件或者插件服務(wù)。-??/三??具包不是中間件,??/三??具包是在各種場(chǎng)景的程序開(kāi)發(fā)過(guò)程中沉淀的?些常??具類(功能)的集合,包含于軟件代碼本?。-SaaS不是中間件,SaaS(SoftwareasaService)更多的是?種軟件交付模式,?需?戶安裝,通過(guò)?絡(luò)在線訪問(wèn)的?種服務(wù)模式。-PaaS不是中間件,PaaS(PlatformasaService)將軟件研發(fā)的平臺(tái)做為?種服務(wù),提供軟件部署平臺(tái)(強(qiáng)調(diào)的是屏蔽系統(tǒng)和軟件細(xì)節(jié)的runtime平臺(tái))。從定義可以總結(jié)出評(píng)判的?個(gè)地?1.性質(zhì):中間件是軟件。2.作?層級(jí):系統(tǒng)軟件和應(yīng)?軟件之間、軟件各部件之間;管理客戶機(jī)與系統(tǒng)軟件之間的計(jì)算資源和?絡(luò)通信。3.服務(wù)對(duì)象:中間件為應(yīng)?軟件服務(wù),應(yīng)?軟件為最終?戶服務(wù),最終?戶并不直接使?中間件。中間件能給客戶帶來(lái)什么?為上層應(yīng)?軟件的開(kāi)發(fā)提供便捷的、開(kāi)箱即?的服務(wù)交互和計(jì)算的能?,縮短開(kāi)發(fā)周期;屏蔽底層runtime的差異;節(jié)省應(yīng)?本?的系統(tǒng)資源,減少運(yùn)?成本。什么時(shí)候使?中間件基于中間件的定義我們知道中間件是連接軟件與系統(tǒng)之間的服務(wù),那么我們什么時(shí)候使?了中間件,在哪些地??到了中間件了。我們不妨假設(shè)?個(gè)http請(qǐng)求過(guò)程來(lái)窺視?番。當(dāng)你在瀏覽器中輸??個(gè)?址時(shí),它會(huì)通過(guò)DNS解析到?標(biāo)服務(wù)注冊(cè)的公?IP地址請(qǐng)求到達(dá)?標(biāo)服務(wù)的web反向代理服務(wù)器Tengine之后,經(jīng)過(guò)?定的過(guò)濾轉(zhuǎn)發(fā)到?標(biāo)服務(wù)A上服務(wù)A通過(guò)RPC框架Dubbo請(qǐng)求服務(wù)B的結(jié)果做中間計(jì)算,并且從Tair緩存中讀取計(jì)算因?,計(jì)算結(jié)果服務(wù)A接著使?Druid通過(guò)TDDL寫(xiě)?計(jì)算結(jié)果到MySQLMaster節(jié)點(diǎn)然后返回結(jié)果異步過(guò)程中Canal通過(guò)模擬Binlog主從復(fù)制的原理,迅速將這條Binlog消費(fèi)并下發(fā)到消息隊(duì)列RocketMQ服務(wù)C通過(guò)RocketMQ消費(fèi)到事件之后,通過(guò)配置中?ConfigServer拉取到的策略進(jìn)?對(duì)應(yīng)策略的事件處理。這個(gè)過(guò)程中我們使?了?系列的中間件來(lái)協(xié)同各個(gè)微服務(wù)完成整個(gè)流程,如web反向代理服務(wù)器Tengine、RPC框架Dubbo、緩存Tair、連接池Driud、數(shù)據(jù)庫(kù)代理層TDDL、Binlog同步?具Canal、消息隊(duì)列RocketMQ、配置中?ConfigServer。-路由與web服務(wù)器:處理和轉(zhuǎn)發(fā)其他服務(wù)器通信數(shù)據(jù)的服務(wù)器。如被業(yè)界?泛使?的阿?基于Nginx研發(fā)的Tengine、阿?內(nèi)部的集中式路由服務(wù)VipServer-RPC框架:微服務(wù)時(shí)代的遠(yuǎn)程服務(wù)調(diào)?框架。如grpc,Thrift,阿?的HSF,Dubbo,SOFA-RPC-消息中間件:?持在分布式系統(tǒng)之間發(fā)送和接收消息的軟件。如Apachekafka,ApacheRabbitMQ,NSQ,阿?孵化開(kāi)源的ApacheRocketMQ-緩存服務(wù):分布式的?速數(shù)據(jù)存儲(chǔ)層,?般是內(nèi)存存儲(chǔ)。如阿?Tair,業(yè)界的Redis,Memcached,Ehcache-配置中?:?來(lái)統(tǒng)?管理各個(gè)項(xiàng)?中所有配置的系統(tǒng)。如阿?Nacos、攜程Apollo、百度Disconf-分布式事務(wù):事務(wù)的參與者、?持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上。如阿?seata、騰訊DTF-任務(wù)調(diào)度:分布式環(huán)境下提供定時(shí)、任務(wù)編排、分布式跑批等功能的系統(tǒng)。如阿?SchedulerX、業(yè)界xxl-job、當(dāng)當(dāng)elastic-job、有贊TSP-數(shù)據(jù)庫(kù)層?于?持彈性擴(kuò)容和分庫(kù)分表的TDDL,數(shù)據(jù)庫(kù)連接池Driud,Binlog同步的Canal等。隨著云時(shí)代的到來(lái),?量公司的業(yè)務(wù)向云上遷移;為了云上客戶能夠便捷的使?穩(wěn)定?效的中間件能?,云?商開(kāi)始將??沉淀的基礎(chǔ)中間件能?云化,?于?撐各個(gè)云上客戶和??業(yè)務(wù)的快速?長(zhǎng)。?、中間件的開(kāi)發(fā)隨著國(guó)內(nèi)軟件?業(yè)的發(fā)展,國(guó)內(nèi)互聯(lián)?公司規(guī)模越來(lái)越?,業(yè)務(wù)越來(lái)越復(fù)雜,隨之使??量的中間件來(lái)提?后臺(tái)服務(wù)性能。由此產(chǎn)?了中間件開(kāi)發(fā)和維護(hù)?員。誠(chéng)然,在?公司,中間件,例如緩存,MQ,RPC等服務(wù),極?可能是由業(yè)務(wù)開(kāi)發(fā)?員??維護(hù),或者委托第三?云平臺(tái)運(yùn)維(?付?些費(fèi)?)。但,如果后臺(tái)開(kāi)發(fā)超過(guò)200?,基本就會(huì)組建??的中間件或者基礎(chǔ)架構(gòu)團(tuán)隊(duì),?于維護(hù)后臺(tái)服務(wù)器基礎(chǔ)架構(gòu)和中間件。更?規(guī)模的公司,則由于各種各樣的原因(性能,KPI),會(huì)??開(kāi)發(fā)中間件,簡(jiǎn)稱?研。這要求中間件團(tuán)隊(duì)需要更多的?員。既然需要中間件開(kāi)發(fā)?員,那么中間件開(kāi)發(fā)?員?般從哪?招聘呢?招聘的要求是什么?通常,?個(gè)公司在剛開(kāi)始組建中間件團(tuán)隊(duì)的時(shí)候,都會(huì)從公司內(nèi)部挑選精英?才,或者挑選對(duì)中間件感興趣的?才。這時(shí)候,可能你沒(méi)有相關(guān)經(jīng)驗(yàn),但你仍然有機(jī)會(huì)參與到中間件開(kāi)發(fā)中。反之,如果你沒(méi)有中間件開(kāi)發(fā)經(jīng)驗(yàn),想通過(guò)招聘的?式進(jìn)?中間件?業(yè),那么相對(duì)??,會(huì)有些曲折。那么,假設(shè),你想從事中間件開(kāi)發(fā),但,你沒(méi)有中間件開(kāi)發(fā)經(jīng)驗(yàn),且,你的公司也沒(méi)有組建中間件團(tuán)隊(duì)的打算。該怎么突破?答:跳槽。跳槽到別的公司的中間件團(tuán)隊(duì)。這?就涉及到了?個(gè)中間件團(tuán)隊(duì)需要哪些技能。因?yàn)樘劭隙ň鸵?試,如果你?試的是中間件崗位,那么?然,就需要準(zhǔn)備中間件的相關(guān)知識(shí)。另外,還有?點(diǎn),在這個(gè)分?明確的時(shí)代,即使是中間件,也有很多種類,我這?稍微分?下,可能不是很準(zhǔn)確。1.服務(wù)治理中間件,例如RPC相關(guān)中間件,限流熔斷,鏈路追蹤,分布式配置中?等等。你可以從SpringCloud?找到相關(guān)的產(chǎn)品。當(dāng)然國(guó)內(nèi)也有很多優(yōu)秀的產(chǎn)品。2.存儲(chǔ)中間件,例如緩存,MQ等等,如果存儲(chǔ)涉及到分布式(通常都會(huì)涉及),那么要求相對(duì)較?。3.各種Proxy,不論是數(shù)據(jù)庫(kù),還是Cache,還是各種存儲(chǔ),通常單機(jī)?法承載海量數(shù)據(jù),?較簡(jiǎn)單的辦法就是使?Proxy進(jìn)?代理,讓?xiě)?yīng)?透明的使?集群。出于性能考慮,這?通常會(huì)使?性能較?的產(chǎn)品,例如goLang,C++等。Java的長(zhǎng)處——開(kāi)發(fā)效率,在這個(gè)地?權(quán)重不?。4.各種分布式中間件,例如ZK這種,這個(gè)我個(gè)?認(rèn)為難度是較?的。分布式向來(lái)是軟件開(kāi)發(fā)中?較困難的?個(gè)點(diǎn)。特別是涉及到存儲(chǔ)和?致性。5.回到之前的話題:?個(gè)中間件開(kāi)發(fā)者需要哪些素質(zhì)?1.語(yǔ)?基礎(chǔ)。從Java程序員的?度,基礎(chǔ)通常就是:集合,并發(fā),JVM,Netty,IO、NIO(mmap,sendfile)2.計(jì)算機(jī)基礎(chǔ),由于中間件開(kāi)發(fā)?員經(jīng)常和OS打交道,所以計(jì)算機(jī)基礎(chǔ)也必不可少,例如?件系統(tǒng)(IO/磁盤(pán)),進(jìn)程線程,內(nèi)存管理。3.?絡(luò)基礎(chǔ),搞后臺(tái)的?員,肯定要對(duì)?絡(luò)熟悉了,熟悉在Linux下排查?絡(luò)問(wèn)題,熟悉Epoll原理等。4.分布式相關(guān)知識(shí),互聯(lián)?海量數(shù)據(jù)背景下,分布式知識(shí)必不可少,CAP,Paxos,Raft,zab,2pc,3pc,base等等。最好能根據(jù)這些理論寫(xiě)出實(shí)現(xiàn)代碼。5.熟悉開(kāi)源實(shí)現(xiàn),即使你是業(yè)務(wù)開(kāi)發(fā)?員,你也100%會(huì)接觸開(kāi)源項(xiàng)?,例如Spring,那么,通常你需要對(duì)這種常?的開(kāi)源代碼有深刻的理解,不僅知曉其原理,也領(lǐng)會(huì)其設(shè)計(jì)。從?的?度看,你得看清整個(gè)框架的背景,設(shè)計(jì)和取舍,從?的?度看,你得看清框架的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),有哪些有趣的地?(通常這種框架都會(huì)進(jìn)?性能優(yōu)化)。6.了解?業(yè)風(fēng)向標(biāo),中間件?業(yè)和業(yè)務(wù)開(kāi)發(fā)稍有不同,每個(gè)中間件的版本升級(jí)都會(huì)讓該領(lǐng)域的開(kāi)發(fā)者們側(cè)?(類似iPhone發(fā)布會(huì)),了解其特性,進(jìn)?了解?業(yè)趨勢(shì),最后成為?業(yè)引領(lǐng)。好,說(shuō)完了中間件開(kāi)發(fā)?員需要哪些素質(zhì),?然,如何成為中間件開(kāi)發(fā)?員,就不??明了。說(shuō)?了,以上6個(gè)點(diǎn),都是硬?頭。對(duì)于已經(jīng)開(kāi)始?作的?來(lái)說(shuō),需要平時(shí)深刻的積累,說(shuō)的難聽(tīng)?點(diǎn),如果你的業(yè)務(wù)開(kāi)發(fā)任務(wù)很重,你很難搞定上門(mén)的這些內(nèi)容。對(duì)于還在上學(xué)的同學(xué)來(lái)說(shuō),很爽,你可以?學(xué)校(不僅僅指?學(xué),據(jù)我所知的?神,通常是初中/?學(xué)就開(kāi)始編程,但這不是必須的)??把的時(shí)間來(lái)學(xué)習(xí),?個(gè)個(gè)的搞定這些知識(shí)點(diǎn),和社招不同,如果你的知識(shí)達(dá)到上?的?平,那么SPoffer應(yīng)該是隨便拿了:)我這?重點(diǎn)和那些平時(shí)開(kāi)發(fā)任務(wù)不重,想搞中間件的同學(xué)聊聊。我假設(shè)你是?個(gè)?作3年以內(nèi)的Java開(kāi)發(fā)?員,且你可能是培訓(xùn)?,半路出家,科班?,?專?,初中?,且你不在??,通常在?個(gè)后臺(tái)開(kāi)發(fā)不超過(guò)200?的創(chuàng)業(yè)公司,title是“Java開(kāi)發(fā)?程師”,并且有?個(gè)程序員的夢(mèng)想,不想get、set,不想crud,不想html填空,不想和產(chǎn)品同學(xué)討論,也不想和測(cè)試同學(xué)點(diǎn)點(diǎn)點(diǎn)…(感覺(jué)這?會(huì)得罪?=_=||)你可能想跳槽。那么你?概需要做以下準(zhǔn)備:1.鞏固Java基礎(chǔ),集合源碼,并發(fā)源碼,JVM原理,Netty原理源碼,IO相關(guān)(涉及到零拷貝?件存儲(chǔ)),這些都是Java基礎(chǔ),通常是必須的。2.分布式原理,最起碼知曉理論知識(shí),最好能寫(xiě)?個(gè),哪怕參照開(kāi)源的也?。3.源碼,SpringMybatisTomcat等等,這些代碼通常是你最先接觸的,不妨從這?開(kāi)始。RPC中間件相關(guān)的,Dubbo,Motan,SOFA,挑?個(gè)吧,推薦SOFA。4.再熟悉熟悉(熟悉指源碼和設(shè)計(jì))分布式的相關(guān)產(chǎn)品,假設(shè)你是Java開(kāi)發(fā),推薦RocketMQ,Apollo配置中?等等中間件,其實(shí)都可以,MQ相對(duì)復(fù)雜。5.操作系統(tǒng),通常,你在研究上?的內(nèi)容時(shí),會(huì)遇到操作系統(tǒng)的疑問(wèn),遇到不要繞過(guò),盡量弄明?。6.??的產(chǎn)品,有就最好了,例如公眾號(hào),博客,教學(xué)視頻,GitHub項(xiàng)?等等,總之,是拿得出?的東西。7.加??好友,了解?業(yè)風(fēng)向標(biāo)。也許你是?個(gè)矜持的?,但從事了這個(gè)?業(yè),你有必要和?業(yè)?優(yōu)秀的?學(xué)習(xí)(看看朋友圈就好)。三、和NoSQL之前寫(xiě)了?篇關(guān)于數(shù)據(jù)庫(kù)的基礎(chǔ)博客:下?來(lái)看看NoSQL的含義。關(guān)系型數(shù)據(jù)庫(kù)建?在關(guān)系型數(shù)據(jù)模型的基礎(chǔ)上,是借助于集合代數(shù)等數(shù)學(xué)概念和?法來(lái)處理數(shù)據(jù)的數(shù)據(jù)庫(kù)?,F(xiàn)實(shí)世界中的各種實(shí)體以及實(shí)體之間的各種聯(lián)系均可?關(guān)系模型來(lái)表?,市場(chǎng)上占很?份額的Oracle、、DB2等都是?向關(guān)系模型的DBMS。在關(guān)系型數(shù)據(jù)庫(kù)中,實(shí)體以及實(shí)體間的聯(lián)系均由單?的結(jié)構(gòu)類型來(lái)表?,這種邏輯結(jié)構(gòu)是?張?維表。圖1所?的學(xué)?選課系統(tǒng)中,實(shí)體和實(shí)體間聯(lián)系在數(shù)據(jù)庫(kù)中的邏輯結(jié)構(gòu)可通過(guò)圖2所?。圖1:關(guān)系型數(shù)據(jù)庫(kù)圖2:學(xué)?選課系統(tǒng)數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)關(guān)系型數(shù)據(jù)庫(kù)以?和列的形式存儲(chǔ)數(shù)據(jù),這?系列的?和列被稱為表,?組表組成了數(shù)據(jù)庫(kù)。圖3所?的員?信息表就是關(guān)系型數(shù)據(jù)庫(kù)。圖3:?jiǎn)T?信息表屬性說(shuō)明:?維表:也稱為關(guān)系,它是?系列?維數(shù)組的集合,?來(lái)代表與存儲(chǔ)數(shù)據(jù)對(duì)象之間的關(guān)系。它由縱向的列和橫向的?組成。?:也叫元組或記錄,在表中是?條橫向的數(shù)據(jù)集合,代表?個(gè)實(shí)體。列:也叫字段或?qū)傩裕诒碇惺?條縱?的數(shù)據(jù)集合。列也定義了表中的。主屬性:關(guān)系中的某?屬性組,若它們的值唯?地標(biāo)識(shí)?個(gè)記錄,則稱該屬性組為主屬性或主鍵。主屬性可以是?個(gè)屬性,也可以由多個(gè)屬性共同組成。在圖1-5中,學(xué)號(hào)是學(xué)?信息表的主屬性,但是課程信息表中,學(xué)號(hào)和課程號(hào)共同唯?地標(biāo)識(shí)了?條記錄,所以學(xué)號(hào)和課程號(hào)?起組成了課程信息表的主屬性。結(jié)構(gòu)化查詢語(yǔ)?關(guān)系型數(shù)據(jù)庫(kù)的核?是其結(jié)構(gòu)化的查詢語(yǔ)?(StructuredQueryLanguage,SQL),SQL涵蓋了數(shù)據(jù)的查詢、操縱、定義和控制,是?個(gè)綜合的、通?的且簡(jiǎn)單易懂的數(shù)據(jù)庫(kù)管理語(yǔ)?。同時(shí)SQL?是?種?度?過(guò)程化的語(yǔ)?,數(shù)據(jù)庫(kù)管理者只需要指出做什么,?不需要指出該怎么做即可完成對(duì)數(shù)據(jù)庫(kù)的管理。SQL可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)全?命周期的所有操作,所以SQL?產(chǎn)?之?起就成了檢驗(yàn)關(guān)系型數(shù)據(jù)庫(kù)管理能?的“試??”,SQL標(biāo)準(zhǔn)的每?次變更和完善都引導(dǎo)著關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)展?向。SQL包含以下四個(gè)部分。)DDL包括CREATE、DROP、ALTER等動(dòng)作。在數(shù)據(jù)庫(kù)中使?CREATE來(lái)創(chuàng)建新表,DROP來(lái)刪除表,ALTER負(fù)責(zé)數(shù)據(jù)庫(kù)對(duì)象的修改。例如,創(chuàng)建學(xué)?信息表使?以下命令:CREATETABLEStuInfo(idint(10)NOTNULL,PRIMARYKEY(id),namevarchar(20),femalebool,classvarchar(20));)DQL負(fù)責(zé)進(jìn)?數(shù)據(jù)查詢,但是不會(huì)對(duì)數(shù)據(jù)本?進(jìn)?修改。DQL的語(yǔ)法結(jié)構(gòu)如下:SELECTFROM表名1,表2where查詢條件#可以組合and、or、not、=、between、and、in、like等;groupby分組字段having(分組后的過(guò)濾條件)orderby排序字段和規(guī)則;)DML負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)對(duì)象運(yùn)?數(shù)據(jù)訪問(wèn)?作的指令集,以INSERT、UPDATE、DELETE三種指令為核?,分別代表插?、更新與刪除。向表中插?數(shù)據(jù)命令如下:INSERT表名(字段1,字段2,…,字段n,)VALUES(字段1值,字段2值,…,字段n值)where查詢條件;)DCL是?種可對(duì)數(shù)據(jù)訪問(wèn)權(quán)進(jìn)?控制的指令。它可以控制特定?戶賬戶對(duì)查看表、預(yù)存程序、?戶?定義函數(shù)等數(shù)據(jù)庫(kù)操作的權(quán)限,由GRANT和REVOKE兩個(gè)指令組成。DCL以控制?戶的訪問(wèn)權(quán)限為主,GRANT為授權(quán)語(yǔ)句,對(duì)應(yīng)的REVOKE是撤銷(xiāo)授權(quán)語(yǔ)句。關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)發(fā)展了數(shù)?年,其理論知識(shí)、相關(guān)技術(shù)和產(chǎn)品都趨于完善,是?前世界上應(yīng)?最?泛的數(shù)據(jù)庫(kù)系統(tǒng)。容易理解:?維表結(jié)構(gòu)?常貼近邏輯世界的概念,關(guān)系型數(shù)據(jù)模型相對(duì)層次型數(shù)據(jù)模型和?狀型數(shù)據(jù)模型等其他模型來(lái)說(shuō)更容易理解。使??便:通?的SQL使?戶操作關(guān)系型數(shù)據(jù)庫(kù)?常?便。易于維護(hù):豐富的完整性??減少了數(shù)據(jù)冗余和數(shù)據(jù)不?致的問(wèn)題。關(guān)系型數(shù)據(jù)庫(kù)提供對(duì)事務(wù)的?持,能保證系統(tǒng)中事務(wù)的正確執(zhí)?,同時(shí)提供事務(wù)的恢復(fù)、回滾、并發(fā)控制和死鎖問(wèn)題的解決。隨著各類互聯(lián)?業(yè)務(wù)的發(fā)展,關(guān)系型數(shù)據(jù)庫(kù)難以滿?對(duì)海量數(shù)據(jù)的處理需求,存在以下不?。?并發(fā)讀寫(xiě)能?差:?站類?戶的并發(fā)性訪問(wèn)?常?,??臺(tái)數(shù)據(jù)庫(kù)的最?連接數(shù)有限,且硬盤(pán)I/O有限,不能滿?很多?同時(shí)連接。對(duì)海量數(shù)據(jù)的讀寫(xiě)效率低:若表中數(shù)據(jù)量太?,則每次的讀寫(xiě)速率都將?常緩慢。擴(kuò)展性差:在?般的關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)中,通過(guò)升級(jí)數(shù)據(jù)庫(kù)服務(wù)器的硬件配置可提?數(shù)據(jù)處理的能?,即縱向擴(kuò)展。但縱向擴(kuò)展終會(huì)達(dá)到硬件性能的瓶頸,?法應(yīng)對(duì)互聯(lián)?數(shù)據(jù)爆炸式增長(zhǎng)的需求。還有?種擴(kuò)展?式是橫向擴(kuò)展,即采?多臺(tái)計(jì)算機(jī)組成集群,共同完成對(duì)數(shù)據(jù)的存儲(chǔ)、管理和處理。這種橫向擴(kuò)展的集群對(duì)數(shù)據(jù)進(jìn)?分散存儲(chǔ)和統(tǒng)?管理,可滿?對(duì)海量數(shù)據(jù)的存儲(chǔ)和處理的需求。但是由于關(guān)系型數(shù)據(jù)庫(kù)具有數(shù)據(jù)模型、完整性約束和事務(wù)的強(qiáng)?致性等特點(diǎn),導(dǎo)致其難以實(shí)現(xiàn)?效率的、易橫向擴(kuò)展的分布式架構(gòu)。數(shù)據(jù)是當(dāng)今世界最有價(jià)值的資產(chǎn)之?。在時(shí)代,?們?產(chǎn)、收集數(shù)據(jù)的能???提升,但是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在可擴(kuò)展性、數(shù)據(jù)模型和可?性??已遠(yuǎn)遠(yuǎn)不能滿?當(dāng)前的數(shù)據(jù)處理需求,因此,各種數(shù)據(jù)庫(kù)系統(tǒng)應(yīng)運(yùn)??。NoSQL數(shù)據(jù)庫(kù)不像關(guān)系型數(shù)據(jù)庫(kù)那樣都有相同的特點(diǎn),遵循相同的標(biāo)準(zhǔn)。NoSQL數(shù)據(jù)庫(kù)類型多樣,可滿?不同場(chǎng)景的應(yīng)?需求,因此取得了巨?的成功。NoSQL數(shù)據(jù)庫(kù)基本理念是以犧牲事務(wù)機(jī)制和強(qiáng)?致性機(jī)制,來(lái)獲取更好的分布式部署能?和橫向擴(kuò)展能?,創(chuàng)造出新的數(shù)據(jù)模型,使其在不同的應(yīng)?場(chǎng)景下,對(duì)特定業(yè)務(wù)數(shù)據(jù)具有更強(qiáng)的處理性能。NoSQL數(shù)據(jù)庫(kù)最初是為了滿?互聯(lián)?的業(yè)務(wù)需求?誕?的,互聯(lián)?數(shù)據(jù)具有?量化、多樣化、快速化等特點(diǎn)。在信息化時(shí)代背景下,互聯(lián)?數(shù)據(jù)增長(zhǎng)迅猛,數(shù)據(jù)集合規(guī)模已實(shí)現(xiàn)從GB、PB到ZB的飛躍。數(shù)據(jù)不僅僅是傳統(tǒng)的結(jié)構(gòu)化數(shù)據(jù),還包含了?量的?結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),關(guān)系型數(shù)據(jù)庫(kù)?法存儲(chǔ)此類數(shù)據(jù)。因此,很多互聯(lián)?公司著?研發(fā)新型的、?關(guān)系型的數(shù)據(jù)庫(kù),這類?關(guān)系型數(shù)據(jù)庫(kù)統(tǒng)稱為NoSQL數(shù)據(jù)庫(kù),其主要優(yōu)勢(shì)如下。互聯(lián)?數(shù)據(jù)如?站?戶信息、地理位置數(shù)據(jù)、社交圖譜、?戶產(chǎn)?的內(nèi)容、機(jī)器?志數(shù)據(jù)以及傳感器數(shù)據(jù)等,正在快速改變著?們的通信、購(gòu)物、?告、娛樂(lè)等?常?活,沒(méi)有使?這些數(shù)據(jù)的應(yīng)?很快就會(huì)被?戶所遺忘。開(kāi)發(fā)者希望使??常靈活的數(shù)據(jù)庫(kù),容納新的數(shù)據(jù)類型,并且不會(huì)被第三?數(shù)據(jù)提供商的變化所影響。關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)模型定義嚴(yán)格,?法快速容納新的數(shù)據(jù)類型。例如,若要存儲(chǔ)客戶的電話號(hào)碼、姓名、地址、城市等信息,則SQL數(shù)據(jù)庫(kù)需要提前知曉要存儲(chǔ)的是什么。這對(duì)于敏捷開(kāi)發(fā)模式來(lái)說(shuō)?分不?便,因?yàn)槊看瓮瓿尚绿匦詴r(shí),通常都需要改變數(shù)據(jù)庫(kù)的模式。NoSQL數(shù)據(jù)庫(kù)提供的數(shù)據(jù)模型則能很好地滿?這種需求,各種應(yīng)?可以通過(guò)這種靈活的數(shù)據(jù)模型存儲(chǔ)數(shù)據(jù)??須修改表;或者只需增加更多的列,?須進(jìn)?數(shù)據(jù)的遷移。對(duì)企業(yè)來(lái)說(shuō),關(guān)系型數(shù)據(jù)庫(kù)?開(kāi)始是普遍的選擇。然?,在使?關(guān)系型數(shù)據(jù)庫(kù)的過(guò)程中卻遇到了越來(lái)越多的問(wèn)題,原因在于它們是中?化的,是縱向擴(kuò)展?不是橫向擴(kuò)展的。這使得它們不適合那些需要簡(jiǎn)單且動(dòng)態(tài)可伸縮性的應(yīng)?。NoSQL數(shù)據(jù)庫(kù)從?開(kāi)始就是分布式、橫向擴(kuò)展的,因此?常適合互聯(lián)?應(yīng)?分布式的特性。在互聯(lián)?應(yīng)?中,當(dāng)數(shù)據(jù)庫(kù)服務(wù)器?法滿?數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)訪問(wèn)的需求時(shí),只需要增加多臺(tái)服務(wù)器,將?戶請(qǐng)求分散到多臺(tái)服務(wù)器上,即可減少單臺(tái)服務(wù)器的性能瓶頸出現(xiàn)的可能性。由于關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)的是結(jié)構(gòu)化的數(shù)據(jù),所以通常采?縱向擴(kuò)展,即單臺(tái)服務(wù)器要持有整個(gè)數(shù)據(jù)庫(kù)來(lái)確??煽啃耘c數(shù)據(jù)的持續(xù)可?性。這樣做的代價(jià)是?常昂貴的,?且擴(kuò)展也會(huì)受到限制。針對(duì)這種問(wèn)題的解決?案就是橫向擴(kuò)展,即添加服務(wù)器?不是擴(kuò)展單臺(tái)服務(wù)器的處理能?。NoSQL數(shù)據(jù)庫(kù)通常都?持?動(dòng)分?,這意味著它們會(huì)?動(dòng)地在多臺(tái)服務(wù)器上分發(fā)數(shù)據(jù),?不需要應(yīng)?程序增加額外的操作。NoSQL數(shù)據(jù)庫(kù)?持?動(dòng)復(fù)制。在NoSQL數(shù)據(jù)庫(kù)分布式集群中,服務(wù)器會(huì)?動(dòng)對(duì)數(shù)據(jù)進(jìn)?備份,即將?份數(shù)據(jù)復(fù)制存儲(chǔ)在多臺(tái)服務(wù)器上。因此,當(dāng)多個(gè)?戶訪問(wèn)同?數(shù)據(jù)時(shí),可以將?戶請(qǐng)求分散到多臺(tái)服務(wù)器中。同時(shí),當(dāng)某臺(tái)服務(wù)器岀現(xiàn)故障時(shí),其他服務(wù)器的數(shù)據(jù)可以提供備份,即NoSQL數(shù)據(jù)庫(kù)的分布式集群具有?可?性與災(zāi)備恢復(fù)的能?。需要通過(guò)分布式的集群?式來(lái)解決存儲(chǔ)和訪問(wèn)的問(wèn)題。分布式系統(tǒng)的核?理念是讓多臺(tái)服務(wù)器協(xié)同?作,完成單臺(tái)服務(wù)器?法處理的任務(wù),尤其是?并發(fā)或者?數(shù)據(jù)量的任務(wù)。分布式數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)技術(shù)與?絡(luò)技術(shù)相結(jié)合的產(chǎn)物,它通過(guò)?絡(luò)技術(shù)將物理上分開(kāi)的數(shù)據(jù)庫(kù)連接在?起,進(jìn)?邏輯層?上的集中管理。在分布式數(shù)據(jù)庫(kù)系統(tǒng)中,?個(gè)應(yīng)?程序可以對(duì)數(shù)據(jù)庫(kù)進(jìn)?透明操作,數(shù)據(jù)庫(kù)中的數(shù)據(jù)分別存儲(chǔ)在不同的局部數(shù)據(jù)庫(kù)中,由不同機(jī)器上不同的DBMS進(jìn)?管理,其的體系結(jié)構(gòu)如下圖所?。分布式數(shù)據(jù)處理使?分?治之的辦法來(lái)解決?規(guī)模數(shù)據(jù)管理問(wèn)題,它處理數(shù)據(jù)的基本特點(diǎn)如下。在分布式系統(tǒng)中,數(shù)據(jù)不是存儲(chǔ)在?個(gè)場(chǎng)地上,?是存儲(chǔ)在計(jì)算機(jī)?絡(luò)的多個(gè)場(chǎng)地上。但邏輯上是?個(gè)整體,它們被所有?戶共享,并由?個(gè)DBMS統(tǒng)?管理。?戶訪問(wèn)數(shù)據(jù)時(shí)?須指出數(shù)據(jù)存放在哪?,也不需要知道由分布式系統(tǒng)中的哪臺(tái)服務(wù)器來(lái)完成。分布式數(shù)據(jù)的復(fù)制有助于提?性能,更易于協(xié)調(diào)不同??沖突的?戶需求。同時(shí),當(dāng)某臺(tái)服務(wù)器出現(xiàn)故障時(shí),此服務(wù)器上的數(shù)據(jù)在其他服務(wù)器上還有備份,提?了系統(tǒng)的可?性。這種多副本的?式對(duì)?戶來(lái)說(shuō)是透明的,即?戶不需要知道副本的存在,由系統(tǒng)統(tǒng)?管理、協(xié)調(diào)副本的調(diào)?。分布式數(shù)據(jù)處理具有重復(fù)的構(gòu)成,因此消除了單點(diǎn)故障的問(wèn)題,即系統(tǒng)中?個(gè)或多個(gè)服務(wù)器發(fā)送故障不會(huì)使整個(gè)系統(tǒng)癱瘓,從?提?了系統(tǒng)的可靠性。但是在分布式系統(tǒng)中,事務(wù)是并發(fā)的,即不同?戶可能在同?時(shí)間對(duì)同?數(shù)據(jù)源進(jìn)?訪問(wèn),這就要求系統(tǒng)?持分布式的并發(fā)控制,保證系統(tǒng)中數(shù)據(jù)的?致。分布式系統(tǒng)可以解決海量數(shù)據(jù)的存儲(chǔ)和訪問(wèn),但是在分布式環(huán)境下,數(shù)據(jù)庫(kù)會(huì)遇到更為復(fù)雜的問(wèn)題,舉例如下。數(shù)據(jù)在分布式環(huán)境下以多副本?式進(jìn)?存儲(chǔ),那么,在為?戶提供數(shù)據(jù)訪問(wèn)時(shí)如何選擇?個(gè)副本,或者?戶修改了某?副本的數(shù)據(jù),如何讓系統(tǒng)中每個(gè)副本都得到更新。如果正在更新系統(tǒng)所有副本信息時(shí),某個(gè)服務(wù)器由于?絡(luò)或硬、軟件功能出現(xiàn)問(wèn)題導(dǎo)致其發(fā)?故障。在這種情況下,如何確保故障恢復(fù)時(shí),此服務(wù)器上的副本與其他副本?致。這些問(wèn)題給分布式數(shù)據(jù)庫(kù)管理系統(tǒng)帶來(lái)了挑戰(zhàn),它們是分布式系統(tǒng)固有的復(fù)雜性,但更重要的是對(duì)分布數(shù)據(jù)的管理,控制數(shù)據(jù)之間的?致性以及數(shù)據(jù)訪問(wèn)的安全性。CAP理論是針對(duì)分布式數(shù)據(jù)庫(kù)??的,它是指在?個(gè)分布式系統(tǒng)中,?致性(Consistency,C)、可?性(Availability,A)、分區(qū)容錯(cuò)性(PartitionTolerance,P)三者不可兼得。)?致性是指“allnodesseethesamedataatthesametime”,即更新操作成功后,所有節(jié)點(diǎn)在同?時(shí)間的數(shù)據(jù)完全?致。?致性可以分為客戶端和服務(wù)端兩個(gè)不同的視?:從客戶端?度來(lái)看,?致性主要指多個(gè)?戶并發(fā)訪問(wèn)時(shí)更新的數(shù)據(jù)如何被其他?戶獲取的問(wèn)題;從服務(wù)端來(lái)看,?致性則是?戶進(jìn)?數(shù)據(jù)更新時(shí)如何將數(shù)據(jù)復(fù)制到整個(gè)系統(tǒng),以保證數(shù)據(jù)的?致。?致性是在并發(fā)讀寫(xiě)時(shí)才會(huì)出現(xiàn)的問(wèn)題,因此在理解?致性的問(wèn)題時(shí),?定要注意結(jié)合考慮并發(fā)讀寫(xiě)的場(chǎng)景。)可?性是指“readsandwritesalwayssucceed”,即?戶訪問(wèn)數(shù)據(jù)時(shí),系統(tǒng)是否能在正常響應(yīng)時(shí)間返回結(jié)果。好的可?性主要是指系統(tǒng)能夠很好地為?戶服務(wù),不出現(xiàn)?戶操作失敗或者訪問(wèn)超時(shí)等?戶體驗(yàn)不好的情況。在通常情況下,可?性與分布式數(shù)據(jù)冗余、負(fù)載均衡等有著很?的關(guān)聯(lián)。)分區(qū)容錯(cuò)性是指“thesystemcontinuestooperatedespitearbitrarymessagelossorfailureofpartofthesystem”,即分布式系統(tǒng)在遇到某節(jié)點(diǎn)或?絡(luò)分區(qū)故障的時(shí)候,仍然能夠?qū)ν馓峁M??致性和可?性的服務(wù)。分區(qū)容錯(cuò)性和擴(kuò)展性緊密相關(guān)。在分布式應(yīng)?中,可能因?yàn)?些分布式的原因?qū)е孪到y(tǒng)?法正常運(yùn)轉(zhuǎn)。分區(qū)容錯(cuò)性?指在部分節(jié)點(diǎn)故障或出現(xiàn)丟包的情況下,集群系統(tǒng)仍然能提供服務(wù),完成數(shù)據(jù)的訪問(wèn)。分區(qū)容錯(cuò)可視為在系統(tǒng)中采?多副本策略。CAP理論認(rèn)為分布式系統(tǒng)只能兼顧其中的兩個(gè)特性,即出現(xiàn)CA、CP、AP三種情況,如圖所?。P如果不要求PartitionTolerance,即不允許分區(qū),則強(qiáng)?致性和可?性是可以保證的。其實(shí)分區(qū)是始終存在的問(wèn)題,因此CA的分布式系統(tǒng)更多的是允許分區(qū)后各?系統(tǒng)依然保持CA。A如果不要求可?性,相當(dāng)于每個(gè)請(qǐng)求都需要在各服務(wù)器之間強(qiáng)?致,?分區(qū)容錯(cuò)性會(huì)導(dǎo)致同步時(shí)間?限延長(zhǎng),如此CP也是可以保證的。很多傳統(tǒng)的數(shù)據(jù)庫(kù)分布式事務(wù)都屬于這種模式。C如果要可?性?并允許分區(qū),則需放棄?致性。?旦分區(qū)發(fā)?,節(jié)點(diǎn)之間可能會(huì)失去聯(lián)系,為了實(shí)現(xiàn)?可?,每個(gè)節(jié)點(diǎn)只能?本地?cái)?shù)據(jù)提供服務(wù),?這樣會(huì)導(dǎo)致全局?jǐn)?shù)據(jù)的不?致性。在實(shí)踐中,可根據(jù)實(shí)際情況進(jìn)?權(quán)衡,或者在軟件層?提供配置?式,由?戶決定如何選擇CAP策略。CAP理論可?在不同的層?,可以根據(jù)CAP原理定制局部的設(shè)計(jì)策略,例如,在分布式系統(tǒng)中,每個(gè)節(jié)點(diǎn)??的數(shù)據(jù)是能保證CA的,但在整體上?要兼顧AP或CP。ACID是關(guān)系型數(shù)據(jù)庫(kù)的事務(wù)機(jī)制需要遵守的原則。事務(wù)是?個(gè)?致和可靠計(jì)算的基本單元,由作為原?單元執(zhí)?的?系列數(shù)據(jù)庫(kù)操作組成。數(shù)據(jù)庫(kù)庫(kù)?般在啟動(dòng)時(shí)會(huì)提供事務(wù)機(jī)制,包括事務(wù)啟動(dòng)、停?、取消或回滾等。關(guān)系型數(shù)據(jù)庫(kù)?持事務(wù)的ACID原則,即原?性(Atomicity)、?致性(Consistency)、隔離性(Isolation)、持久性(Durability),這四種原則保證在事務(wù)過(guò)程當(dāng)中數(shù)據(jù)的正確性,具體描述如下。)?個(gè)事務(wù)的所有系列操作步驟被看成?個(gè)動(dòng)作,所有的步驟要么全部完成,要么?個(gè)也不會(huì)完成。如果在事務(wù)過(guò)程中發(fā)?錯(cuò)誤,則會(huì)回滾到事務(wù)開(kāi)始前的狀態(tài),將要被改變的數(shù)據(jù)庫(kù)記錄不會(huì)被改變。)?致性是指在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞,即數(shù)據(jù)庫(kù)事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性及業(yè)務(wù)邏輯上的?致性。)主要?于實(shí)現(xiàn)并發(fā)控制,隔離能夠確保并發(fā)執(zhí)?的事務(wù)按順序?個(gè)接?個(gè)地執(zhí)?。通過(guò)隔離,?個(gè)未完成事務(wù)不會(huì)影響另外?個(gè)未完成事務(wù)。)?旦?個(gè)事務(wù)被提交,它應(yīng)該持久保存,不會(huì)因?yàn)榕c其他操作沖突?取消這個(gè)事務(wù)。從事務(wù)的四個(gè)特性可以看到關(guān)系型數(shù)據(jù)庫(kù)是要求強(qiáng)?致性的,但是這?點(diǎn)在數(shù)據(jù)庫(kù)中是重點(diǎn)弱化的機(jī)制。原因是當(dāng)數(shù)據(jù)庫(kù)保存強(qiáng)?致性時(shí),很難保證系統(tǒng)具有橫向擴(kuò)展和可?性的優(yōu)勢(shì),因此針對(duì)分布式數(shù)據(jù)存儲(chǔ)管理只提供了弱?致性的保障,即。BASE理論是針對(duì)數(shù)據(jù)庫(kù)??的,它是對(duì)理論中?致性(C)和可?性(A)進(jìn)?權(quán)衡的結(jié)果,源于提出者??在?規(guī)模分布式系統(tǒng)上實(shí)踐的總結(jié)。其核?思想是?法做到強(qiáng)?致性,但每個(gè)應(yīng)?都可以根據(jù)??的特點(diǎn),采?適當(dāng)?式達(dá)到最終?致性。)基本可?指分布式系統(tǒng)在出現(xiàn)故障時(shí),系統(tǒng)允許損失部分可?性,即保證核?功能或者當(dāng)前最重要功能可?。對(duì)于?戶來(lái)說(shuō),他們當(dāng)前最關(guān)注的功能或者最常?的功能的可?性將會(huì)獲得保證,但是其他功能會(huì)被削弱。)軟狀態(tài)允許系統(tǒng)數(shù)據(jù)存在中間狀態(tài),但不會(huì)影響系統(tǒng)的整體可?性,即允許不同節(jié)點(diǎn)的副本之間存在暫時(shí)的不?致情況。最終?致性(EventuallyConsistent)最終?致性要求系統(tǒng)中數(shù)據(jù)副本最終能夠?致,?不需要實(shí)時(shí)保證數(shù)據(jù)副本?致。例如,銀?系統(tǒng)中的?實(shí)時(shí)轉(zhuǎn)賬操作,允許24?時(shí)內(nèi)?戶賬戶的狀態(tài)在轉(zhuǎn)賬前后是不?致的,但24?時(shí)后賬戶數(shù)據(jù)必須正確。最終?致性是BASE原理的核?,也是NoSQL數(shù)據(jù)庫(kù)的主要特點(diǎn),通過(guò)弱化?致性,提?系統(tǒng)的可伸縮性、可靠性和可?性。?且對(duì)于?多數(shù)Web應(yīng)?,其實(shí)并不需要強(qiáng)?致性,因此犧牲?致性?換取?可?性,是多數(shù)分布式數(shù)據(jù)庫(kù)產(chǎn)品的?向。最終?致性可以分為客戶端和服務(wù)端兩個(gè)不同的視?。從客戶端來(lái)看,?致性主要指的是多并發(fā)訪問(wèn)時(shí)更新過(guò)的數(shù)據(jù)如何獲取的問(wèn)題,最終?致性有以下5個(gè)變種。說(shuō)明如果進(jìn)程A通知進(jìn)程B它已更新了?個(gè)數(shù)據(jù)項(xiàng),那么,進(jìn)程B的后續(xù)訪問(wèn)將返回更新后的值,且?次寫(xiě)?將保證取代前?次寫(xiě)?。與進(jìn)程A?因果關(guān)系的進(jìn)程C的訪問(wèn)遵守?般的最終?致性規(guī)則。讀?之所寫(xiě)(Read-當(dāng)進(jìn)程A??更新?個(gè)數(shù)據(jù)項(xiàng)之后,它總是訪問(wèn)到更新過(guò)的值,且不會(huì)看到舊值。這是因果?致性模型的?個(gè)特例。這是上?個(gè)模型的實(shí)?版本,它把訪問(wèn)存儲(chǔ)系統(tǒng)的進(jìn)程放到會(huì)話的上下?中。只要會(huì)話還存在,系統(tǒng)就保證“讀?之所寫(xiě)”?致性。如果由于某些失敗情形令會(huì)話終?,就要建?新的會(huì)話,?且系統(tǒng)保證不會(huì)延續(xù)到新的會(huì)話。如果進(jìn)程已經(jīng)看到過(guò)數(shù)據(jù)對(duì)象的某個(gè)值,那么任何后續(xù)訪問(wèn)都不會(huì)返回在那個(gè)值之前的值。系統(tǒng)保證來(lái)?同?個(gè)進(jìn)程的寫(xiě)操作順序執(zhí)?。單調(diào)寫(xiě)?致性上述最終?致性的不同?式可以進(jìn)?組合,例如,單調(diào)讀?致性和“讀?之所寫(xiě)”?致性就可以組合實(shí)現(xiàn)。從實(shí)踐的?度來(lái)看,這兩者的組合讀取??更新的數(shù)據(jù),?旦讀取到最新的版本,就不會(huì)再讀取舊版本,對(duì)基于此架構(gòu)上的程序開(kāi)發(fā)來(lái)說(shuō),會(huì)減少很多額外的煩惱。從服務(wù)端來(lái)看,如何盡快地將更新后的數(shù)據(jù)分布到整個(gè)系統(tǒng),降低達(dá)到最終?致性的時(shí)間窗?,是提?系統(tǒng)的可?度和?戶體驗(yàn)度?常重要的??。分布式數(shù)據(jù)系統(tǒng)有以下特性:N為數(shù)據(jù)復(fù)制的份數(shù)。W為更新數(shù)據(jù)時(shí)需要進(jìn)?寫(xiě)操作的節(jié)點(diǎn)數(shù)。R為讀取數(shù)據(jù)的時(shí)候需要讀取的節(jié)點(diǎn)數(shù)。如果W+R>N,寫(xiě)的節(jié)點(diǎn)和讀的節(jié)點(diǎn)重疊,則是強(qiáng)?致性。例如,對(duì)于典型的?主?備同步復(fù)制的關(guān)系型數(shù)據(jù)庫(kù)(N=2,W=2,R=1),則不管讀的是主庫(kù)還是備庫(kù)的數(shù)據(jù),都是?致的。如果W+R≤N,則是弱?致性。例如,對(duì)于?主?備異步復(fù)制的關(guān)系型數(shù)據(jù)庫(kù)(N=2,W=1,R=1),如果讀的是備庫(kù),則可能?法讀取主庫(kù)已經(jīng)更新過(guò)的數(shù)據(jù),所以是弱?致性。對(duì)于分布式系統(tǒng),為了保證?可?性,?般設(shè)置N≥3。設(shè)置不同的N、W、R組合,是在可?性和?致性之間取?個(gè)平衡,以適應(yīng)不同的應(yīng)?場(chǎng)景。如果N=W且R=1,則任何?個(gè)寫(xiě)節(jié)點(diǎn)失效,都會(huì)導(dǎo)致寫(xiě)失敗,因此可?性會(huì)降低。但是由于數(shù)據(jù)分布的N個(gè)節(jié)點(diǎn)是同步寫(xiě)?的,因此可以保證強(qiáng)?致性。如果N=R且W=1,則只需要?個(gè)節(jié)點(diǎn)寫(xiě)?成功即可,寫(xiě)性能和可?性都?較?。但是讀取其他節(jié)點(diǎn)的進(jìn)程可能不能獲取更新后的數(shù)據(jù),因此是弱?致性。在這種情況下,如果W<(N+1)/2,并且寫(xiě)?的節(jié)點(diǎn)不重疊,則會(huì)存在寫(xiě)沖突。NoSQL關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品很多,如、Oracle、MicrosoftSQLSever等,但它們的基本模型都是關(guān)系型數(shù)據(jù)模型。并沒(méi)有統(tǒng)?的模型,?且是?關(guān)系型的。常見(jiàn)的NoSQL數(shù)據(jù)庫(kù)包括鍵值數(shù)據(jù)庫(kù)、列族數(shù)據(jù)庫(kù)、?檔數(shù)據(jù)庫(kù)和圖形數(shù)據(jù)庫(kù),其具體分類和特點(diǎn)如表所?。應(yīng)?場(chǎng)景數(shù)據(jù)模型優(yōu)點(diǎn)缺點(diǎn)鍵值數(shù)據(jù)庫(kù)<key,value>鍵值對(duì),通過(guò)散列表來(lái)實(shí)現(xiàn)擴(kuò)展性好,靈活性好,?量操作時(shí)性能?內(nèi)容緩存,如會(huì)話、配置?件、參數(shù)等;頻繁讀寫(xiě)、擁有簡(jiǎn)單數(shù)據(jù)模型的應(yīng)?數(shù)據(jù)?結(jié)構(gòu)化,通常只被當(dāng)做字符串或者?進(jìn)制數(shù)據(jù),只能通過(guò)鍵來(lái)查詢值列族以列族式存儲(chǔ),將同數(shù)據(jù)模型可擴(kuò)展性強(qiáng),查找速優(yōu)點(diǎn)、分布式數(shù)據(jù)存儲(chǔ)與管理應(yīng)?場(chǎng)景功能局限,不?持事務(wù)的強(qiáng)?致性缺點(diǎn)相關(guān)產(chǎn)品?列數(shù)據(jù)存在?起度快,復(fù)雜性低Cassandra?檔數(shù)據(jù)庫(kù)、<key,value>value靈活,可以根據(jù)value構(gòu)建索引缺乏統(tǒng)?查詢語(yǔ)法圖形數(shù)據(jù)庫(kù)社交?絡(luò)、推薦系統(tǒng),專注構(gòu)建關(guān)系圖譜圖結(jié)構(gòu)?持復(fù)雜的圖形算法復(fù)雜性?,只能?持?定的數(shù)據(jù)規(guī)模NoSQL數(shù)據(jù)庫(kù)并沒(méi)有?個(gè)統(tǒng)?的架構(gòu),兩種不同的NoSQL數(shù)據(jù)庫(kù)之間的差異程度,遠(yuǎn)遠(yuǎn)超過(guò)兩種關(guān)系型數(shù)據(jù)庫(kù)之間的不同。可以說(shuō),NoSQL數(shù)據(jù)庫(kù)各有所長(zhǎng),?個(gè)優(yōu)秀的NoSQL數(shù)據(jù)庫(kù)必然特別適?于某些場(chǎng)合或者某些應(yīng)?,在這些場(chǎng)合中會(huì)遠(yuǎn)遠(yuǎn)勝過(guò)關(guān)系型數(shù)據(jù)庫(kù)和其他的NoSQL數(shù)據(jù)庫(kù)。常見(jiàn)的NoSQL數(shù)據(jù)庫(kù)分為以下?種。這?類數(shù)據(jù)庫(kù)主要會(huì)使?到?個(gè)散列表,這個(gè)表中有?個(gè)特定的鍵和?個(gè)指針指向特定的數(shù)據(jù)。鍵值模型對(duì)于IT系統(tǒng)來(lái)說(shuō),其優(yōu)勢(shì)在于簡(jiǎn)單、易部署。鍵值數(shù)據(jù)庫(kù)可以按照鍵對(duì)數(shù)據(jù)進(jìn)?定位,還可以通過(guò)對(duì)鍵進(jìn)?排序和分區(qū),以實(shí)現(xiàn)更快速的數(shù)據(jù)定位。列族數(shù)據(jù)庫(kù)通常?來(lái)應(yīng)對(duì)分布式存儲(chǔ)的海量數(shù)據(jù)。鍵仍然存在,但是它們的特點(diǎn)是指向了多個(gè)列,如圖所?。此列族數(shù)據(jù)庫(kù)表中由兩?組成,每??都有關(guān)鍵字RowKey,每??由多個(gè)列族組成,即Column-Family-1和Column-Family-2,?每個(gè)列族由多個(gè)列組成。?檔數(shù)據(jù)庫(kù)的靈感來(lái)?LotusNotes辦公軟件,它與鍵值數(shù)據(jù)庫(kù)類似。該類型的數(shù)據(jù)模型是版本化的?檔,?檔以特定的格式存儲(chǔ),如JSON。?檔數(shù)據(jù)庫(kù)可以看作鍵值數(shù)據(jù)庫(kù)的升級(jí)版,允許之間嵌套鍵值,如圖所?。?檔數(shù)據(jù)庫(kù)?鍵值數(shù)據(jù)庫(kù)的查詢效率更?,因?yàn)?檔數(shù)據(jù)庫(kù)不僅可以根據(jù)鍵創(chuàng)建索引,同時(shí)還可以根據(jù)?檔內(nèi)容創(chuàng)建索引。圖形數(shù)據(jù)庫(kù)來(lái)源于圖論中的拓?fù)鋵W(xué),以節(jié)點(diǎn)、邊及節(jié)點(diǎn)之間的關(guān)系來(lái)存儲(chǔ)復(fù)雜?絡(luò)中的數(shù)據(jù),如圖所?。這種拓?fù)浣Y(jié)構(gòu)類似E-R圖,但在圖形模式中,關(guān)系和節(jié)點(diǎn)本?就是數(shù)據(jù),?在E-R圖中,關(guān)系描述的是?種結(jié)構(gòu)。內(nèi)存數(shù)據(jù)庫(kù)主要是把磁盤(pán)的數(shù)據(jù)加載到內(nèi)存中進(jìn)?相應(yīng)操作。與直接讀取磁盤(pán)數(shù)據(jù)相?,內(nèi)存的數(shù)據(jù)讀取速度要?出?個(gè)數(shù)量級(jí),因此,將數(shù)據(jù)保存在內(nèi)存中能夠極?地提?應(yīng)?的性能。內(nèi)存數(shù)據(jù)庫(kù)改變了磁盤(pán)數(shù)據(jù)管理的傳統(tǒng)?式,基于全部數(shù)據(jù)都在內(nèi)存中的特點(diǎn)重新設(shè)計(jì)了體系結(jié)構(gòu),并且在數(shù)據(jù)緩存、快速算法、并?操作??也進(jìn)?了相應(yīng)的升級(jí),因此,其數(shù)據(jù)處理速度?般?傳統(tǒng)數(shù)據(jù)庫(kù)的數(shù)據(jù)處理速度快??倍。內(nèi)存數(shù)據(jù)庫(kù)的最?特點(diǎn)是其應(yīng)?數(shù)據(jù)常駐內(nèi)存中,即活動(dòng)事務(wù)只與實(shí)時(shí)內(nèi)存數(shù)據(jù)庫(kù)的內(nèi)存進(jìn)?數(shù)據(jù)交流。常見(jiàn)的內(nèi)存數(shù)據(jù)庫(kù)有Memcached、、SQLite、MicrosoftSQLServerCompact等。Memcached是LiveJournal旗下DangaInteractive公司的布拉德·菲茨帕特?克(BradFitzpatric)開(kāi)發(fā)的?款,現(xiàn)在已被應(yīng)?于Facebook、LiveJournal等公司?于提?Web服務(wù)質(zhì)量。?前這款軟件流?于全球各地,經(jīng)常被?來(lái)建?緩存項(xiàng)?,并以此分擔(dān)來(lái)?傳統(tǒng)數(shù)據(jù)庫(kù)的并發(fā)負(fù)載壓?。Memcached可以輕松應(yīng)對(duì)?量同時(shí)出現(xiàn)的數(shù)據(jù)請(qǐng)求,?且它擁有獨(dú)特的?絡(luò)結(jié)構(gòu),在?作機(jī)制??,它還可以在內(nèi)存中單獨(dú)開(kāi)辟新的空間,建?HashTable,并對(duì)HashTable進(jìn)?有效的管理。我們有時(shí)會(huì)見(jiàn)到Memcache和Memcached兩種不同的說(shuō)法,為什么會(huì)有兩種名稱?其實(shí)Memcache是這個(gè)項(xiàng)?的名稱,?Memcached是它服務(wù)器端的主程序?件名。?個(gè)是項(xiàng)?名稱,另?個(gè)是主程序?件名。為什么要使?Memcached由于?站的?并發(fā)讀寫(xiě)和對(duì)海量數(shù)據(jù)的處理需求,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)開(kāi)始出現(xiàn)瓶頸。關(guān)系型數(shù)據(jù)庫(kù)本?就是個(gè)龐然?物,處理過(guò)程?常耗時(shí)(如解析SQL語(yǔ)句、事務(wù)處理等)。如果對(duì)關(guān)系型數(shù)據(jù)庫(kù)進(jìn)??并發(fā)讀寫(xiě)(每秒上萬(wàn)次的訪問(wèn)),數(shù)據(jù)庫(kù)系統(tǒng)是?法承受的。對(duì)于?型的SNS?站(如Twitter、新浪微博),每天有上千萬(wàn)條的數(shù)據(jù)產(chǎn)?。對(duì)關(guān)系型數(shù)據(jù)庫(kù)??,如果在?個(gè)有上億條數(shù)據(jù)的數(shù)據(jù)表中查找某條記錄,效率將?常低。使?Memcached就能很好地解決以上問(wèn)題。多數(shù)Web應(yīng)?都將數(shù)據(jù)保存到關(guān)系型數(shù)據(jù)庫(kù)中(如),Web服務(wù)器從中讀取數(shù)據(jù)并在瀏覽器中顯?。但隨著數(shù)據(jù)量的增?,訪問(wèn)的集中,關(guān)系型數(shù)據(jù)庫(kù)的負(fù)擔(dān)就會(huì)加重,岀現(xiàn)響應(yīng)緩慢、?站打開(kāi)延遲時(shí)間長(zhǎng)等問(wèn)題。因此,使?Memcached的主要?的是通過(guò)??內(nèi)存中緩存關(guān)系型數(shù)據(jù)庫(kù)的查詢結(jié)果,減少數(shù)據(jù)庫(kù)??被訪問(wèn)的次數(shù),以提?動(dòng)態(tài)Web應(yīng)?的速度,增強(qiáng)?站架構(gòu)的并發(fā)能?和可擴(kuò)展性。通過(guò)在事先規(guī)劃好的系統(tǒng)內(nèi)存空間中臨時(shí)緩存數(shù)據(jù)庫(kù)中的各類數(shù)據(jù),以達(dá)到減少前端業(yè)務(wù)服務(wù)對(duì)關(guān)系型數(shù)據(jù)庫(kù)的直接?并發(fā)訪問(wèn),從?達(dá)到提升?規(guī)模?站集群中動(dòng)態(tài)服務(wù)的并發(fā)訪問(wèn)能?。Web服務(wù)器讀取數(shù)據(jù)時(shí)先讀Memcached服務(wù)器,若Memcached沒(méi)有所需的數(shù)據(jù),則向數(shù)據(jù)庫(kù)請(qǐng)求數(shù)據(jù),然后Web再把請(qǐng)求到的數(shù)據(jù)發(fā)送到Memcached,如下圖所?。是?個(gè)開(kāi)源的、?性能的、鍵值對(duì)。它通過(guò)提供多種鍵值數(shù)據(jù)類型來(lái)滿?不同場(chǎng)景下的存儲(chǔ)需求,并借助許多?層級(jí)的接?使其可以勝任如緩存、隊(duì)列系統(tǒng)等不同的??。本?節(jié)將介紹Redis的歷史和特性,以使讀者能夠快速地對(duì)Redis有?個(gè)全?的了解。2008年,意?利的?家創(chuàng)業(yè)公司Merzia推出了?款基于的?站實(shí)時(shí)統(tǒng)計(jì)系統(tǒng)——LLOOGG,然?沒(méi)過(guò)多久,該公司的創(chuàng)始?薩爾?托·桑菲利普(SalvatoreSanfilippo)便對(duì)這個(gè)系統(tǒng)的性能感到失望,于是他決定親?為L(zhǎng)LOOGG量?定做?個(gè)數(shù)據(jù)庫(kù),并于2009年開(kāi)發(fā)完成,這個(gè)數(shù)據(jù)庫(kù)就是Redis。不過(guò)薩爾?托并不滿?只將Redis?于LLOOGG這?款產(chǎn)品,?是希望讓更多的?使?它,于是薩爾?托將Redis開(kāi)源發(fā)布,并開(kāi)始和Redis的另?名主要的代碼貢獻(xiàn)者?特·諾德胡斯(PieterNoordhuis)?起繼續(xù)著Redis的開(kāi)發(fā),直到今天。薩爾?托??也沒(méi)有想到,在短短的?年時(shí)間內(nèi),Redis就擁有了龐?的?戶群體。HackedNews在2012年發(fā)布了?份數(shù)據(jù)庫(kù)的使?情況調(diào)查,結(jié)果顯?有近12%的公司在使?Redis。國(guó)內(nèi)如新浪微博和知乎,國(guó)外如GitHub、StackOverflow、Flickr、暴雪和Instagram,都是Redis的?戶?,F(xiàn)在使?Redis的?戶越來(lái)越多,?多數(shù)的互聯(lián)?公司都使?Redis作為公共緩存。VMware公司從2010年開(kāi)始贊助Redis的開(kāi)發(fā),薩爾?托和?特也分別于同年的3?和5?加?VMware,全職開(kāi)發(fā)Redis。有過(guò)腳本語(yǔ)?編程經(jīng)驗(yàn)的讀者對(duì)字典(或稱映射、關(guān)聯(lián)數(shù)組)?定很熟悉,如在代碼dict[“key”]=“value”中,“diet”是?個(gè)字典結(jié)構(gòu)變量,字符串“key”是鍵名,?“value”是鍵值,在字典中可以獲取或設(shè)置鍵名對(duì)應(yīng)的鍵值,也可以刪除?個(gè)鍵。Redis是RemoteDictionaryServer(遠(yuǎn)程字典服務(wù)器)的縮寫(xiě),它以字典結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),并允許其他應(yīng)?通過(guò)TCP讀寫(xiě)字典中的內(nèi)容。同?多數(shù)腳本語(yǔ)?中的字典?樣,Redis字典中的鍵值除了可以是字符串,還可以是其他數(shù)據(jù)類型。到?前為?,Redis?持的鍵值數(shù)據(jù)類型有:字符串類型、散列類型、列表類型、集合類型和有序集合類型。這種字典形式的存儲(chǔ)結(jié)構(gòu)與常見(jiàn)的MySQL等關(guān)系數(shù)據(jù)庫(kù)的?維表形式的存儲(chǔ)結(jié)構(gòu)有很?的差異。舉個(gè)例?,在程序中使?post變量存儲(chǔ)了?篇?章的數(shù)據(jù)(包括標(biāo)題、正?、閱讀量和標(biāo)簽),如下所?:post["tags"]=["PHP","Ruby","Node.js"]現(xiàn)在希望將這篇?章的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,并且要求可以通過(guò)標(biāo)簽檢索岀?章。如果使?關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ),?般會(huì)將其中的標(biāo)題、正?和閱讀量存儲(chǔ)在?個(gè)表中,?將標(biāo)簽存儲(chǔ)在另?個(gè)表中,然后使?第三個(gè)表連接?章和標(biāo)簽表。需要查詢時(shí)還需要連接三個(gè)表,不是很直觀。?Redis字典結(jié)構(gòu)的存儲(chǔ)?式和對(duì)多種鍵值數(shù)據(jù)類型的?持使得開(kāi)發(fā)者可以將程序中的數(shù)據(jù)直接映射到Redis中,數(shù)據(jù)在Redis中的存儲(chǔ)形式和其在程序中的存儲(chǔ)?式?常相似。使?Redis的另?個(gè)優(yōu)勢(shì)是其對(duì)不同的數(shù)據(jù)類型提供了?常?便的操作?式,如使?集合類型存儲(chǔ)?章標(biāo)簽,Redis可以對(duì)標(biāo)簽進(jìn)?如交集、并集等集合運(yùn)算操作。Redis數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)都存儲(chǔ)在內(nèi)存中。由于內(nèi)存的讀寫(xiě)速度遠(yuǎn)?于硬盤(pán),因此Redis在性能上與其他基于硬盤(pán)存儲(chǔ)的數(shù)據(jù)庫(kù)相?有?常明顯的優(yōu)勢(shì)。在?臺(tái)普通的筆記本電腦上,Redis可以在?秒內(nèi)讀寫(xiě)超過(guò)10萬(wàn)個(gè)鍵值。將數(shù)據(jù)存儲(chǔ)在內(nèi)存中也有問(wèn)題,例如,程序退出后內(nèi)存中的數(shù)據(jù)會(huì)丟失。不過(guò)Redis提供了對(duì)持久化的?持,即可以將內(nèi)存中的數(shù)據(jù)異步寫(xiě)?硬盤(pán)中,同時(shí)不影響其繼續(xù)提供服務(wù)。Redis雖然是作為數(shù)據(jù)庫(kù)開(kāi)發(fā)的,但由于其提供了豐富的功能,越來(lái)越多的?將其?作緩存、隊(duì)列系統(tǒng)等。Redis可謂是名副其實(shí)的多??。Redis可以為每個(gè)鍵設(shè)置?存時(shí)間(TimeToLive,TTL),?存時(shí)間到期后鍵會(huì)?動(dòng)被刪除。這?功能配合出?的性能讓Redis可以作為緩存系統(tǒng)來(lái)使?,?且由于Redis?持持久化和豐富的數(shù)據(jù)類型,使其成為另?個(gè)?常流?的緩存系統(tǒng)Memcached的有?競(jìng)爭(zhēng)者。討論Redis和Memcached的優(yōu)劣?直是?個(gè)熱門(mén)的話題。由于Redis是單線程模型,?Memcached?持多線程,所以在多核服務(wù)器上后者的性能更??些。然?,前?已經(jīng)介紹過(guò),Redis的性能已經(jīng)?夠優(yōu)異,在絕?部分場(chǎng)合下其性能都不會(huì)成為瓶頸。所以在使?時(shí)更應(yīng)該關(guān)?的是?者在功能上的區(qū)別,如果需要?到?級(jí)的數(shù)據(jù)類型或持久化等功能,Redis將會(huì)是Memcached很好的替代品。作為緩存系統(tǒng),Redis還可以限定數(shù)據(jù)占?的最?內(nèi)存空間,在數(shù)據(jù)達(dá)到空間限制后可以按照?定的規(guī)則?動(dòng)淘汰不需要的鍵。除此之外,Redis的列表類型鍵可以?來(lái)實(shí)現(xiàn)隊(duì)列,?持阻塞式讀取,并且可以很容易地實(shí)現(xiàn)?個(gè)?性能的優(yōu)先級(jí)隊(duì)列。同時(shí),在更?層?上,Redis還?持“發(fā)布/訂閱”的消息模式,?戶可以基于此構(gòu)建聊天室等系統(tǒng)。如果?個(gè)?具使?起來(lái)太復(fù)雜,即使它的功能再豐富也很難吸引?。Redis直觀的存儲(chǔ)結(jié)構(gòu)使其通過(guò)程序與Redis交互?分簡(jiǎn)單。在Redis中使?命令來(lái)讀寫(xiě)數(shù)據(jù),命令語(yǔ)句之于Redis就相當(dāng)于SQL之于關(guān)系數(shù)據(jù)庫(kù)。例如,在關(guān)系數(shù)據(jù)庫(kù)中要獲取posts表內(nèi)id為1的記錄的title字段的值,可以使?如下SQL語(yǔ)句實(shí)現(xiàn):SELECTtitleFROMpostsWHEREid=1LIMIT1相對(duì)應(yīng)的,在Redis中要讀取鍵名為post:1的散列類型鍵的title字段的值,可以使?如下命令語(yǔ)句實(shí)現(xiàn):HGETpost:1title其中,HGET就是?個(gè)命令。Redis提供了100多個(gè)命令,但是常?的只有??個(gè),并且每個(gè)命令都很容易記住。Redis提供了??種不同編程語(yǔ)?的客戶端庫(kù),這些庫(kù)都封裝了Redis的命令,這樣在程序中與Redis進(jìn)?交互變得很容易。有些庫(kù)還提供了可以將編程語(yǔ)?中的數(shù)據(jù)類型直接以相應(yīng)的形式存儲(chǔ)到Redis中(如將數(shù)組直接以列表類型存?Redis)的簡(jiǎn)單?法,使?起來(lái)?常?便。Redis使?C語(yǔ)?開(kāi)發(fā),代碼量只有3萬(wàn)多?。這降低了?戶通過(guò)修改Redis源代碼來(lái)使之更適合??項(xiàng)?需要的門(mén)檻。對(duì)于希望“榨?”數(shù)據(jù)庫(kù)性能的開(kāi)發(fā)者??,這?疑具有很?的吸引?。Redis是開(kāi)源的,有將近100名開(kāi)發(fā)者為Redis貢獻(xiàn)了代碼。良好的開(kāi)發(fā)氛圍和嚴(yán)謹(jǐn)?shù)陌姹景l(fā)布機(jī)制使得Redis的穩(wěn)定版本的性能???煽?,如此多的公司選擇使?Redis也可以印證這?點(diǎn)。與Memcached與Redis的?較見(jiàn)下表。數(shù)據(jù)庫(kù)MemcachedRedisCPU?持多核單核內(nèi)存利?率持久性數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單?作環(huán)境Linux/WindowsLinux??低(壓縮?Memcached?)有(硬盤(pán)存儲(chǔ),主從同步)復(fù)雜四、分布式系統(tǒng)分布式系統(tǒng)是由?組通過(guò)?絡(luò)進(jìn)?通信、為了完成共同的任務(wù)?協(xié)調(diào)?作的計(jì)算機(jī)節(jié)點(diǎn)組成的系統(tǒng)。分布式系統(tǒng)的出現(xiàn)是為了?廉價(jià)的、普通的機(jī)器完成單個(gè)計(jì)算機(jī)?法完成的計(jì)算、存儲(chǔ)任務(wù)。其?的是利?更多的機(jī)器,處理更多的數(shù)據(jù)。?先需要明確的是,只有當(dāng)單個(gè)節(jié)點(diǎn)的處理能??法滿??益增長(zhǎng)的計(jì)算、存儲(chǔ)任務(wù)的時(shí)候,且硬件的提升(加內(nèi)存、加磁盤(pán)、使?更好的CPU)?昂到得不償失的時(shí)候,應(yīng)?程序也不能進(jìn)?步優(yōu)化的時(shí)候,我們才需要考慮分布式系統(tǒng)。因?yàn)?,分布式系統(tǒng)要解決的問(wèn)題本?就是和單機(jī)系統(tǒng)?樣的,?由于分布式系統(tǒng)多節(jié)點(diǎn)、通過(guò)?絡(luò)通信的拓?fù)浣Y(jié)構(gòu),會(huì)引?很多單機(jī)系統(tǒng)沒(méi)有的問(wèn)題,為了解決這些問(wèn)題?會(huì)引?更多的機(jī)制、協(xié)議,帶來(lái)更多的問(wèn)題。。。在很多?章中,主要講分布式系統(tǒng)分為分布式計(jì)算(computation)與分布式存儲(chǔ)(storage)。計(jì)算與存儲(chǔ)是相輔相成的,計(jì)算需要數(shù)據(jù),要么來(lái)?實(shí)時(shí)數(shù)據(jù)(流數(shù)據(jù)),要么來(lái)?存儲(chǔ)的數(shù)據(jù);?計(jì)算的結(jié)果也是需要存儲(chǔ)的。在操作系統(tǒng)中,對(duì)計(jì)算與存儲(chǔ)有?常詳盡的討論,分布式系統(tǒng)只不過(guò)將這些理論推?到多個(gè)節(jié)點(diǎn)罷了。那么分布式系統(tǒng)怎么將任務(wù)分發(fā)到這些計(jì)算機(jī)節(jié)點(diǎn)呢,很簡(jiǎn)單的思想,分?治之,即分?(partition)。對(duì)于計(jì)算,那么就是對(duì)計(jì)算任務(wù)進(jìn)?切換,每個(gè)節(jié)點(diǎn)算?些,最終匯總就?了,這就是MapReduce的思想;對(duì)于存儲(chǔ),更好理解?下,每個(gè)節(jié)點(diǎn)存?部分?jǐn)?shù)據(jù)就?了。當(dāng)數(shù)據(jù)規(guī)模變?的時(shí)候,Partition是唯?的選擇,同時(shí)也會(huì)帶來(lái)?些好處:(1)提升性能和并發(fā),操作被分發(fā)到不同的分?,相互獨(dú)?(2)提升系統(tǒng)的可?性,即使部分分?不能?,其他分?不會(huì)受到影響理想的情況下,有分?就?了,但事實(shí)的情況卻不?理想。原因在于,分布式系統(tǒng)中有?量的節(jié)點(diǎn),且通過(guò)?絡(luò)通信。單個(gè)節(jié)點(diǎn)的故障(進(jìn)程crash、斷電、磁盤(pán)損壞)是個(gè)?概率事件,但整個(gè)系統(tǒng)的故障率會(huì)隨節(jié)點(diǎn)的增加?指數(shù)級(jí)增加,?絡(luò)通信也可能出現(xiàn)斷?、?延遲的情況。在這種?定會(huì)出現(xiàn)的“異?!鼻闆r下,分布式系統(tǒng)還是需要繼續(xù)穩(wěn)定的對(duì)外提供服務(wù),即需要較強(qiáng)的容錯(cuò)性。最簡(jiǎn)單的辦法,就是冗余或者復(fù)制集(Replication),即多個(gè)節(jié)點(diǎn)負(fù)責(zé)同?個(gè)任務(wù),最為常見(jiàn)的就是分布式存儲(chǔ)中,多個(gè)節(jié)點(diǎn)復(fù)雜存儲(chǔ)同?份數(shù)據(jù),以此增強(qiáng)可?性與可靠性。同時(shí),Replication也會(huì)帶來(lái)性能的提升,?如數(shù)據(jù)的locality可以減少?戶的等待時(shí)間。下?這種來(lái)?的圖形象?動(dòng)說(shuō)明了Partition與Replication是如何協(xié)作的。Partition和Replication是解決分布式系統(tǒng)問(wèn)題的?記組合拳,很多具體的問(wèn)題都可以?這個(gè)思路去解決。但這并不是銀彈,往往是為了解決?個(gè)問(wèn)題,會(huì)引?更多的問(wèn)題,?如為了可?性與可靠性保證,引?了冗余(復(fù)制集)。有了冗余,各個(gè)副本間的?致性問(wèn)題就變得很頭疼,?致性在系統(tǒng)的?度和?戶的?度?有不同的等級(jí)劃分。如果要保證強(qiáng)?致性,那么會(huì)影響可?性與性能,在?些應(yīng)?(?如電商、搜索)是難以接受的。如果是最終?致性,那么就需要處理數(shù)據(jù)沖突的情況。CAP、FLP這些理論告訴我們,在分布式系統(tǒng)中,沒(méi)有最佳的選擇,都是需要權(quán)衡,做出最合適的選擇。分布式系統(tǒng)挑戰(zhàn)分布式系統(tǒng)需要?量機(jī)器協(xié)作,?臨諸多的挑戰(zhàn):第?,異構(gòu)的機(jī)器與?絡(luò):分布式系統(tǒng)中的機(jī)器,配置不?樣,其上運(yùn)?的服務(wù)也可能由不同的語(yǔ)?、架構(gòu)實(shí)現(xiàn),因此處理能?也不?樣;節(jié)點(diǎn)間通過(guò)?絡(luò)連接,?不同?絡(luò)運(yùn)營(yíng)商提供的?絡(luò)的帶寬、延時(shí)、丟包率?不?樣。怎么保證?家齊頭并進(jìn),共同完成?標(biāo),這四個(gè)不?的挑戰(zhàn)。第?,普遍的節(jié)點(diǎn)故障:雖然單個(gè)節(jié)點(diǎn)的故障概率較低,但節(jié)點(diǎn)數(shù)?達(dá)到?定規(guī)模,出故障的概率就變?了。分布式系統(tǒng)需要保證故障發(fā)?的時(shí)候,系統(tǒng)仍然是可?的,這就需要監(jiān)控節(jié)點(diǎn)的狀態(tài),在節(jié)點(diǎn)故障的情況下將該節(jié)點(diǎn)負(fù)責(zé)的計(jì)算、存儲(chǔ)任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn)第三,不可靠的?絡(luò):節(jié)點(diǎn)間通過(guò)?絡(luò)通信,??絡(luò)是不可靠的??赡艿?絡(luò)問(wèn)題包括:?絡(luò)分割、延時(shí)、丟包、亂序。相?單機(jī)過(guò)程調(diào)?,?絡(luò)通信最讓?頭疼的是超時(shí):節(jié)點(diǎn)A向節(jié)點(diǎn)B發(fā)出請(qǐng)求,在約定的時(shí)間內(nèi)沒(méi)有收到節(jié)點(diǎn)B的響應(yīng),那么B是否處理了請(qǐng)求,這個(gè)是不確定的,這個(gè)不確定會(huì)帶來(lái)諸多問(wèn)題,最簡(jiǎn)單的,是否要重試請(qǐng)求,節(jié)點(diǎn)B會(huì)不會(huì)多次處理同?個(gè)請(qǐng)求????之,分布式的挑戰(zhàn)來(lái)?不確定性,不確定計(jì)算機(jī)什么時(shí)候crash、斷電,不確定磁盤(pán)什么時(shí)候損壞,不確定每次?絡(luò)通信要延遲多久,也不確定通信對(duì)端是否處理了發(fā)送的消息。?分布式的規(guī)模放?了這個(gè)不確定性,不確定性是令?討厭的,所以有諸多的分布式理論、協(xié)議來(lái)保證在這種不確定性的情況下,系統(tǒng)還能繼續(xù)正常?作。?且,很多在實(shí)際系統(tǒng)中出現(xiàn)的問(wèn)題,來(lái)源于設(shè)計(jì)時(shí)的盲?樂(lè)觀,覺(jué)得這個(gè)、那個(gè)應(yīng)該不會(huì)出問(wèn)題。很有意思,介紹了分布式系統(tǒng)新?可能的錯(cuò)誤的假設(shè):Thenetworkissecure.Topologydoesn’tchange.Thereisoneadministrator.Transportcostiszero.Thenetworkishomogeneous.劉杰在《分布式系統(tǒng)原理介紹》中指出,處理這些異常的最佳原則是:在設(shè)計(jì)、推導(dǎo)、驗(yàn)證分布式系統(tǒng)的協(xié)議、流程時(shí),最重要的?作之?就是思考在執(zhí)?流程的每個(gè)步驟時(shí)?旦發(fā)?各種異常的情況下系統(tǒng)的處理?式及造成的影響。Adistributedsystemisacollectionofindependentcomputersthatappearstoitsusersasasinglecoherentsystem.可擴(kuò)展性:分布式系統(tǒng)的根本?標(biāo)就是為了處理單個(gè)計(jì)算機(jī)?法處理的任務(wù),當(dāng)任務(wù)增加的時(shí)候,分布式系統(tǒng)的處理能?需要隨之增加。簡(jiǎn)單來(lái)說(shuō),要?較?便的通過(guò)增加機(jī)器來(lái)應(yīng)對(duì)數(shù)據(jù)量的增長(zhǎng),同時(shí),當(dāng)任務(wù)規(guī)??s減的時(shí)候,可以撤掉?些多余的機(jī)器,達(dá)到動(dòng)態(tài)伸縮的效果可?性與可靠性:?般來(lái)說(shuō),分布式系統(tǒng)是需要長(zhǎng)時(shí)間甚?7*24?時(shí)提供服務(wù)的???性是指系統(tǒng)在各種情況對(duì)外提供服務(wù)的能?,簡(jiǎn)單來(lái)說(shuō),可以通過(guò)不可?時(shí)間與正常服務(wù)時(shí)間的必知來(lái)衡量;?可靠性?是指計(jì)算結(jié)果正確、存儲(chǔ)的數(shù)據(jù)不丟失。?性能:不管是單機(jī)還是分布式系統(tǒng),?家都?常關(guān)注性能。不同的系統(tǒng)對(duì)性能的衡量指標(biāo)是不同的,最常見(jiàn)的:?并發(fā),單位時(shí)間內(nèi)處理的任務(wù)越多越好;低延遲:每個(gè)任務(wù)的平均時(shí)間越少越好。這個(gè)其實(shí)跟操作系統(tǒng)CPU的調(diào)度策略很像?致性:分布式系統(tǒng)為了提?可?性可靠性,?般會(huì)引?冗余(復(fù)制集)。那么如何保證這些節(jié)點(diǎn)上的狀態(tài)?致,這就是分布式系統(tǒng)不得不?對(duì)的?致性問(wèn)題。?致性有很多等級(jí),?致性越強(qiáng),對(duì)?戶越友好,但會(huì)制約系統(tǒng)的可?性;?致性等級(jí)越低,?戶就需要兼容數(shù)據(jù)不?致的情況,但系統(tǒng)的可?性、并發(fā)性很?很多。假設(shè)這是?個(gè)對(duì)外提供服務(wù)的?型分布式系統(tǒng),?戶連接到系統(tǒng),做?些操作,產(chǎn)??些需要存儲(chǔ)的數(shù)據(jù),那么在這個(gè)過(guò)程中,會(huì)遇到哪些組件、理論與協(xié)議呢?戶使?Web、APP、SDK,通過(guò)HTTP、TCP連接到系統(tǒng)。在分布式系統(tǒng)中,為了?并發(fā)、?可?,?般都是多個(gè)節(jié)點(diǎn)提供相同的服務(wù)。那么,第?個(gè)問(wèn)題就是具體選擇哪個(gè)節(jié)點(diǎn)來(lái)提供服務(wù),這個(gè)就是負(fù)載均衡(loadbalance)。負(fù)載均衡的思想很簡(jiǎn)單,但使??常?泛,在分布式系統(tǒng)、?型?站的????都有使?,或者說(shuō),只要涉及到多個(gè)節(jié)點(diǎn)提供同質(zhì)的服務(wù),就需要負(fù)載均衡。通過(guò)負(fù)載均衡找到?個(gè)節(jié)點(diǎn),接下來(lái)就是真正處理?戶的請(qǐng)求,請(qǐng)求有可能簡(jiǎn)單,也有可能很復(fù)雜。簡(jiǎn)單的請(qǐng)求,?如讀取數(shù)據(jù),那么很可能是有緩存的,即分布式緩存,如果緩存沒(méi)有命中,那么需要去數(shù)據(jù)庫(kù)拉取數(shù)據(jù)。對(duì)于復(fù)雜的請(qǐng)求,可能會(huì)調(diào)?到系統(tǒng)中其他的服務(wù)。承上,假設(shè)服務(wù)A需要調(diào)?服務(wù)B的服務(wù),?先兩個(gè)節(jié)點(diǎn)需要通信,?絡(luò)通信都是建?在TCP/IP協(xié)議的基礎(chǔ)上,但是,每個(gè)應(yīng)?都?寫(xiě)socket是?件冗雜、低效的事情,因此需要應(yīng)?層的封裝,因此有了HTTP、FTP等各種應(yīng)?層協(xié)議。當(dāng)系統(tǒng)愈加復(fù)雜,提供?量的http接?也是?件困難的事情。因此,有了更進(jìn)?步的抽象,那就是RPC(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年長(zhǎng)春師范高等??茖W(xué)校高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 二零二五年度環(huán)境監(jiān)測(cè)服務(wù)責(zé)任合同2篇
- 2024邊溝、排水溝施工合同
- 2024年適用型貨車(chē)租賃協(xié)議樣本版B版
- 2024年重慶能源職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 2025年人教版四年級(jí)語(yǔ)文下冊(cè)月考試卷含答案
- 新蘇教版一年級(jí)數(shù)學(xué)下冊(cè)綜合實(shí)踐《生活中的數(shù)學(xué)故事》教案
- 2025-2030年中國(guó)功能食品行業(yè)發(fā)展前景展望及投資風(fēng)險(xiǎn)分析報(bào)告新版
- 2025年外研銜接版七年級(jí)生物上冊(cè)月考試卷含答案
- 2024建設(shè)工程施工勞務(wù)分包合同范本3
- 2025年度土地經(jīng)營(yíng)權(quán)流轉(zhuǎn)合同補(bǔ)充條款范本
- 0的認(rèn)識(shí)和加、減法(說(shuō)課稿)-2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)人教版(2024)001
- 醫(yī)院安全生產(chǎn)治本攻堅(jiān)三年行動(dòng)實(shí)施方案
- 工程項(xiàng)目合作備忘錄范本
- 碳排放監(jiān)測(cè)技術(shù)
- 江西省2023-2024學(xué)年高二上學(xué)期期末教學(xué)檢測(cè)數(shù)學(xué)試題 附答案
- 倉(cāng)儲(chǔ)配送合同范本
- 《機(jī)器學(xué)習(xí)(含實(shí)驗(yàn)實(shí)踐)》課程教學(xué)大綱(機(jī)械設(shè)計(jì)制造及其自動(dòng)化專業(yè))
- 勞務(wù)派遣招標(biāo)文件范本
- 健康管理服務(wù)協(xié)議合同范例
- 食堂燃?xì)獍踩珜m?xiàng)培訓(xùn)
評(píng)論
0/150
提交評(píng)論