真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

高并發(fā)nosql,高并發(fā)是什么意思

高并發(fā)寫(xiě)選sql還是nosql?

SQL的獨(dú)特優(yōu)勢(shì)包括:

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的東明網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1. SQL能夠加強(qiáng)與數(shù)據(jù)的交互,并允許對(duì)單個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)提出問(wèn)題。這是很關(guān)鍵的特征,因?yàn)闊o(wú)法交互的數(shù)據(jù)基本上是沒(méi)用的,并且,增強(qiáng)的交互性能夠帶來(lái)新的見(jiàn)解、新的問(wèn)題和更有意義的未來(lái)交互。

2. SQL是標(biāo)準(zhǔn)化的,使用戶能夠跨系統(tǒng)運(yùn)用他們的知識(shí),并對(duì)第三方附件和工具提供支持。

3. SQL能夠擴(kuò)展,并且是多功能和經(jīng)過(guò)時(shí)間驗(yàn)證的,這能夠解決從快寫(xiě)為主導(dǎo)的傳輸?shù)綊呙杳芗蜕钊敕治龅葐?wèn)題。

4. SQL對(duì)數(shù)據(jù)呈現(xiàn)和存儲(chǔ)采用正交形式,一些SQL系統(tǒng)支持JSON和其他結(jié)構(gòu)化對(duì)象格式,比NoSQL具有更好的性能和更多功能。

NoSQL特點(diǎn):

易擴(kuò)展

NoSQL數(shù)據(jù)庫(kù)種類繁多,但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性。數(shù)據(jù)之間無(wú)關(guān)系,這樣就非常容易擴(kuò)展。也無(wú)形之間,在架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力。

大數(shù)據(jù)量,高性能

NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫(xiě)性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無(wú)關(guān)系性,數(shù)據(jù)庫(kù)的結(jié)構(gòu)簡(jiǎn)單。NoSQL的Cache是記錄級(jí)的,是一種細(xì)粒度的Cache,所以NoSQL在這個(gè)層面上來(lái)說(shuō)就要性能高很多了。

靈活的數(shù)據(jù)模型

NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫(kù)里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)。這點(diǎn)在大數(shù)據(jù)量的web2.0時(shí)代尤其明顯。

高可用

NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)。比如Cassandra,HBase模型,通過(guò)復(fù)制模型也能實(shí)現(xiàn)高可用。

nosql是什么

NoSQL,泛指非關(guān)系型的數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題。

雖然NoSQL流行語(yǔ)火起來(lái)才短短一年的時(shí)間,但是不可否認(rèn),現(xiàn)在已經(jīng)開(kāi)始了第二代運(yùn)動(dòng)。盡管早期的堆棧代碼只能算是一種實(shí)驗(yàn),然而現(xiàn)在的系統(tǒng)已經(jīng)更加的成熟、穩(wěn)定。不過(guò)現(xiàn)在也面臨著一個(gè)嚴(yán)酷的事實(shí):技術(shù)越來(lái)越成熟——以至于原來(lái)很好的NoSQL數(shù)據(jù)存儲(chǔ)不得不進(jìn)行重寫(xiě),也有少數(shù)人認(rèn)為這就是所謂的2.0版本。這里列出一些比較知名的工具,可以為大數(shù)據(jù)建立快速、可擴(kuò)展的存儲(chǔ)庫(kù)。

NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用,這一概念無(wú)疑是一種全新的思維的注入。

對(duì)于NoSQL并沒(méi)有一個(gè)明確的范圍和定義,但是他們都普遍存在下面一些共同特征:

不需要預(yù)定義模式:不需要事先定義數(shù)據(jù)模式,預(yù)定義表結(jié)構(gòu)。數(shù)據(jù)中的每條記錄都可能有不同的屬性和格式。當(dāng)插入數(shù)據(jù)時(shí),并不需要預(yù)先定義它們的模式。

無(wú)共享架構(gòu):相對(duì)于將所有數(shù)據(jù)存儲(chǔ)的存儲(chǔ)區(qū)域網(wǎng)絡(luò)中的全共享架構(gòu)。NoSQL往往將數(shù)據(jù)劃分后存儲(chǔ)在各個(gè)本地服務(wù)器上。因?yàn)閺谋镜卮疟P(pán)讀取數(shù)據(jù)的性能往往好于通過(guò)網(wǎng)絡(luò)傳輸讀取數(shù)據(jù)的性能,從而提高了系統(tǒng)的性能。

彈性可擴(kuò)展:可以在系統(tǒng)運(yùn)行的時(shí)候,動(dòng)態(tài)增加或者刪除結(jié)點(diǎn)。不需要停機(jī)維護(hù),數(shù)據(jù)可以自動(dòng)遷移。

