單點系統(tǒng)架構(gòu)的可用性與性能優(yōu)化

2018-09-06 16:50 更新

一、需求緣起

明明架構(gòu)要求高可用,為何系統(tǒng)中還會存在單點?

回答:單點master的設(shè)計,會大大簡化系統(tǒng)設(shè)計,何況有時候避免不了單點


在哪些場景中會存在單點?先來看一下一個典型互聯(lián)網(wǎng)高可用架構(gòu)。

典型互聯(lián)網(wǎng)高可用架構(gòu)

典型互聯(lián)網(wǎng)高可用架構(gòu):

(1)客戶端層,這一層是瀏覽器或者APP,第一步先訪問DNS-server,由域名拿到nginx的外網(wǎng)IP
(2)負(fù)載均衡層,nginx是整個服務(wù)端的入口,負(fù)責(zé)反向代理與負(fù)載均衡工作
(3)站點層,web-server層,典型的是tomcat或者apache
(4)服務(wù)層,service層,典型的是dubbo或者thrift等提供RPC調(diào)用的后端服務(wù)

(5)數(shù)據(jù)層,包含cache和db,典型的是主從復(fù)制讀寫分離的db架構(gòu)

在這個互聯(lián)網(wǎng)架構(gòu)中,站點層、服務(wù)層、數(shù)據(jù)庫的從庫都可以通過冗余的方式來保證高可用,但至少

(1)nginx層是一個潛在的單點
(2)數(shù)據(jù)庫寫庫master也是一個潛在的單點

再舉一個GFS(Google File System)架構(gòu)的例子。

GFS架構(gòu)

GFS的系統(tǒng)架構(gòu)里主要有這么幾種角色:

(1)client,就是發(fā)起文件讀寫的調(diào)用端
(2)master,這是一個單點服務(wù),它有全局事業(yè),掌握文件元信息

(3)chunk-server,實際存儲文件額服務(wù)器

這個系統(tǒng)里,master也是一個單點的服務(wù),Map-reduce系統(tǒng)里也有類似的全局協(xié)調(diào)的master單點角色。


系統(tǒng)架構(gòu)設(shè)計中,像nginx,db-master,gfs-master這樣的單點服務(wù),會存在什么問題,有什么方案來優(yōu)化呢,這是本文要討論的問題。

二、單點架構(gòu)存在的問題

單點系統(tǒng)一般來說存在兩個很大的問題

(1)非高可用:既然是單點,master一旦發(fā)生故障,服務(wù)就會受到影響
(2)性能瓶頸:既然是單點,不具備良好的擴(kuò)展性,服務(wù)性能總有一個上限,這個單點的性能上限往往就是整個系統(tǒng)的性能上限

接下來,就看看有什么優(yōu)化手段可以優(yōu)化上面提到的兩個問題

三、shadow-master解決單點高可用問題

shadow-master是一種很常見的解決單點高可用問題的技術(shù)方案。

“影子master”,顧名思義,服務(wù)正常時,它只是單點master的一個影子,在master出現(xiàn)故障時,shadow-master會自動變成master,繼續(xù)提供服務(wù)。

shadow-master它能夠解決高可用的問題,并且故障的轉(zhuǎn)移是自動的,不需要人工介入,但不足是它使服務(wù)資源的利用率降為了50%,業(yè)內(nèi)經(jīng)常使用keepalived+vip的方式實現(xiàn)這類單點的高可用

GFS master

以GFS的master為例,master正常時:

(1)client會連接正常的master,shadow-master不對外提供服務(wù)
(2)master與shadow-master之間有一種存活探測機(jī)制
(3)master與shadow-master有相同的虛IP(virtual-IP)

GFS master異常

當(dāng)發(fā)現(xiàn)master異常時:

shadow-master會自動頂上成為master,虛IP機(jī)制可以保證這個過程對調(diào)用方是透明的

除了GFS與MapReduce系統(tǒng)中的主控master,nginx亦可用類似的方式保證高可用,數(shù)據(jù)庫的主庫master(主庫)亦可用類似的方式來保證高可用,只是細(xì)節(jié)上有些地方要注意:

主庫master

傳統(tǒng)的一主多從,讀寫分離的db架構(gòu),只能保證讀庫的高可用,是無法保證寫庫的高可用的,要想保證寫庫的高可用,也可以使用上述的shadow-master機(jī)制:

兩個主庫

(1)兩個主庫設(shè)置相互同步的雙主模式

(2)平時只有一個主庫提供服務(wù),言下之意,shadow-master不會往master同步數(shù)據(jù)

(3)異常時,虛IP漂移到另一個主庫,shadow-master變成主庫繼續(xù)提供服務(wù)

