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

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

高并發(fā)sql和nosql,sqlserver高并發(fā)解決方案

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

SQL的獨特優(yōu)勢包括:

創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設,為客戶提供成都網(wǎng)站建設、成都網(wǎng)站設計、網(wǎng)頁設計開發(fā)服務,多年建網(wǎng)站服務經(jīng)驗,各類網(wǎng)站都可以開發(fā),成都品牌網(wǎng)站建設,公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設計,建網(wǎng)站費用,建網(wǎng)站多少錢,價格優(yōu)惠,收費合理。

1. SQL能夠加強與數(shù)據(jù)的交互,并允許對單個數(shù)據(jù)庫設計提出問題。這是很關鍵的特征,因為無法交互的數(shù)據(jù)基本上是沒用的,并且,增強的交互性能夠帶來新的見解、新的問題和更有意義的未來交互。

2. SQL是標準化的,使用戶能夠跨系統(tǒng)運用他們的知識,并對第三方附件和工具提供支持。

3. SQL能夠擴展,并且是多功能和經(jīng)過時間驗證的,這能夠解決從快寫為主導的傳輸?shù)綊呙杳芗蜕钊敕治龅葐栴}。

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

NoSQL特點:

易擴展

NoSQL數(shù)據(jù)庫種類繁多,但是一個共同的特點都是去掉關系數(shù)據(jù)庫的關系型特性。數(shù)據(jù)之間無關系,這樣就非常容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。

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

NoSQL數(shù)據(jù)庫都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無關系性,數(shù)據(jù)庫的結構簡單。NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多了。

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

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

高可用

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

試述數(shù)據(jù) 數(shù)據(jù)庫 數(shù)據(jù)庫管理系統(tǒng) 數(shù)據(jù)庫系統(tǒng)的概念以及四者之間的關系

一、數(shù)據(jù)

1、數(shù)據(jù)(data)是事實或觀察的結果,是對客觀事物的邏輯歸納,是用于表示客觀事物的未經(jīng)加工的原始素材。

2、數(shù)據(jù)可以是連續(xù)的值,比如聲音、圖像,稱為模擬數(shù)據(jù);也可以是離散的,如符號、文字,稱為數(shù)字數(shù)據(jù)。

3、在計算機系統(tǒng)中,數(shù)據(jù)以二進制信息單元0、1的形式表示。

二、數(shù)據(jù)庫

數(shù)據(jù)庫是存放數(shù)據(jù)的倉庫。它的存儲空間很大,可以存放百萬條、千萬條、上億條數(shù)據(jù)。但是數(shù)據(jù)庫并不是隨意地將數(shù)據(jù)進行存放,是有一定的規(guī)則的,否則查詢的效率會很低。當今世界是一個充滿著數(shù)據(jù)的互聯(lián)網(wǎng)世界,充斥著大量的數(shù)據(jù)。即這個互聯(lián)網(wǎng)世界就是數(shù)據(jù)世界。數(shù)據(jù)的來源有很多,比如出行記錄、消費記錄、瀏覽的網(wǎng)頁、發(fā)送的消息等等。除了文本類型的數(shù)據(jù),圖像、音樂、聲音都是數(shù)據(jù)。

三、數(shù)據(jù)庫管理系統(tǒng)

1、數(shù)據(jù)庫管理系統(tǒng)(Database Management System)是一種操縱和管理數(shù)據(jù)庫的大型軟件,用于建立、使用和維護數(shù)據(jù)庫,簡稱DBMS。它對數(shù)據(jù)庫進行統(tǒng)一的管理和控制,以保證數(shù)據(jù)庫的安全性和完整性。用戶通過DBMS訪問數(shù)據(jù)庫中的數(shù)據(jù),數(shù)據(jù)庫管理員也通過DBMS進行數(shù)據(jù)庫的維護工作。

2、它可以支持多個應用程序和用戶用不同的方法在同時或不同時刻去建立,修改和詢問數(shù)據(jù)庫。大部分DBMS提供數(shù)據(jù)定義語言DDL(Data Definition Language)和數(shù)據(jù)操作語言DML(Data Manipulation Language),供用戶定義數(shù)據(jù)庫的模式結構與權限約束,實現(xiàn)對數(shù)據(jù)的追加、刪除等操作。

四、數(shù)據(jù)庫系統(tǒng)

數(shù)據(jù)庫系統(tǒng)DBS(Data Base System,簡稱DBS)通常由軟件、數(shù)據(jù)庫和數(shù)據(jù)管理員組成。其軟件主要包括操作系統(tǒng)、各種宿主語言、實用程序以及數(shù)據(jù)庫管理系統(tǒng)。數(shù)據(jù)庫由數(shù)據(jù)庫管理系統(tǒng)統(tǒng)一管理,數(shù)據(jù)的插入、修改和檢索均要通過數(shù)據(jù)庫管理系統(tǒng)進行。數(shù)據(jù)管理員負責創(chuàng)建、監(jiān)控和維護整個數(shù)據(jù)庫,使數(shù)據(jù)能被任何有權使用的人有效使用。數(shù)據(jù)庫管理員一般是由業(yè)務水平較高、資歷較深的人員擔任。