分區(qū):相對(duì)于將數(shù)據(jù)存放于同一個(gè)節(jié)點(diǎn),NoSQL數(shù)據(jù)庫(kù)需要將數(shù)據(jù)進(jìn)行分區(qū),將記錄分散在多個(gè)節(jié)點(diǎn)上面。并且通常分區(qū)的同時(shí)還要做復(fù)制。這樣既提高了并行性能,又能保證沒(méi)有單點(diǎn)失效的問(wèn)題。

異步復(fù)制:和RAID存儲(chǔ)系統(tǒng)不同的是,NoSQL中的復(fù)制,往往是基于日志的異步復(fù)制。這樣,數(shù)據(jù)就可以盡快地寫(xiě)入一個(gè)節(jié)點(diǎn),而不會(huì)被網(wǎng)絡(luò)傳輸引起遲延。缺點(diǎn)是并不總是能保證一致性,這樣的方式在出現(xiàn)故障的時(shí)候,可能會(huì)丟失少量的數(shù)據(jù)。

BASE:相對(duì)于事務(wù)嚴(yán)格的ACID特性,NoSQL數(shù)據(jù)庫(kù)保證的是BASE特性。BASE是最終一致性和軟事務(wù)。

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ù)的不同??梢哉f(shuō),NoSQL各有所長(zhǎng),成功的NoSQL必然特別適用于某些場(chǎng)合或者某些應(yīng)用,在這些場(chǎng)合中會(huì)遠(yuǎn)遠(yuǎn)勝過(guò)關(guān)系型數(shù)據(jù)庫(kù)和其他的NoSQL。

分布式緩存主要用在高并發(fā)環(huán)境下的作用?

分布式緩存主要用在高并發(fā)環(huán)境下,減輕數(shù)據(jù)庫(kù)的壓力,提高系統(tǒng)的響應(yīng)速度和并發(fā)吞吐。當(dāng)大量的讀、寫(xiě)請(qǐng)求涌向數(shù)據(jù)庫(kù)時(shí),磁盤(pán)的處理速度與內(nèi)存顯然不在一個(gè)量級(jí),因此,在數(shù)據(jù)庫(kù)之前加一層緩存,能夠顯著提高系統(tǒng)的響應(yīng)速度,并降低數(shù)據(jù)庫(kù)的壓力。作為傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),MySQL提供完整的ACID操作,支持豐富的數(shù)據(jù)類型、強(qiáng)大的關(guān)聯(lián)查詢、where語(yǔ)句等,能夠非??鸵椎亟⒉樵兯饕?,執(zhí)行復(fù)雜的內(nèi)連接、外連接、求和、排序、分組等操作,并且支持存儲(chǔ)過(guò)程、函數(shù)等功能,產(chǎn)品成熟度高,功能強(qiáng)大。但是,對(duì)于需要應(yīng)對(duì)高并發(fā)訪問(wèn)并且存儲(chǔ)海量數(shù)據(jù)的場(chǎng)景來(lái)說(shuō),出于對(duì)性能的考慮,不得不放棄很多傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)原本強(qiáng)大的功能,犧牲了系統(tǒng)的易用性,并且使得系統(tǒng)的設(shè)計(jì)和管理變得更為復(fù)雜。這也使得在過(guò)去幾年中,流行著另一種新的存儲(chǔ)解決方案——NoSQL,它與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)最大的差別在于,它不使用SQL作為查詢語(yǔ)言來(lái)查找數(shù)據(jù),而采用key-value形式進(jìn)行查找,提供了更高的查詢效率及吞吐,并且能夠更加方便地進(jìn)行擴(kuò)展,存儲(chǔ)海量數(shù)據(jù),在數(shù)千個(gè)節(jié)點(diǎn)上進(jìn)行分區(qū),自動(dòng)進(jìn)行數(shù)據(jù)的復(fù)制和備份。在分布式系統(tǒng)中,消息作為應(yīng)用間通信的一種方式,得到了十分廣泛的應(yīng)用。消息可以被保存在隊(duì)列中,直到被接收者取出,由于消息發(fā)送者不需要同步等待消息接收者的響應(yīng),消息的異步接收降低了系統(tǒng)集成的耦合度,提升了分布式系統(tǒng)協(xié)作的效率,使得系統(tǒng)能夠更快地響應(yīng)用戶,提供更高的吞吐。

當(dāng)系統(tǒng)處于峰值壓力時(shí),分布式消息隊(duì)列還能夠作為緩沖,削峰填谷,緩解集群的壓力,避免整個(gè)系統(tǒng)被壓垮。垂直化的搜索引擎在分布式系統(tǒng)中是一個(gè)非常重要的角色,它既能夠滿足用戶對(duì)于全文檢索、模糊匹配的需求,解決數(shù)據(jù)庫(kù)like查詢效率低下的問(wèn)題,又能夠解決分布式環(huán)境下,由于采用分庫(kù)分表,或者使用NoSQL數(shù)據(jù)庫(kù),導(dǎo)致無(wú)法進(jìn)行多表關(guān)聯(lián)或者進(jìn)行復(fù)雜查詢的問(wèn)題。

