明明架構(gòu)要求高可用,為何系統(tǒng)中還會(huì)存在單點(diǎn)?
回答:?jiǎn)吸c(diǎn)master的設(shè)計(jì),會(huì)大大簡(jiǎn)化系統(tǒng)設(shè)計(jì),何況有時(shí)候避免不了單點(diǎn)
在哪些場(chǎng)景中會(huì)存在單點(diǎn)?先來(lái)看一下一個(gè)典型互聯(lián)網(wǎng)高可用架構(gòu)。
(1)客戶(hù)端層,這一層是瀏覽器或者APP,第一步先訪(fǎng)問(wèn)DNS-server,由域名拿到nginx的外網(wǎng)IP
(2)負(fù)載均衡層,nginx是整個(gè)服務(wù)端的入口,負(fù)責(zé)反向代理與負(fù)載均衡工作
(3)站點(diǎn)層,web-server層,典型的是tomcat或者apache
(4)服務(wù)層,service層,典型的是dubbo或者thrift等提供RPC調(diào)用的后端服務(wù)
(5)數(shù)據(jù)層,包含cache和db,典型的是主從復(fù)制讀寫(xiě)分離的db架構(gòu)
在這個(gè)互聯(lián)網(wǎng)架構(gòu)中,站點(diǎn)層、服務(wù)層、數(shù)據(jù)庫(kù)的從庫(kù)都可以通過(guò)冗余的方式來(lái)保證高可用,但至少
(1)nginx層是一個(gè)潛在的單點(diǎn)
(2)數(shù)據(jù)庫(kù)寫(xiě)庫(kù)master也是一個(gè)潛在的單點(diǎn)
再舉一個(gè)GFS(Google File System)架構(gòu)的例子。
(1)client,就是發(fā)起文件讀寫(xiě)的調(diào)用端
(2)master,這是一個(gè)單點(diǎn)服務(wù),它有全局事業(yè),掌握文件元信息
(3)chunk-server,實(shí)際存儲(chǔ)文件額服務(wù)器
這個(gè)系統(tǒng)里,master也是一個(gè)單點(diǎn)的服務(wù),Map-reduce系統(tǒng)里也有類(lèi)似的全局協(xié)調(diào)的master單點(diǎn)角色。
系統(tǒng)架構(gòu)設(shè)計(jì)中,像nginx,db-master,gfs-master這樣的單點(diǎn)服務(wù),會(huì)存在什么問(wèn)題,有什么方案來(lái)優(yōu)化呢,這是本文要討論的問(wèn)題。
單點(diǎn)系統(tǒng)一般來(lái)說(shuō)存在兩個(gè)很大的問(wèn)題:
(1)非高可用:既然是單點(diǎn),master一旦發(fā)生故障,服務(wù)就會(huì)受到影響
(2)性能瓶頸:既然是單點(diǎn),不具備良好的擴(kuò)展性,服務(wù)性能總有一個(gè)上限,這個(gè)單點(diǎn)的性能上限往往就是整個(gè)系統(tǒng)的性能上限
接下來(lái),就看看有什么優(yōu)化手段可以?xún)?yōu)化上面提到的兩個(gè)問(wèn)題
shadow-master是一種很常見(jiàn)的解決單點(diǎn)高可用問(wèn)題的技術(shù)方案。
“影子master”,顧名思義,服務(wù)正常時(shí),它只是單點(diǎn)master的一個(gè)影子,在master出現(xiàn)故障時(shí),shadow-master會(huì)自動(dòng)變成master,繼續(xù)提供服務(wù)。
shadow-master它能夠解決高可用的問(wèn)題,并且故障的轉(zhuǎn)移是自動(dòng)的,不需要人工介入,但不足是它使服務(wù)資源的利用率降為了50%,業(yè)內(nèi)經(jīng)常使用keepalived+vip的方式實(shí)現(xiàn)這類(lèi)單點(diǎn)的高可用。
(1)client會(huì)連接正常的master,shadow-master不對(duì)外提供服務(wù)
(2)master與shadow-master之間有一種存活探測(cè)機(jī)制
(3)master與shadow-master有相同的虛IP(virtual-IP)
shadow-master會(huì)自動(dòng)頂上成為master,虛IP機(jī)制可以保證這個(gè)過(guò)程對(duì)調(diào)用方是透明的
除了GFS與MapReduce系統(tǒng)中的主控master,nginx亦可用類(lèi)似的方式保證高可用,數(shù)據(jù)庫(kù)的主庫(kù)master(主庫(kù))亦可用類(lèi)似的方式來(lái)保證高可用,只是細(xì)節(jié)上有些地方要注意:
(2)平時(shí)只有一個(gè)主庫(kù)提供服務(wù),言下之意,shadow-master不會(huì)往master同步數(shù)據(jù)
(3)異常時(shí),虛IP漂移到另一個(gè)主庫(kù),shadow-master變成主庫(kù)繼續(xù)提供服務(wù)
需要說(shuō)明的是,由于數(shù)據(jù)庫(kù)的特殊性,數(shù)據(jù)同步需要時(shí)延,如果數(shù)據(jù)還沒(méi)有同步完成,流量就切到了shadow-master,可能引起小部分?jǐn)?shù)據(jù)的不一致。
既然知道單點(diǎn)存在性能上限,單點(diǎn)的性能(例如GFS中的master)有可能成為系統(tǒng)的瓶頸,那么,減少與單點(diǎn)的交互,便成了存在單點(diǎn)的系統(tǒng)優(yōu)化的核心方向。
怎么來(lái)減少與單點(diǎn)的交互,這里提兩種常見(jiàn)的方法。
批量寫(xiě)
批量寫(xiě)是一種常見(jiàn)的提升單點(diǎn)性能的方式。
例如一個(gè)利用數(shù)據(jù)庫(kù)寫(xiě)單點(diǎn)生成做“ID生成器”的例子:
(2)利用數(shù)據(jù)庫(kù)寫(xiě)單點(diǎn)的auto increament id來(lái)生成和返回ID
這是一個(gè)很常見(jiàn)的例子,很多公司也就是這么生成ID的,它利用了數(shù)據(jù)庫(kù)寫(xiě)單點(diǎn)的特性,方便快捷,無(wú)額外開(kāi)發(fā)成本,是一個(gè)非常帥氣的方案。
潛在的問(wèn)題是:生成ID的并發(fā)上限,取決于單點(diǎn)數(shù)據(jù)庫(kù)的寫(xiě)性能上限。
如何提升性能呢?批量寫(xiě)
(2)業(yè)務(wù)方需要ID
(3)服務(wù)直接返回100個(gè)id中的1個(gè),100個(gè)分配完,再訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)
這樣一來(lái),每分配100個(gè)才會(huì)寫(xiě)數(shù)據(jù)庫(kù)一次,分配id的性能可以認(rèn)為提升了100倍。
客戶(hù)端緩存
客戶(hù)端緩存也是一種降低與單點(diǎn)交互次數(shù),提升系統(tǒng)整體性能的方法。
還是以GFS文件系統(tǒng)為例:
(2)client訪(fǎng)問(wèn)master問(wèn)說(shuō)文件在哪里,master告訴client在chunk3上
(3)client把shenjian.txt存放在chunk3上記錄到本地的緩存,然后進(jìn)行文件的讀寫(xiě)操作
(4)未來(lái)client要訪(fǎng)問(wèn)文件,從本地緩存中查找到對(duì)應(yīng)的記錄,就不用再請(qǐng)求master了,可以直接訪(fǎng)問(wèn)chunk-server。如果文件發(fā)生了轉(zhuǎn)移,chunk3返回client說(shuō)“文件不在我這兒了”,client再訪(fǎng)問(wèn)master,詢(xún)問(wèn)文件所在的服務(wù)器。
根據(jù)經(jīng)驗(yàn),這類(lèi)緩存的命中非常非常高,可能在99.9%以上(因?yàn)槲募淖詣?dòng)遷移是小概率事件),這樣與master的交互次數(shù)就降低了1000倍。
無(wú)論怎么批量寫(xiě),客戶(hù)端緩存,單點(diǎn)畢竟是單機(jī),還是有性能上限的。
想方設(shè)法水平擴(kuò)展,消除系統(tǒng)單點(diǎn),理論上才能夠無(wú)限的提升系統(tǒng)系統(tǒng)。
以nginx為例,如何來(lái)進(jìn)行水平擴(kuò)展呢?
數(shù)據(jù)庫(kù)單點(diǎn)寫(xiě)庫(kù)也是同樣的道理,在數(shù)據(jù)量很大的情況下,可以通過(guò)水平拆分,來(lái)提升寫(xiě)入性能。
遺憾的是,并不是所有的業(yè)務(wù)場(chǎng)景都可以水平拆分,例如秒殺業(yè)務(wù),商品的條數(shù)可能不多,數(shù)據(jù)庫(kù)的數(shù)據(jù)量不大,就不能通過(guò)水平拆分來(lái)提升秒殺系統(tǒng)的整體寫(xiě)性能(總不能一個(gè)庫(kù)100條記錄吧?)。
今天的話(huà)題就討論到這里,內(nèi)容很多,占用大家寶貴的時(shí)間深表內(nèi)疚,估計(jì)大部分都記不住,至少記住這幾個(gè)點(diǎn)吧:
(1)單點(diǎn)系統(tǒng)存在的問(wèn)題:可用性問(wèn)題,性能瓶頸問(wèn)題
(2)shadow-master是一種常見(jiàn)的解決單點(diǎn)系統(tǒng)可用性問(wèn)題的方案
(3)減少與單點(diǎn)的交互,是存在單點(diǎn)的系統(tǒng)優(yōu)化的核心方向,常見(jiàn)方法有批量寫(xiě),客戶(hù)端緩存
(4)水平擴(kuò)展也是提升單點(diǎn)系統(tǒng)性能的好方案
聯(lián)系客服