需要說明的是,由于數(shù)據(jù)庫的特殊性,數(shù)據(jù)同步需要時延,如果數(shù)據(jù)還沒有同步完成,流量就切到了shadow-master,可能引起小部分?jǐn)?shù)據(jù)的不一致。


四、減少與單點的交互,是存在單點的系統(tǒng)優(yōu)化的核心方向

既然知道單點存在性能上限,單點的性能(例如GFS中的master)有可能成為系統(tǒng)的瓶頸,那么,減少與單點的交互,便成了存在單點的系統(tǒng)優(yōu)化的核心方向。

怎么來減少與單點的交互,這里提兩種常見的方法。


批量寫

批量寫是一種常見的提升單點性能的方式。

例如一個利用數(shù)據(jù)庫寫單點生成做“ID生成器”的例子:

ID生成器

(1)業(yè)務(wù)方需要ID

(2)利用數(shù)據(jù)庫寫單點的auto increament id來生成和返回ID

這是一個很常見的例子,很多公司也就是這么生成ID的,它利用了數(shù)據(jù)庫寫單點的特性,方便快捷,無額外開發(fā)成本,是一個非常帥氣的方案。

潛在的問題是:生成ID的并發(fā)上限,取決于單點數(shù)據(jù)庫的寫性能上限。

如何提升性能呢?批量寫

ID生成器2
(1)中間加一個服務(wù),每次從數(shù)據(jù)庫拿出100個id
(2)業(yè)務(wù)方需要ID

(3)服務(wù)直接返回100個id中的1個,100個分配完,再訪問數(shù)據(jù)庫

這樣一來,每分配100個才會寫數(shù)據(jù)庫一次,分配id的性能可以認(rèn)為提升了100倍。


客戶端緩存

客戶端緩存也是一種降低與單點交互次數(shù),提升系統(tǒng)整體性能的方法。

還是以GFS文件系統(tǒng)為例:

GFS文件系統(tǒng)
(1)GFS的調(diào)用客戶端client要訪問shenjian.txt,先查詢本地緩存,miss了
(2)client訪問master問說文件在哪里,master告訴client在chunk3上
(3)client把shenjian.txt存放在chunk3上記錄到本地的緩存,然后進(jìn)行文件的讀寫操作
(4)未來client要訪問文件,從本地緩存中查找到對應(yīng)的記錄,就不用再請求master了,可以直接訪問chunk-server。如果文件發(fā)生了轉(zhuǎn)移,chunk3返回client說“文件不在我這兒了”,client再訪問master,詢問文件所在的服務(wù)器。

根據(jù)經(jīng)驗,這類緩存的命中非常非常高,可能在99.9%以上(因為文件的自動遷移是小概率事件),這樣與master的交互次數(shù)就降低了1000倍。

五、水平擴(kuò)展是提升單點系統(tǒng)性能的好方案

無論怎么批量寫,客戶端緩存,單點畢竟是單機(jī),還是有性能上限的。

想方設(shè)法水平擴(kuò)展,消除系統(tǒng)單點,理論上才能夠無限的提升系統(tǒng)系統(tǒng)。

以nginx為例,如何來進(jìn)行水平擴(kuò)展呢?

nginx水平擴(kuò)展
第一步的DNS解析,只能返回一個nginx外網(wǎng)IP么?答案顯然是否定的,“DNS輪詢”技術(shù)支持DNS-server返回不同的nginx外網(wǎng)IP,這樣就能實現(xiàn)nginx負(fù)載均衡層的水平擴(kuò)展。
nginx負(fù)載均衡層的水平擴(kuò)展
DNS-server部分,一個域名可以配置多個IP,每次DNS解析請求,輪詢返回不同的IP,就能實現(xiàn)nginx的水平擴(kuò)展,擴(kuò)充負(fù)載均衡層的整體性能。

數(shù)據(jù)庫單點寫庫也是同樣的道理,在數(shù)據(jù)量很大的情況下,可以通過水平拆分,來提升寫入性能。

遺憾的是,并不是所有的業(yè)務(wù)場景都可以水平拆分,例如秒殺業(yè)務(wù),商品的條數(shù)可能不多,數(shù)據(jù)庫的數(shù)據(jù)量不大,就不能通過水平拆分來提升秒殺系統(tǒng)的整體寫性能(總不能一個庫100條記錄吧?)。

六、總結(jié)

今天的話題就討論到這里,內(nèi)容很多,占用大家寶貴的時間深表內(nèi)疚,估計大部分都記不住,至少記住這幾個點吧:

(1)單點系統(tǒng)存在的問題可用性問題,性能瓶頸問題
(2)shadow-master是一種常見的解決單點系統(tǒng)可用性問題的方案
(3)減少與單點的交互,是存在單點的系統(tǒng)優(yōu)化的核心方向,常見方法有批量寫,客戶端緩存

(4)水平擴(kuò)展也是提升單點系統(tǒng)性能的好方案


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號