高并發(fā),你真的理解透徹了嗎?

高并發(fā),幾乎是每個(gè)程序員都想擁有的經(jīng)驗(yàn)。原因很簡(jiǎn)單:隨著流量變大,會(huì)遇到各種各樣的技術(shù)問(wèn)題,比如接口響應(yīng)超時(shí)、CPU load升高、GC頻繁、死鎖、大數(shù)據(jù)量存儲(chǔ)等等,這些問(wèn)題能推動(dòng)我們?cè)诩夹g(shù)深度上不斷精進(jìn)。

在過(guò)往的面試中,如果候選人做過(guò)高并發(fā)的項(xiàng)目,我通常會(huì)讓對(duì)方談?wù)剬?duì)于高并發(fā)的理解,但是能系統(tǒng)性地回答好此問(wèn)題的人并不多。

大概分成這樣幾類:

1、對(duì)數(shù)據(jù)化的指標(biāo)沒(méi)有概念 :不清楚選擇什么樣的指標(biāo)來(lái)衡量高并發(fā)系統(tǒng)?分不清并發(fā)量和QPS,甚至不知道自己系統(tǒng)的總用戶量、活躍用戶量,平峰和高峰時(shí)的QPS和TPS等關(guān)鍵數(shù)據(jù)。

3、理解片面,把高并發(fā)設(shè)計(jì)等同于性能優(yōu)化 :大談并發(fā)編程、多級(jí)緩存、異步化、水平擴(kuò)容,卻忽視高可用設(shè)計(jì)、服務(wù)治理和運(yùn)維保障。

4、掌握大方案,卻忽視最基本的東西 :能講清楚垂直分層、水平分區(qū)、緩存等大思路,卻沒(méi)意識(shí)去分析數(shù)據(jù)結(jié)構(gòu)是否合理,算法是否高效,沒(méi)想過(guò)從最根本的IO和計(jì)算兩個(gè)維度去做細(xì)節(jié)優(yōu)化。

這篇文章,我想結(jié)合自己的高并發(fā)項(xiàng)目經(jīng)驗(yàn),系統(tǒng)性地總結(jié)下高并發(fā)需要掌握的知識(shí)和實(shí)踐思路,希望對(duì)你有所幫助。內(nèi)容分成以下3個(gè)部分:

高并發(fā)意味著大流量,需要運(yùn)用技術(shù)手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩(wěn)地被系統(tǒng)所處理,帶給用戶更好的體驗(yàn)。

我們常見(jiàn)的高并發(fā)場(chǎng)景有:淘寶的雙11、春運(yùn)時(shí)的搶票、微博大V的熱點(diǎn)新聞等。除了這些典型事情,每秒幾十萬(wàn)請(qǐng)求的秒殺系統(tǒng)、每天千萬(wàn)級(jí)的訂單系統(tǒng)、每天億級(jí)日活的信息流系統(tǒng)等,都可以歸為高并發(fā)。

很顯然,上面談到的高并發(fā)場(chǎng)景,并發(fā)量各不相同, 那到底多大并發(fā)才算高并發(fā)呢?

1、不能只看數(shù)字,要看具體的業(yè)務(wù)場(chǎng)景。不能說(shuō)10W QPS的秒殺是高并發(fā),而1W QPS的信息流就不是高并發(fā)。信息流場(chǎng)景涉及復(fù)雜的推薦模型和各種人工策略,它的業(yè)務(wù)邏輯可能比秒殺場(chǎng)景復(fù)雜10倍不止。因此,不在同一個(gè)維度,沒(méi)有任何比較意義。

2、業(yè)務(wù)都是從0到1做起來(lái)的,并發(fā)量和QPS只是參考指標(biāo),最重要的是:在業(yè)務(wù)量逐漸變成原來(lái)的10倍、100倍的過(guò)程中,你是否用到了高并發(fā)的處理方法去演進(jìn)你的系統(tǒng),從架構(gòu)設(shè)計(jì)、編碼實(shí)現(xiàn)、甚至產(chǎn)品方案等維度去預(yù)防和解決高并發(fā)引起的問(wèn)題?而不是一味的升級(jí)硬件、加機(jī)器做水平擴(kuò)展。

此外,各個(gè)高并發(fā)場(chǎng)景的業(yè)務(wù)特點(diǎn)完全不同:有讀多寫(xiě)少的信息流場(chǎng)景、有讀多寫(xiě)多的交易場(chǎng)景, 那是否有通用的技術(shù)方案解決不同場(chǎng)景的高并發(fā)問(wèn)題呢?

我覺(jué)得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過(guò)程中,細(xì)節(jié)上還會(huì)有無(wú)數(shù)的坑。另外,由于軟硬件環(huán)境、技術(shù)棧、以及產(chǎn)品邏輯都沒(méi)法做到完全一致,這些都會(huì)導(dǎo)致同樣的業(yè)務(wù)場(chǎng)景,就算用相同的技術(shù)方案也會(huì)面臨不同的問(wèn)題,這些坑還得一個(gè)個(gè)趟。

