微信公共號 [架構(gòu)師之路] 上看到兩篇文章 究竟啥才是互聯(lián)網(wǎng)架構(gòu)“高可用” 究竟啥才是互聯(lián)網(wǎng)架構(gòu)“高并發(fā)”岂丘,學(xué)習(xí)了下,一些筆記眠饮。
什么是高可用
高可用 HA(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一奥帘,它通常是指,通過設(shè)計減少系統(tǒng)不能提供服務(wù)的時間仪召。
如何保障系統(tǒng)的高可用
冗余(多個節(jié)點(diǎn)) + 自動故障轉(zhuǎn)移
什么是高并發(fā)
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一寨蹋,它通常是指,通過設(shè)計保證系統(tǒng)能夠同時并行處理很多請求扔茅。
如何提升系統(tǒng)的并發(fā)能力
- 垂直擴(kuò)展:提升單機(jī)處理能力已旧。
- 水平擴(kuò)展:只要增加服務(wù)器數(shù)量,就能線性擴(kuò)充系統(tǒng)性能召娜。
常見的互聯(lián)網(wǎng)分層架構(gòu)
- 客戶端層:典型調(diào)用方是瀏覽器或者手機(jī)應(yīng)用
- 反向代理層:系統(tǒng)入口运褪,反向代理
- 站點(diǎn)應(yīng)用層:實(shí)現(xiàn)核心應(yīng)用邏輯,返回 HTML
- 服務(wù)層:如果實(shí)現(xiàn)了服務(wù)化萤晴,就有這一層
- 數(shù)據(jù)-緩存層:緩存加速訪問存儲
- 數(shù)據(jù)-數(shù)據(jù)庫層:數(shù)據(jù)庫固化數(shù)據(jù)存儲
分層高可用架構(gòu)實(shí)踐
【客戶端層->反向代理層】的高可用
【客戶端層】到【反向代理層】的高可用吐句,是通過 反向代理層的冗余 來實(shí)現(xiàn)的。
以 nginx 為例:有兩臺 nginx店读,一臺對線上提供服務(wù),另一臺冗余以保證高可用攀芯,常見的實(shí)踐是 keepalived 存活探測屯断,相同 virtual IP 提供服務(wù)。
自動故障轉(zhuǎn)移:當(dāng) nginx 掛了的時候,keepalived 能夠探測到殖演,會自動的進(jìn)行故障轉(zhuǎn)移氧秘,將流量自動遷移到 shadow-nginx,由于使用的是相同的 virtual IP趴久,這個切換過程對調(diào)用方是透明的丸相。
【反向代理層->站點(diǎn)層】的高可用
【反向代理層】到【站點(diǎn)層】的高可用,是通過 站點(diǎn)層的冗余 來實(shí)現(xiàn)的彼棍。
假設(shè)反向代理層是 nginx灭忠,nginx.conf 里能夠配置多個 web 后端,并且 nginx 能夠探測到多個后端的存活性座硕。
自動故障轉(zhuǎn)移:當(dāng) web-server 掛了的時候弛作,nginx 能夠探測到,會自動的進(jìn)行故障轉(zhuǎn)移华匾,將流量自動遷移到其他的 web-server映琳,整個過程由 nginx 自動完成,對調(diào)用方是透明的蜘拉。
【站點(diǎn)層->服務(wù)層】的高可用
【站點(diǎn)層】到【服務(wù)層】的高可用萨西,是通過 服務(wù)層的冗余 來實(shí)現(xiàn)的。
“服務(wù)連接池”會建立與下游服務(wù)多個連接旭旭,每次請求會“隨機(jī)”選取連接來訪問下游服務(wù)原杂。
自動故障轉(zhuǎn)移:當(dāng) service 掛了的時候,service-connection-pool 能夠探測到您机,會自動的進(jìn)行故障轉(zhuǎn)移穿肄,將流量自動遷移到其他的 service,整個過程由連接池自動完成际看,對調(diào)用方是透明的咸产。
【服務(wù)層->緩存層】的高可用
【服務(wù)層】到【緩存層】的高可用,是通過 緩存數(shù)據(jù)的冗余 來實(shí)現(xiàn)的仲闽。
緩存層的數(shù)據(jù)冗余又有幾種方式:第一種是利用客戶端的封裝脑溢,service 對 cache 進(jìn)行雙讀或者雙寫。
緩存層也可以通過支持主從同步的緩存集群來解決緩存層的高可用問題赖欣。
以 redis 為例屑彻,redis 天然支持主從同步,redis 官方也有 sentinel 哨兵機(jī)制顶吮,來做 redis 的存活性檢測社牲。
自動故障轉(zhuǎn)移:當(dāng) redis 主掛了的時候,sentinel 能夠探測到悴了,會通知調(diào)用方訪問新的 redis搏恤,整個過程由 sentinel 和 redis 集群配合完成腔长,對調(diào)用方是透明的食听。
【服務(wù)層->數(shù)據(jù)庫層】的高可用
大部分互聯(lián)網(wǎng)技術(shù)豹缀,數(shù)據(jù)庫層都用了 主從同步竟纳,讀寫分離 架構(gòu)。
所以數(shù)據(jù)庫層的高可用息罗,又分為 讀庫高可用 與 寫庫高可用 兩類掂咒。
讀庫高可用
【服務(wù)層】到【數(shù)據(jù)庫讀】的高可用,是通過 讀庫的冗余 來實(shí)現(xiàn)的迈喉。
既然冗余了讀庫绍刮,一般來說就至少有 2 個從庫,“數(shù)據(jù)庫連接池”會建立與讀庫多個連接弊添,每次請求會路由到這些讀庫录淡。
自動故障轉(zhuǎn)移:當(dāng)讀庫掛了的時候,db-connection-pool 能夠探測到油坝,會自動的進(jìn)行故障轉(zhuǎn)移嫉戚,將流量自動遷移到其他的讀庫,整個過程由連接池自動完成澈圈,對調(diào)用方是透明的彬檀。
寫庫高可用
【服務(wù)層】到【數(shù)據(jù)庫寫】的高可用,是通過 寫庫的冗余 來實(shí)現(xiàn)的瞬女。
以 mysql 為例窍帝,可以設(shè)置兩個 mysql 雙主同步,一臺對線上提供服務(wù)诽偷,另一臺冗余以保證高可用坤学,常見的實(shí)踐是 keepalived 存活探測,相同 virtual IP 提供服務(wù)报慕。
自動故障轉(zhuǎn)移:當(dāng)寫庫掛了的時候深浮,keepalived 能夠探測到,會自動的進(jìn)行故障轉(zhuǎn)移眠冈,將流量自動遷移到 shadow-db-master飞苇,由于使用的是相同的 virtual IP,這個切換過程對調(diào)用方是透明的蜗顽。
分層水平擴(kuò)展架構(gòu)實(shí)踐
反向代理層的水平擴(kuò)展
反向代理層的水平擴(kuò)展布卡,是通過 DNS輪詢 實(shí)現(xiàn)的:dns-server 對于一個域名配置了多個解析 ip,每次DNS 解析請求來訪問 dns-server雇盖,會輪詢返回這些 ip忿等。
當(dāng) nginx 成為瓶頸的時候,只要增加服務(wù)器數(shù)量刊懈,新增 nginx 服務(wù)的部署这弧,增加一個外網(wǎng) ip娃闲,就能擴(kuò)展反向代理層的性能虚汛,做到理論上的無限高并發(fā)匾浪。
站點(diǎn)層的水平擴(kuò)展
站點(diǎn)層的水平擴(kuò)展,是通過 nginx 實(shí)現(xiàn)的卷哩。通過修改 nginx.conf蛋辈,可以設(shè)置多個 web 后端。
當(dāng) web 后端成為瓶頸的時候将谊,只要增加服務(wù)器數(shù)量冷溶,新增 web 服務(wù)的部署,在 nginx 配置中配置上新的 web 后端尊浓,就能擴(kuò)展站點(diǎn)層的性能逞频,做到理論上的無限高并發(fā)。
服務(wù)層的水平擴(kuò)展
服務(wù)層的水平擴(kuò)展栋齿,是通過 服務(wù)連接池 實(shí)現(xiàn)的苗胀。
站點(diǎn)層通過 RPC-client 調(diào)用下游的服務(wù)層 RPC-server 時,RPC-client 中的連接池會建立與下游服務(wù)多個連接瓦堵,當(dāng)服務(wù)成為瓶頸的時候基协,只要增加服務(wù)器數(shù)量,新增服務(wù)部署菇用,在 RPC-client 處建立新的下游服務(wù)連接澜驮,就能擴(kuò)展服務(wù)層性能,做到理論上的無限高并發(fā)惋鸥。
引用:
究竟啥才是互聯(lián)網(wǎng)架構(gòu)“高可用”
究竟啥才是互聯(lián)網(wǎng)架構(gòu)“高并發(fā)”