由于最近經(jīng)常用簡(jiǎn)書,于是開始把之前在其他平臺(tái)寫的文章搬到這里。并總結(jié)形成專輯,希望對(duì)大家有用。
1. 高可用架構(gòu)的設(shè)計(jì)原則:網(wǎng)站高可用的主要手段是冗余,應(yīng)用部署在多臺(tái)服務(wù)器上同時(shí)提供訪問,數(shù)據(jù)存儲(chǔ)在多臺(tái)服務(wù)器上互相備份,任何一臺(tái)服務(wù)器宕機(jī)都不會(huì)影響應(yīng)用的整體可用,也不會(huì)導(dǎo)致數(shù)據(jù)丟失。
2.伸縮性強(qiáng)架構(gòu)的設(shè)計(jì)標(biāo)準(zhǔn):衡量架構(gòu)伸縮性的主要標(biāo)準(zhǔn)是是否可以用多臺(tái)服務(wù)器構(gòu)建集群,是否容易向集群中添加新的服務(wù)器。加入新的服務(wù)器后是否可以提供和原來的服務(wù)器無差別的服務(wù)。集群中可容納的總的服務(wù)器數(shù)量是否有限制。
3.擴(kuò)展性強(qiáng)架構(gòu)的設(shè)計(jì)標(biāo)準(zhǔn):衡量網(wǎng)站架構(gòu)擴(kuò)展性好壞的主要標(biāo)準(zhǔn)是在網(wǎng)站增加新的業(yè)務(wù)產(chǎn)品時(shí),是否可以實(shí)現(xiàn)對(duì)現(xiàn)有產(chǎn)品的透明無影響,不需要任何改動(dòng)或者很少的改動(dòng)既有業(yè)務(wù)功能就可以上線新產(chǎn)品。不同產(chǎn)品之間是否很少耦合,一個(gè)產(chǎn)品改動(dòng)對(duì)其他產(chǎn)品無影響,其他產(chǎn)品和功能不需要受牽連進(jìn)行改動(dòng)。網(wǎng)站可擴(kuò)展架構(gòu)的主要手段是消息隊(duì)列和分布式服務(wù)。
4. 任何一個(gè)大型網(wǎng)站都是從小網(wǎng)站發(fā)展而來的,開始的架構(gòu)都很簡(jiǎn)單,甚至只有一臺(tái)服務(wù)器,當(dāng)出現(xiàn)性能問題是不斷優(yōu)化,最終發(fā)展成具有成千上萬臺(tái)服務(wù)器的規(guī)模。性能優(yōu)化分為web前端性能優(yōu)化、應(yīng)用服務(wù)器性能優(yōu)化、存儲(chǔ)服務(wù)器性能優(yōu)化。web前端優(yōu)化包括瀏覽器加載、網(wǎng)站視圖模型、圖片服務(wù)、CDN服務(wù)等。主要優(yōu)化手段有優(yōu)化瀏覽器訪問、使用反向代理、CDN等。應(yīng)用服務(wù)器的主要優(yōu)化手段有緩存(如memcached)、異步(如消息隊(duì)列)、集群。
大型網(wǎng)站架構(gòu)演化過程:一臺(tái)服務(wù)器承載應(yīng)用程序和數(shù)據(jù)、文件 => 數(shù)據(jù)和應(yīng)用分離 =>使用緩存(本地緩存和遠(yuǎn)程緩存) => 應(yīng)用服務(wù)器使用集群 => 數(shù)據(jù)庫讀寫分離 => 使用反向代理和CDN => 數(shù)據(jù)分庫 => 分布式數(shù)據(jù)庫和分布式文件系統(tǒng) => 使用Nosql數(shù)據(jù)庫和搜索引擎 => 業(yè)務(wù)拆分 => 分布式服務(wù)。
5. 應(yīng)用服務(wù)器的高可用架構(gòu)設(shè)計(jì)主要基于服務(wù)無狀態(tài)這一特性,這就需要單獨(dú)存儲(chǔ)用戶的session信息。常用的方式有利用瀏覽器的cookie記錄session以及使用session服務(wù)器集群。
6.保證數(shù)據(jù)高可用的主要手段是數(shù)據(jù)備份和失效轉(zhuǎn)移機(jī)制。對(duì)于緩存服務(wù)器集群,應(yīng)當(dāng)通過邏輯或者物理分區(qū)的方式將整個(gè)網(wǎng)站的每個(gè)應(yīng)用的緩存部署在多臺(tái)服務(wù)器上,任何一臺(tái)服務(wù)器宕機(jī)都只影響應(yīng)用緩存的一部分?jǐn)?shù)據(jù),不會(huì)對(duì)應(yīng)用性能和數(shù)據(jù)庫負(fù)載造成太大影響。
7. CAP:系統(tǒng)的可用性、伸縮性和一致性。一般來說無法同時(shí)滿足這3者,一般都會(huì)選擇可用性和伸縮性,放棄強(qiáng)一致性。
8. 網(wǎng)站的伸縮性設(shè)計(jì)分為2類,一類是根據(jù)功能進(jìn)行物理分離實(shí)現(xiàn)伸縮,一類是單一功能通過集群實(shí)現(xiàn)伸縮。前者是不同的服務(wù)器部署不同的服務(wù),提供不同的功能,后者是集群內(nèi)的多臺(tái)服務(wù)器部署相同的服務(wù),提供相同的功能。其中單一功能的伸縮又可分為應(yīng)用服務(wù)器集群伸縮性和數(shù)據(jù)服務(wù)器集群伸縮性。
9. 對(duì)于應(yīng)用服務(wù)器集群伸縮性,需要把應(yīng)用服務(wù)器設(shè)計(jì)成無狀態(tài)的,即應(yīng)用服務(wù)器不存儲(chǔ)請(qǐng)求上下文信息,這樣用戶請(qǐng)求可以發(fā)送到集群中任意一臺(tái)服務(wù)器處理,任意一臺(tái)服務(wù)器處理結(jié)果都是相同的。應(yīng)用服務(wù)器集群伸縮性通常有DNS域名解析負(fù)載均衡、反向代理負(fù)載均衡、IP負(fù)載均衡、鏈路層負(fù)載均衡。
10. 事實(shí)上大型網(wǎng)站總是部分使用DNS域名解析作為第一級(jí)負(fù)載均衡手段,即域名解析得到的一組服務(wù)器并不是實(shí)際提供web服務(wù)的物理服務(wù)器,而是同樣提供負(fù)載均衡服務(wù)的內(nèi)部服務(wù)器,這組內(nèi)部服務(wù)器再進(jìn)行負(fù)載均衡,將請(qǐng)求發(fā)送到真實(shí)的web服務(wù)器上。
11. 使用三角傳輸模式的鏈路層負(fù)載均衡是目前大型網(wǎng)站使用最多的負(fù)載均衡手段。例如Linux上的LVS。
12. 常用的負(fù)載均衡算法有輪詢、加權(quán)輪詢、隨機(jī)、最少連接、源地址散列。
13. Memcached的伸縮性算法有余數(shù)Hash算法、一致性Hash環(huán)、帶虛擬節(jié)點(diǎn)的一致性Hash環(huán)。余數(shù)Hash算法在增加一臺(tái)服務(wù)器的情況下緩存命中失敗的概率為N/(N+1)。一致性Hash算法具有較高的緩存命中率,增加一臺(tái)服務(wù)器緩存命中失敗的概率約為1/(N+1),但存在負(fù)載壓力不均衡的問題,為了解決這個(gè)不均衡問題誕生了帶虛擬節(jié)點(diǎn)的一致性Hash環(huán)。
14. 關(guān)系數(shù)據(jù)庫的伸縮性設(shè)計(jì)中,主服務(wù)器將數(shù)據(jù)同步到從服務(wù)器,寫操作主要在主服務(wù)器進(jìn)行,讀操作、數(shù)據(jù)分析操作主要在從服務(wù)器進(jìn)行。可以借助Cobar進(jìn)行數(shù)據(jù)庫服務(wù)器的伸縮設(shè)計(jì)。
15. Nosql數(shù)據(jù)庫的伸縮性設(shè)計(jì),以HBase為例,主要借助于Hbase自身的HMaster、HRegionServer、HRegion等概念。通過Key查詢HRegionServer地址以及HRegion,并最終獲得數(shù)據(jù)。
16. 在大型網(wǎng)站中,各種模塊通過分布式部署的方式,獨(dú)立的模塊部署在獨(dú)立的服務(wù)器集群上,從物理上分離模塊之間的耦合關(guān)系,進(jìn)一步降低耦合性提高復(fù)用性。模塊分布式部署以后具體的聚合方式有分布式消息隊(duì)列和分布式服務(wù)。
17. 目前國(guó)內(nèi)應(yīng)用比較多的分布式服務(wù)框架是阿里巴巴的Dubbo。
18. 傳統(tǒng)的關(guān)系數(shù)據(jù)庫在創(chuàng)建表的時(shí)候需要指定字段名和類型,這種僵硬的數(shù)據(jù)結(jié)構(gòu)難以面對(duì)需求變更帶來的挑戰(zhàn)。Nosql數(shù)據(jù)庫在創(chuàng)建表的時(shí)候只需要指定ColumnFamily,可以在插入數(shù)據(jù)的時(shí)候再指定具體的字段名,通過這種方式數(shù)據(jù)表可以擁有數(shù)百萬的字段,使得應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)可以隨意擴(kuò)展,很好的解決了數(shù)據(jù)結(jié)構(gòu)的擴(kuò)展性問題。