因此,這篇文章我會(huì)將重點(diǎn)放在基礎(chǔ)知識(shí)、通用思路、和我曾經(jīng)實(shí)踐過(guò)的有效經(jīng)驗(yàn)上,希望讓你對(duì)高并發(fā)有更深的理解。

先搞清楚高并發(fā)系統(tǒng)設(shè)計(jì)的目標(biāo),在此基礎(chǔ)上再討論設(shè)計(jì)方案和實(shí)踐經(jīng)驗(yàn)才有意義和針對(duì)性。

高并發(fā)絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高并發(fā)系統(tǒng)設(shè)計(jì)的目標(biāo)有三個(gè):高性能、高可用,以及高可擴(kuò)展。

1、高性能:性能體現(xiàn)了系統(tǒng)的并行處理能力,在有限的硬件投入下,提高性能意味著節(jié)省成本。同時(shí),性能也反映了用戶體驗(yàn),響應(yīng)時(shí)間分別是100毫秒和1秒,給用戶的感受是完全不同的。

2、高可用:表示系統(tǒng)可以正常服務(wù)的時(shí)間。一個(gè)全年不停機(jī)、無(wú)故障;另一個(gè)隔三差五出線上事故、宕機(jī),用戶肯定選擇前者。另外,如果系統(tǒng)只能做到90%可用,也會(huì)大大拖累業(yè)務(wù)。

3、高擴(kuò)展:表示系統(tǒng)的擴(kuò)展能力,流量高峰時(shí)能否在短時(shí)間內(nèi)完成擴(kuò)容,更平穩(wěn)地承接峰值流量,比如雙11活動(dòng)、明星離婚等熱點(diǎn)事件。

這3個(gè)目標(biāo)是需要通盤(pán)考慮的,因?yàn)樗鼈兓ハ嚓P(guān)聯(lián)、甚至也會(huì)相互影響。

比如說(shuō):考慮系統(tǒng)的擴(kuò)展能力,你會(huì)將服務(wù)設(shè)計(jì)成無(wú)狀態(tài)的,這種集群設(shè)計(jì)保證了高擴(kuò)展性,其實(shí)也間接提升了系統(tǒng)的性能和可用性。

再比如說(shuō):為了保證可用性,通常會(huì)對(duì)服務(wù)接口進(jìn)行超時(shí)設(shè)置,以防大量線程阻塞在慢請(qǐng)求上造成系統(tǒng)雪崩,那超時(shí)時(shí)間設(shè)置成多少合理呢?一般,我們會(huì)參考依賴服務(wù)的性能表現(xiàn)進(jìn)行設(shè)置。

再?gòu)奈⒂^角度來(lái)看,高性能、高可用和高擴(kuò)展又有哪些具體的指標(biāo)來(lái)衡量?為什么會(huì)選擇這些指標(biāo)呢?

2.2.1 性能指標(biāo)

通過(guò)性能指標(biāo)可以度量目前存在的性能問(wèn)題,同時(shí)作為性能優(yōu)化的評(píng)估依據(jù)。一般來(lái)說(shuō),會(huì)采用一段時(shí)間內(nèi)的接口響應(yīng)時(shí)間作為指標(biāo)。

1、平均響應(yīng)時(shí)間:最常用,但是缺陷很明顯,對(duì)于慢請(qǐng)求不敏感。比如1萬(wàn)次請(qǐng)求,其中9900次是1ms,100次是100ms,則平均響應(yīng)時(shí)間為1.99ms,雖然平均耗時(shí)僅增加了0.99ms,但是1%請(qǐng)求的響應(yīng)時(shí)間已經(jīng)增加了100倍。

2、TP90、TP99等分位值:將響應(yīng)時(shí)間按照從小到大排序,TP90表示排在第90分位的響應(yīng)時(shí)間, 分位值越大,對(duì)慢請(qǐng)求越敏感。

3、吞吐量:和響應(yīng)時(shí)間呈反比,比如響應(yīng)時(shí)間是1ms,則吞吐量為每秒1000次。

通常,設(shè)定性能目標(biāo)時(shí)會(huì)兼顧吞吐量和響應(yīng)時(shí)間,比如這樣表述:在每秒1萬(wàn)次請(qǐng)求下,AVG控制在50ms以下,TP99控制在100ms以下。對(duì)于高并發(fā)系統(tǒng),AVG和TP分位值必須同時(shí)要考慮。

另外,從用戶體驗(yàn)角度來(lái)看,200毫秒被認(rèn)為是第一個(gè)分界點(diǎn),用戶感覺(jué)不到延遲,1秒是第二個(gè)分界點(diǎn),用戶能感受到延遲,但是可以接受。