五、數(shù)據(jù)、數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫系統(tǒng)四者之間的關系

1、首先數(shù)據(jù)庫系統(tǒng)(baiDBS)包括數(shù)據(jù)庫(DB)和數(shù)據(jù)庫管理系統(tǒng)(DBMS),數(shù)據(jù)庫管理系統(tǒng)包括數(shù)據(jù)庫,數(shù)據(jù)庫包括數(shù)據(jù)。

2、數(shù)據(jù)庫是用來存放數(shù)據(jù)的倉庫。

3、數(shù)據(jù)庫管理系統(tǒng)是操縱和管理數(shù)據(jù)庫的系統(tǒng)。

擴展資料:

數(shù)據(jù)庫的發(fā)展現(xiàn)狀

1、在數(shù)據(jù)庫的發(fā)展歷史上,數(shù)據(jù)庫先后經(jīng)歷了層次數(shù)據(jù)庫、網(wǎng)狀數(shù)據(jù)庫和關系數(shù)據(jù)庫等各個階段的發(fā)展,數(shù)據(jù)庫技術在各個方面的快速的發(fā)展。

2、特別是關系型數(shù)據(jù)庫已經(jīng)成為目前數(shù)據(jù)庫產(chǎn)品中最重要的一員,80年代以來, 幾乎所有的數(shù)據(jù)庫廠商新出的數(shù)據(jù)庫產(chǎn)品都支持關系型數(shù)據(jù)庫,即使一些非關系數(shù)據(jù)庫產(chǎn)品也幾乎都有支持關系數(shù)據(jù)庫的接口。這主要是傳統(tǒng)的關系型數(shù)據(jù)庫可以比較好的解決管理和存儲關系型數(shù)據(jù)的問題。

3、隨著云計算的發(fā)展和大數(shù)據(jù)時代的到來,關系型數(shù)據(jù)庫越來越無法滿足需要,這主要是由于越來越多的半關系型和非關系型數(shù)據(jù)需要用數(shù)據(jù)庫進行存儲管理。

4、以此同時,分布式技術等新技術的出現(xiàn)也對數(shù)據(jù)庫的技術提出了新的要求,于是越來越多的非關系型數(shù)據(jù)庫就開始出現(xiàn),這類數(shù)據(jù)庫與傳統(tǒng)的關系型數(shù)據(jù)庫在設計和數(shù)據(jù)結構有了很大的不同, 它們更強調(diào)數(shù)據(jù)庫數(shù)據(jù)的高并發(fā)讀寫和存儲大數(shù)據(jù),這類數(shù)據(jù)庫一般被稱為NoSQL(Not only SQL)數(shù)據(jù)庫。 而傳統(tǒng)的關系型數(shù)據(jù)庫在一些傳統(tǒng)領域依然保持了強大的生命力。

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

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

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

nosql是什么

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

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

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

對于NoSQL并沒有一個明確的范圍和定義,但是他們都普遍存在下面一些共同特征:

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

無共享架構:相對于將所有數(shù)據(jù)存儲的存儲區(qū)域網(wǎng)絡中的全共享架構。NoSQL往往將數(shù)據(jù)劃分后存儲在各個本地服務器上。因為從本地磁盤讀取數(shù)據(jù)的性能往往好于通過網(wǎng)絡傳輸讀取數(shù)據(jù)的性能,從而提高了系統(tǒng)的性能。

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

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

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

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

NoSQL數(shù)據(jù)庫并沒有一個統(tǒng)一的架構,兩種NoSQL數(shù)據(jù)庫之間的不同,甚至遠遠超過兩種關系型數(shù)據(jù)庫的不同??梢哉f,NoSQL各有所長,成功的NoSQL必然特別適用于某些場合或者某些應用,在這些場合中會遠遠勝過關系型數(shù)據(jù)庫和其他的NoSQL。

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

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

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

大概分成這樣幾類:

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

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

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

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

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

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

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

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

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

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

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

因此,這篇文章我會將重點放在基礎知識、通用思路、和我曾經(jīng)實踐過的有效經(jīng)驗上,希望讓你對高并發(fā)有更深的理解。

先搞清楚高并發(fā)系統(tǒng)設計的目標,在此基礎上再討論設計方案和實踐經(jīng)驗才有意義和針對性。

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

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

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

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

這3個目標是需要通盤考慮的,因為它們互相關聯(lián)、甚至也會相互影響。

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

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

再從微觀角度來看,高性能、高可用和高擴展又有哪些具體的指標來衡量?為什么會選擇這些指標呢?

2.2.1 性能指標

通過性能指標可以度量目前存在的性能問題,同時作為性能優(yōu)化的評估依據(jù)。一般來說,會采用一段時間內(nèi)的接口響應時間作為指標。

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

2、TP90、TP99等分位值:將響應時間按照從小到大排序,TP90表示排在第90分位的響應時間, 分位值越大,對慢請求越敏感。

