這里我們要講的是技術(shù)的熱點問題,SLB的熱點問題,Redis的熱點問題,Mysql的熱點問題,分布式數(shù)據(jù)庫集群的熱點問題等,這類技術(shù)熱點問題并不是所謂的引人注目的問題而是服務(wù)請求過多,流量集中的問題。 SLB 定義:服務(wù)器負載均衡(Server Load Balancing),實現(xiàn)多個服務(wù)器之間的負載均衡。 主流軟件負載均衡有:1:LVS,2:Nginx,3:HAProxy LVS
Nginx
HAProxy
現(xiàn)在基本所有的公司的業(yè)務(wù)最前端都是一個負載均衡服務(wù)器承載流量,然后分發(fā)到各個后端服務(wù)器,參照下圖,這樣的架構(gòu)應(yīng)該是大多數(shù)公司的架構(gòu)。從請求主要分三個層次。用戶->負載均衡,負載均衡->微服務(wù),微服務(wù)->后端服務(wù)。 關(guān)于負載均衡這一塊的熱點問題會出現(xiàn)在哪呢?從上面的分析看其實主要是在于散列調(diào)度算法,不管是源地址散列算法還是目標地址散列算法,可能會造成一個局域網(wǎng)的很多用戶同時請求同一服務(wù)而造成這個負載均衡服務(wù)器量很大,而造成負載均衡服務(wù)器出問題,這就是所說的熱點問題。在使用散列調(diào)度算法就容易遇到熱點問題,因為散列容易造成請求不平均,請求量大可能觸發(fā)到同一個負載均衡服務(wù)器。如果使用輪詢,負載請求會平均,不容易觸發(fā)熱點問題。當然啦,負載均衡實際基本不會出現(xiàn)問題,因為要是負載均衡出問題,要么業(yè)務(wù)量幾百萬倍幾千萬倍增長,那確實說明這個量很大很大。 Redis的架構(gòu) 關(guān)于Redis的部署架構(gòu)主要有單機模式,主從模式,哨兵模式,redis cluser模式。其實嚴格意義上來說部署只有三種,哨兵模式其實基于對主從模式的穩(wěn)定性優(yōu)化,切主節(jié)點能實現(xiàn)自動化。 單機模式 優(yōu)點:1、部署簡單。2、數(shù)據(jù)一致性高 缺點:1、可靠性無法保證。2、處理能力有限 主從模式(如下圖) 優(yōu)點:1、可靠性得到一定保障,當節(jié)點出問題,可由其他節(jié)點來提供。2、提升了讀能力,分散主節(jié)點的讀壓力 缺點:1、主節(jié)點的寫能力和存儲能力受單機限制。2、主節(jié)點宕機,切換從節(jié)點需要業(yè)務(wù)方手動切換,進行人工干預(yù)。 哨兵模式(如下圖) 優(yōu)點:1、基于主從模式,主從可以自動切換。 缺點:1、節(jié)點的承載能力有限,寫能力和存儲能力都有限。 redis cluser模式(如下圖) 優(yōu)點:高可用、可擴展性、分布式、支持容錯。redis cluster接受客戶端請求,會首先通過對key進行CRC16校驗并對16384取模(CRC16(key)%16383)計算出key所在的槽,確定槽所在的節(jié)點,然后再到對應(yīng)的節(jié)點上進行取數(shù)據(jù)或者存數(shù)據(jù),這樣就實現(xiàn)了數(shù)據(jù)的訪問更新。 缺點:無 關(guān)于redis的三種架構(gòu)模式,redis的集群架構(gòu)的熱點問題就明顯了,主從模式,寫請求是很明顯的熱點問題,讀請求在讀節(jié)點中輪詢讀取,則不會出現(xiàn)熱點問題,但是如果讀節(jié)點是通過散列方式,則也會出現(xiàn)熱點問題。關(guān)于redis cluster架構(gòu)是多主,多從的架構(gòu),理論上是能很好的解決熱點問題,寫請求隨機到不同的主從集群不同的主節(jié)點中,讀請求會到不同的主從集群的從節(jié)點中,這樣就很好的分散了請求,做到這一點其實至少要保證每個主節(jié)點都有一個主備。如果只有一個主節(jié)點,那其實和主從模式?jīng)]有區(qū)別了,這樣的話寫的熱點問題和讀的熱點問題就容易出現(xiàn)了,尤其是redis的大key讀取問題,當然不管是哪種模式下都會存在大key讀取的熱點問題,要解決大key熱點問題,redis的值設(shè)計是很有講究的,不建議值超過128KB。基礎(chǔ)知識了解之后,關(guān)于如何選架構(gòu)成為解決熱點問題,提升服務(wù)穩(wěn)定性的關(guān)鍵點。 Mysql的架構(gòu) 關(guān)于Mysql的架構(gòu)(如下圖),其實只有主從模式,在業(yè)務(wù)中我們處理量大的問題通常使用讀寫分離,mysql是做數(shù)據(jù)持久化存儲,讀寫分離也是有通過中間件來實現(xiàn)。關(guān)于Mysql的讀和寫熱點問題,其實還是比較明顯,不管是讀和寫,量達到一定程度,都會存在的。在我們很大的業(yè)務(wù)流量下,我們Mysql的前端都會有Redis或者中間件的來擋量。 Kafka的架構(gòu) 關(guān)于Kafka的架構(gòu)(如下圖)是一個分布式多分區(qū),多副本,多訂閱者的高可用,高性能,高并發(fā)的MQ系統(tǒng)。Kafka寫數(shù)據(jù)是從Producer生成,需指定Topic,最終是寫入到某一個Partition(某個Leader副本的Partition)。Kafka的消費數(shù)據(jù)則是從Leader副本的某個Partition讀數(shù)據(jù)去消費。好了我們來看下寫入和讀取的熱點問題,如果客戶端一直請求同一個topic,同一個partition,等這個量達到集群的承載量就容易出現(xiàn)熱點問題了。所以要避免這樣的問題我們盡量讓partition能夠多一些,讓數(shù)據(jù)隨機平均到不同的partition上,這樣承載量會更大,熱點問題就不容易出現(xiàn)。再者kafka是號稱百萬qps的(這個涉及到kafka的底層實現(xiàn),順序io,零拷貝等機制),熱點問題相對來說是很難出現(xiàn)的。關(guān)于讀數(shù)據(jù)這個就基本不會出現(xiàn)熱點問題了,因為消費者是根據(jù)partition的個數(shù)來確定的,一個partition只能對應(yīng)一個消費組的一個消費者。當然會存在多個消費者的情況,一般情況不可能達到服務(wù)器讀的承載量。 Clickhouse的架構(gòu) clickhouse的架構(gòu)(如下圖)是Multi-Master多主架構(gòu),客戶端訪問任意一個節(jié)點都能得到相同的結(jié)果。clickhouse是一個大數(shù)據(jù)存儲數(shù)據(jù)庫,本身節(jié)點就有qps限制。其本身的熱點問題是比較明顯的,寫入不允許高并發(fā),讀取也有高并發(fā)限制。我們看下clickhouse這種多主架構(gòu)的一個請求的執(zhí)行流程,如下圖,client發(fā)起Request1請求發(fā)到節(jié)點Clickhouse A 這個請求會轉(zhuǎn)發(fā)到Request B,Request C,Request D,等B,C,D節(jié)點返回結(jié)果之后會給節(jié)點A,然后由節(jié)點返回總的數(shù)據(jù)給Client。 1:關(guān)于熱點問題要從讀和寫的方面去考慮,實現(xiàn)讀或者寫的分散就是解決熱點問題的關(guān)鍵。 2:實現(xiàn)產(chǎn)品好的技術(shù)架構(gòu)設(shè)計,熱點問題是我們首要考慮的問題,架構(gòu)的了解對我們解決熱點問題是非常至關(guān)重要的。 |
|