因此,對(duì)于一個(gè) 健康 的高并發(fā)系統(tǒng),TP99應(yīng)該控制在200毫秒以內(nèi),TP999或者TP9999應(yīng)該控制在1秒以內(nèi)。

2.2.2 可用性指標(biāo)

高可用性是指系統(tǒng)具有較高的無(wú)故障運(yùn)行能力,可用性 = 正常運(yùn)行時(shí)間 / 系統(tǒng)總運(yùn)行時(shí)間,一般使用幾個(gè)9來(lái)描述系統(tǒng)的可用性。

對(duì)于高并發(fā)系統(tǒng)來(lái)說(shuō),最基本的要求是:保證3個(gè)9或者4個(gè)9。原因很簡(jiǎn)單,如果你只能做到2個(gè)9,意味著有1%的故障時(shí)間,像一些大公司每年動(dòng)輒千億以上的GMV或者收入,1%就是10億級(jí)別的業(yè)務(wù)影響。

2.2.3 可擴(kuò)展性指標(biāo)

面對(duì)突發(fā)流量,不可能臨時(shí)改造架構(gòu),最快的方式就是增加機(jī)器來(lái)線性提高系統(tǒng)的處理能力。

對(duì)于業(yè)務(wù)集群或者基礎(chǔ)組件來(lái)說(shuō),擴(kuò)展性 = 性能提升比例 / 機(jī)器增加比例,理想的擴(kuò)展能力是:資源增加幾倍,性能提升幾倍。通常來(lái)說(shuō),擴(kuò)展能力要維持在70%以上。

但是從高并發(fā)系統(tǒng)的整體架構(gòu)角度來(lái)看,擴(kuò)展的目標(biāo)不僅僅是把服務(wù)設(shè)計(jì)成無(wú)狀態(tài)就行了,因?yàn)楫?dāng)流量增加10倍,業(yè)務(wù)服務(wù)可以快速擴(kuò)容10倍,但是數(shù)據(jù)庫(kù)可能就成為了新的瓶頸。

像MySQL這種有狀態(tài)的存儲(chǔ)服務(wù)通常是擴(kuò)展的技術(shù)難點(diǎn),如果架構(gòu)上沒(méi)提前做好規(guī)劃(垂直和水平拆分),就會(huì)涉及到大量數(shù)據(jù)的遷移。

因此,高擴(kuò)展性需要考慮:服務(wù)集群、數(shù)據(jù)庫(kù)、緩存和消息隊(duì)列等中間件、負(fù)載均衡、帶寬、依賴的第三方等,當(dāng)并發(fā)達(dá)到某一個(gè)量級(jí)后,上述每個(gè)因素都可能成為擴(kuò)展的瓶頸點(diǎn)。

了解了高并發(fā)設(shè)計(jì)的3大目標(biāo)后,再系統(tǒng)性總結(jié)下高并發(fā)的設(shè)計(jì)方案,會(huì)從以下兩部分展開(kāi):先總結(jié)下通用的設(shè)計(jì)方法,然后再圍繞高性能、高可用、高擴(kuò)展分別給出具體的實(shí)踐方案。

通用的設(shè)計(jì)方法主要是從「縱向」和「橫向」兩個(gè)維度出發(fā),俗稱高并發(fā)處理的兩板斧:縱向擴(kuò)展和橫向擴(kuò)展。

3.1.1 縱向擴(kuò)展(scale-up)

它的目標(biāo)是提升單機(jī)的處理能力,方案又包括:

1、提升單機(jī)的硬件性能:通過(guò)增加內(nèi)存、 CPU核數(shù)、存儲(chǔ)容量、或者將磁盤(pán) 升級(jí)成SSD 等堆硬件的方式來(lái)提升。

2、提升單機(jī)的軟件性能:使用緩存減少IO次數(shù),使用并發(fā)或者異步的方式增加吞吐量。

3.1.2 橫向擴(kuò)展(scale-out)

因?yàn)閱螜C(jī)性能總會(huì)存在極限,所以最終還需要引入橫向擴(kuò)展,通過(guò)集群部署以進(jìn)一步提高并發(fā)處理能力,又包括以下2個(gè)方向:

1、做好分層架構(gòu):這是橫向擴(kuò)展的提前,因?yàn)楦卟l(fā)系統(tǒng)往往業(yè)務(wù)復(fù)雜,通過(guò)分層處理可以簡(jiǎn)化復(fù)雜問(wèn)題,更容易做到橫向擴(kuò)展。

上面這種圖是互聯(lián)網(wǎng)最常見(jiàn)的分層架構(gòu),當(dāng)然真實(shí)的高并發(fā)系統(tǒng)架構(gòu)會(huì)在此基礎(chǔ)上進(jìn)一步完善。比如會(huì)做動(dòng)靜分離并引入CDN,反向代理層可以是LVS+Nginx,Web層可以是統(tǒng)一的API網(wǎng)關(guān),業(yè)務(wù)服務(wù)層可進(jìn)一步按垂直業(yè)務(wù)做微服務(wù)化,存儲(chǔ)層可以是各種異構(gòu)數(shù)據(jù)庫(kù)。