3、吞吐量:和響應時間呈反比,比如響應時間是1ms,則吞吐量為每秒1000次。

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

另外,從用戶體驗角度來看,200毫秒被認為是第一個分界點,用戶感覺不到延遲,1秒是第二個分界點,用戶能感受到延遲,但是可以接受。

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

2.2.2 可用性指標

高可用性是指系統(tǒng)具有較高的無故障運行能力,可用性 = 正常運行時間 / 系統(tǒng)總運行時間,一般使用幾個9來描述系統(tǒng)的可用性。

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

2.2.3 可擴展性指標

面對突發(fā)流量,不可能臨時改造架構,最快的方式就是增加機器來線性提高系統(tǒng)的處理能力。

對于業(yè)務集群或者基礎組件來說,擴展性 = 性能提升比例 / 機器增加比例,理想的擴展能力是:資源增加幾倍,性能提升幾倍。通常來說,擴展能力要維持在70%以上。

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

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

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

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

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

3.1.1 縱向擴展(scale-up)

它的目標是提升單機的處理能力,方案又包括:

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

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

3.1.2 橫向擴展(scale-out)

因為單機性能總會存在極限,所以最終還需要引入橫向擴展,通過集群部署以進一步提高并發(fā)處理能力,又包括以下2個方向:

1、做好分層架構:這是橫向擴展的提前,因為高并發(fā)系統(tǒng)往往業(yè)務復雜,通過分層處理可以簡化復雜問題,更容易做到橫向擴展。

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

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

下面再結合我的個人經(jīng)驗,針對高性能、高可用、高擴展3個方面,總結下可落地的實踐方案。

3.2.1 高性能的實踐方案

1、集群部署,通過負載均衡減輕單機壓力。

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

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

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

5、異步化,將次要流程通過多線程、MQ、甚至延時任務進行異步處理。

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

7、對流量進行 削峰填谷 ,通過 MQ承接流量。

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

9、預計算,比如搶紅包場景,可以提前計算好紅包金額緩存起來,發(fā)紅包時直接使用即可。

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

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

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

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

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

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

16、鎖選擇,讀多寫少的場景用樂觀鎖,或者考慮通過分段鎖的方式減少鎖沖突。

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

3.2.2 高可用的實踐方案

1、對等節(jié)點的故障轉移,Nginx和服務治理框架均支持一個節(jié)點失敗后訪問另一個節(jié)點。

2、非對等節(jié)點的故障轉移,通過心跳檢測并實施主備切換(比如redis的哨兵模式或者集群模式、MySQL的主從切換等)。

3、接口層面的超時設置、重試策略和冪等設計。

4、降級處理:保證核心服務,犧牲非核心服務,必要時進行熔斷;或者核心鏈路出問題時,有備選鏈路。

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

6、MQ場景的消息可靠性保證,包括producer端的重試機制、broker側的持久化、consumer端的ack機制等。

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

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

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

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

3.2.3 高擴展的實踐方案

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

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

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

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

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

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

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

2. 什么是NoSQL?

2.1 NoSQL 概述

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

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

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

2.2 NoSQL代表

MongDB、 Redis、Memcache

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

3.1 RDBMS

高度組織化結構化數(shù)據(jù)

結構化查詢語言(SQL)

數(shù)據(jù)和關系都存儲在單獨的表中。

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

嚴格的一致性

基礎事務

ACID

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

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

A (Atomicity) 原子性

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

C (Consistency) 一致性

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

I (Isolation) 獨立性

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

D (Durability) 持久性

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

3.2 NoSQL

代表著不僅僅是SQL

沒有聲明性查詢語言

沒有預定義的模式

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

最終一致性,而非ACID屬性

非結構化和不可預知的數(shù)據(jù)

CAP定理

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

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

CAP定理:

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

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

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

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

定理:任何分布式系統(tǒng)只可同時滿足二點,沒法三者兼顧。

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

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

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

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

AP - 滿足可用性,分區(qū)容忍性的系統(tǒng),通常可能對一致性要求低一些。

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

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

所以我們只能在一致性和可用性之間進行權衡,沒有NoSQL系統(tǒng)能同時保證這三點。

說明:C:強一致性 A:高可用性 P:分布式容忍性

舉例:

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

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

CP:Redis、Mongodb

注意:分布式架構的時候必須做出取舍。

一致性和可用性之間取一個平衡。多余大多數(shù)web應用,其實并不需要強一致性。

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

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

當下的應用是 SQL 與 NoSQL 一起使用的。

代表項目:阿里巴巴商品信息的存放。

去 IOE 化。

ps:I 是指 IBM 的小型機,很貴的,好像好幾萬一臺;O 是指 Oracle 數(shù)據(jù)庫,也很貴的,好幾萬呢;M 是指 EMC 的存儲設備,也很貴的。

難點:

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

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

數(shù)據(jù)源改造而服務平臺不需要大面積重構。


當前標題:高并發(fā)sql和nosql,sqlserver高并發(fā)解決方案
鏈接URL:http://weahome.cn/article/hdcidg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部