2、各層進(jìn)行水平擴(kuò)展:無(wú)狀態(tài)水平擴(kuò)容,有狀態(tài)做分片路由。業(yè)務(wù)集群通常能設(shè)計(jì)成無(wú)狀態(tài)的,而數(shù)據(jù)庫(kù)和緩存往往是有狀態(tài)的,因此需要設(shè)計(jì)分區(qū)鍵做好存儲(chǔ)分片,當(dāng)然也可以通過(guò)主從同步、讀寫(xiě)分離的方案提升讀性能。

下面再結(jié)合我的個(gè)人經(jīng)驗(yàn),針對(duì)高性能、高可用、高擴(kuò)展3個(gè)方面,總結(jié)下可落地的實(shí)踐方案。

3.2.1 高性能的實(shí)踐方案

1、集群部署,通過(guò)負(fù)載均衡減輕單機(jī)壓力。

2、多級(jí)緩存,包括靜態(tài)數(shù)據(jù)使用CDN、本地緩存、分布式緩存等,以及對(duì)緩存場(chǎng)景中的熱點(diǎn)key、緩存穿透、緩存并發(fā)、數(shù)據(jù)一致性等問(wèn)題的處理。

3、分庫(kù)分表和索引優(yōu)化,以及借助搜索引擎解決復(fù)雜查詢問(wèn)題。

4、考慮NoSQL數(shù)據(jù)庫(kù)的使用,比如HBase、TiDB等,但是團(tuán)隊(duì)必須熟悉這些組件,且有較強(qiáng)的運(yùn)維能力。

5、異步化,將次要流程通過(guò)多線程、MQ、甚至延時(shí)任務(wù)進(jìn)行異步處理。

6、限流,需要先考慮業(yè)務(wù)是否允許限流(比如秒殺場(chǎng)景是允許的),包括前端限流、Nginx接入層的限流、服務(wù)端的限流。

7、對(duì)流量進(jìn)行 削峰填谷 ,通過(guò) MQ承接流量。

8、并發(fā)處理,通過(guò)多線程將串行邏輯并行化。

9、預(yù)計(jì)算,比如搶紅包場(chǎng)景,可以提前計(jì)算好紅包金額緩存起來(lái),發(fā)紅包時(shí)直接使用即可。

10、 緩存預(yù)熱 ,通過(guò)異步 任務(wù) 提前 預(yù)熱數(shù)據(jù)到本地緩存或者分布式緩存中。

11、減少IO次數(shù),比如數(shù)據(jù)庫(kù)和緩存的批量讀寫(xiě)、RPC的批量接口支持、或者通過(guò)冗余數(shù)據(jù)的方式干掉RPC調(diào)用。

12、減少IO時(shí)的數(shù)據(jù)包大小,包括采用輕量級(jí)的通信協(xié)議、合適的數(shù)據(jù)結(jié)構(gòu)、去掉接口中的多余字段、減少緩存key的大小、壓縮緩存value等。

13、程序邏輯優(yōu)化,比如將大概率阻斷執(zhí)行流程的判斷邏輯前置、For循環(huán)的計(jì)算邏輯優(yōu)化,或者采用更高效的算法。

14、各種池化技術(shù)的使用和池大小的設(shè)置,包括HTTP請(qǐng)求池、線程池(考慮CPU密集型還是IO密集型設(shè)置核心參數(shù))、數(shù)據(jù)庫(kù)和Redis連接池等。

15、JVM優(yōu)化,包括新生代和老年代的大小、GC算法的選擇等,盡可能減少GC頻率和耗時(shí)。

16、鎖選擇,讀多寫(xiě)少的場(chǎng)景用樂(lè)觀鎖,或者考慮通過(guò)分段鎖的方式減少鎖沖突。

上述方案無(wú)外乎從計(jì)算和 IO 兩個(gè)維度考慮所有可能的優(yōu)化點(diǎn),需要有配套的監(jiān)控系統(tǒng)實(shí)時(shí)了解當(dāng)前的性能表現(xiàn),并支撐你進(jìn)行性能瓶頸分析,然后再遵循二八原則,抓主要矛盾進(jìn)行優(yōu)化。

3.2.2 高可用的實(shí)踐方案

1、對(duì)等節(jié)點(diǎn)的故障轉(zhuǎn)移,Nginx和服務(wù)治理框架均支持一個(gè)節(jié)點(diǎn)失敗后訪問(wèn)另一個(gè)節(jié)點(diǎn)。

2、非對(duì)等節(jié)點(diǎn)的故障轉(zhuǎn)移,通過(guò)心跳檢測(cè)并實(shí)施主備切換(比如redis的哨兵模式或者集群模式、MySQL的主從切換等)。

3、接口層面的超時(shí)設(shè)置、重試策略和冪等設(shè)計(jì)。

4、降級(jí)處理:保證核心服務(wù),犧牲非核心服務(wù),必要時(shí)進(jìn)行熔斷;或者核心鏈路出問(wèn)題時(shí),有備選鏈路。

5、限流處理:對(duì)超過(guò)系統(tǒng)處理能力的請(qǐng)求直接拒絕或者返回錯(cuò)誤碼。

6、MQ場(chǎng)景的消息可靠性保證,包括producer端的重試機(jī)制、broker側(cè)的持久化、consumer端的ack機(jī)制等。

7、灰度發(fā)布,能支持按機(jī)器維度進(jìn)行小流量部署,觀察系統(tǒng)日志和業(yè)務(wù)指標(biāo),等運(yùn)行平穩(wěn)后再推全量。

8、監(jiān)控報(bào)警:全方位的監(jiān)控體系,包括最基礎(chǔ)的CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)的監(jiān)控,以及Web服務(wù)器、JVM、數(shù)據(jù)庫(kù)、各類中間件的監(jiān)控和業(yè)務(wù)指標(biāo)的監(jiān)控。

9、災(zāi)備演練:類似當(dāng)前的“混沌工程”,對(duì)系統(tǒng)進(jìn)行一些破壞性手段,觀察局部故障是否會(huì)引起可用性問(wèn)題。

高可用的方案主要從冗余、取舍、系統(tǒng)運(yùn)維3個(gè)方向考慮,同時(shí)需要有配套的值班機(jī)制和故障處理流程,當(dāng)出現(xiàn)線上問(wèn)題時(shí),可及時(shí)跟進(jìn)處理。

3.2.3 高擴(kuò)展的實(shí)踐方案

1、合理的分層架構(gòu):比如上面談到的互聯(lián)網(wǎng)最常見(jiàn)的分層架構(gòu),另外還能進(jìn)一步按照數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層對(duì)微服務(wù)做更細(xì)粒度的分層(但是需要評(píng)估性能,會(huì)存在網(wǎng)絡(luò)多一跳的情況)。

2、存儲(chǔ)層的拆分:按照業(yè)務(wù)維度做垂直拆分、按照數(shù)據(jù)特征維度進(jìn)一步做水平拆分(分庫(kù)分表)。

3、業(yè)務(wù)層的拆分:最常見(jiàn)的是按照業(yè)務(wù)維度拆(比如電商場(chǎng)景的商品服務(wù)、訂單服務(wù)等),也可以按照核心接口和非核心接口拆,還可以按照請(qǐng)求源拆(比如To C和To B,APP和H5 )。

高并發(fā)確實(shí)是一個(gè)復(fù)雜且系統(tǒng)性的問(wèn)題,由于篇幅有限,諸如分布式Trace、全鏈路壓測(cè)、柔性事務(wù)都是要考慮的技術(shù)點(diǎn)。另外,如果業(yè)務(wù)場(chǎng)景不同,高并發(fā)的落地方案也會(huì)存在差異,但是總體的設(shè)計(jì)思路和可借鑒的方案基本類似。

高并發(fā)設(shè)計(jì)同樣要秉承架構(gòu)設(shè)計(jì)的3個(gè)原則:簡(jiǎn)單、合適和演進(jìn)。"過(guò)早的優(yōu)化是萬(wàn)惡之源",不能脫離業(yè)務(wù)的實(shí)際情況,更不要過(guò)度設(shè)計(jì),合適的方案就是最完美的。

作者簡(jiǎn)介:985碩士,前亞馬遜工程師,現(xiàn)大廠技術(shù)管理者。

什么是NoSQL數(shù)據(jù)庫(kù)?

2. 什么是NoSQL?

2.1 NoSQL 概述

NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,

泛指非關(guān)系型的數(shù)據(jù)庫(kù)。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NoSQL數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來(lái)的挑戰(zhàn),尤其是大數(shù)據(jù)應(yīng)用難題,包括超大規(guī)模數(shù)據(jù)的存儲(chǔ)。

(例如谷歌或Facebook每天為他們的用戶收集萬(wàn)億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展。

2.2 NoSQL代表

MongDB、 Redis、Memcache

3. 關(guān)系型數(shù)據(jù)庫(kù)與NoSQL的區(qū)別?

3.1 RDBMS

高度組織化結(jié)構(gòu)化數(shù)據(jù)

結(jié)構(gòu)化查詢語(yǔ)言(SQL)

數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。

數(shù)據(jù)操縱語(yǔ)言,數(shù)據(jù)定義語(yǔ)言

嚴(yán)格的一致性

基礎(chǔ)事務(wù)

ACID

關(guān)系型數(shù)據(jù)庫(kù)遵循ACID規(guī)則

事務(wù)在英文中是transaction,和現(xiàn)實(shí)世界中的交易很類似,它有如下四個(gè)特性:

A (Atomicity) 原子性

原子性很容易理解,也就是說(shuō)事務(wù)里的所有操作要么全部做完,要么都不做,事務(wù)成功的條件是事務(wù)里的所有操作都成功,只要有一個(gè)操作失敗,整個(gè)事務(wù)就失敗,需要回滾。比如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)100元至B賬戶,分為兩個(gè)步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會(huì)莫名其妙少了100元。

C (Consistency) 一致性

一致性也比較容易理解,也就是說(shuō)數(shù)據(jù)庫(kù)要一直處于一致的狀態(tài),事務(wù)的運(yùn)行不會(huì)改變數(shù)據(jù)庫(kù)原本的一致性約束。

I (Isolation) 獨(dú)立性

所謂的獨(dú)立性是指并發(fā)的事務(wù)之間不會(huì)互相影響,如果一個(gè)事務(wù)要訪問(wèn)的數(shù)據(jù)正在被另外一個(gè)事務(wù)修改,只要另外一個(gè)事務(wù)未提交,它所訪問(wèn)的數(shù)據(jù)就不受未提交事務(wù)的影響。比如現(xiàn)有有個(gè)交易是從A賬戶轉(zhuǎn)100元至B賬戶,在這個(gè)交易還未完成的情況下,如果此時(shí)B查詢自己的賬戶,是看不到新增加的100元的

D (Durability) 持久性

持久性是指一旦事務(wù)提交后,它所做的修改將會(huì)永久的保存在數(shù)據(jù)庫(kù)上,即使出現(xiàn)宕機(jī)也不會(huì)丟失。

3.2 NoSQL

代表著不僅僅是SQL

沒(méi)有聲明性查詢語(yǔ)言

沒(méi)有預(yù)定義的模式

鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫(kù)

最終一致性,而非ACID屬性

非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)

CAP定理

高性能,高可用性和可伸縮性

分布式數(shù)據(jù)庫(kù)中的CAP原理(了解)

CAP定理:

Consistency(一致性), 數(shù)據(jù)一致更新,所有數(shù)據(jù)變動(dòng)都是同步的

Availability(可用性), 好的響應(yīng)性能

Partition tolerance(分區(qū)容錯(cuò)性) 可靠性

P: 系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作。

定理:任何分布式系統(tǒng)只可同時(shí)滿足二點(diǎn),沒(méi)法三者兼顧。

CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,

因此,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫(kù)分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:

CA - 單點(diǎn)集群,滿足一致性,可用性的系統(tǒng),通常在可擴(kuò)展性上不太強(qiáng)大。

CP - 滿足一致性,分區(qū)容忍性的系統(tǒng),通常性能不是特別高。

AP - 滿足可用性,分區(qū)容忍性的系統(tǒng),通??赡軐?duì)一致性要求低一些。

CAP理論就是說(shuō)在分布式存儲(chǔ)系統(tǒng)中,最多只能實(shí)現(xiàn)上面的兩點(diǎn)。

而由于當(dāng)前的網(wǎng)絡(luò)硬件肯定會(huì)出現(xiàn)延遲丟包等問(wèn)題,所以分區(qū)容忍性是我們必須需要實(shí)現(xiàn)的。

所以我們只能在一致性和可用性之間進(jìn)行權(quán)衡,沒(méi)有NoSQL系統(tǒng)能同時(shí)保證這三點(diǎn)。

說(shuō)明:C:強(qiáng)一致性 A:高可用性 P:分布式容忍性

舉例:

CA:傳統(tǒng)Oracle數(shù)據(jù)庫(kù)

AP:大多數(shù)網(wǎng)站架構(gòu)的選擇

CP:Redis、Mongodb

注意:分布式架構(gòu)的時(shí)候必須做出取舍。

一致性和可用性之間取一個(gè)平衡。多余大多數(shù)web應(yīng)用,其實(shí)并不需要強(qiáng)一致性。

因此犧牲C換取P,這是目前分布式數(shù)據(jù)庫(kù)產(chǎn)品的方向。

4. 當(dāng)下NoSQL的經(jīng)典應(yīng)用

當(dāng)下的應(yīng)用是 SQL 與 NoSQL 一起使用的。

代表項(xiàng)目:阿里巴巴商品信息的存放。

去 IOE 化。

ps:I 是指 IBM 的小型機(jī),很貴的,好像好幾萬(wàn)一臺(tái);O 是指 Oracle 數(shù)據(jù)庫(kù),也很貴的,好幾萬(wàn)呢;M 是指 EMC 的存儲(chǔ)設(shè)備,也很貴的。

難點(diǎn):

數(shù)據(jù)類型多樣性。

數(shù)據(jù)源多樣性和變化重構(gòu)。

數(shù)據(jù)源改造而服務(wù)平臺(tái)不需要大面積重構(gòu)。


文章名稱:高并發(fā)nosql,高并發(fā)是什么意思
分享路徑:http://weahome.cn/article/hohjsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部