老曹眼中的負(fù)載均衡
什么是負(fù)載均衡
負(fù)載(load)一詞起源于典型系統(tǒng),指連接在電路中消耗電能的裝置,負(fù)載(用電器)的功能是把電能轉(zhuǎn)變?yōu)槠渌问侥堋R瓿鰜?lái),一個(gè)是實(shí)體,一個(gè)轉(zhuǎn)化。
于是,對(duì)于實(shí)體,有了通信幀或者報(bào)文中數(shù)據(jù)字段的內(nèi)容被稱為信息負(fù)載(payload),網(wǎng)絡(luò)負(fù)載指的就是網(wǎng)絡(luò)中繼承載的流量以及網(wǎng)絡(luò)設(shè)備承載的用戶量。
轉(zhuǎn)化被進(jìn)一步闡釋為資源的使用情況,操作系統(tǒng)的平均負(fù)載是CPU的Load 即workload,它所包含的信息不是CPU的使用率狀況,而是在一段時(shí)間內(nèi)CPU正在處理以及等待CPU處理的進(jìn)程數(shù)之和的統(tǒng)計(jì)信息。
了解了負(fù)載,那么負(fù)載均衡就容易理解了。wiki百科給出的定義是這樣的:
負(fù)載均衡(Load balancing)是一種計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),用來(lái)在多個(gè)計(jì)算機(jī)(計(jì)算機(jī)集群)、網(wǎng)絡(luò)連接、CPU、磁盤驅(qū)動(dòng)器或其他資源中分配負(fù)載,以達(dá)到最佳化資源使用、最大化吞吐率、最小化響應(yīng)時(shí)間、同時(shí)避免過(guò)載的目的。使用帶有負(fù)載平衡的多個(gè)服務(wù)器組件,取代單一的組件,可以通過(guò)冗余提高可靠性。負(fù)載平衡服務(wù)通常是由專用軟件和硬件來(lái)完成。
并且,wiki百科自身的系統(tǒng)就使用了負(fù)載均衡, 后段系統(tǒng)使用了elasticsearch。
每一種技術(shù)都有它應(yīng)用的場(chǎng)景和領(lǐng)域,負(fù)載均衡主要解決的是系統(tǒng)性能問(wèn)題。但是,了解了根源,就可以知道不能夠一提到性能問(wèn)題就非負(fù)載均衡莫屬,如果負(fù)載減少了,可能少一點(diǎn)均衡也可以解決問(wèn)題,這樣的技術(shù)例如緩存。
基于DNS的負(fù)載均衡
基于DNS的負(fù)載均衡是負(fù)載均衡的最簡(jiǎn)方法,可以說(shuō)是窮人的負(fù)載均衡。
DNS會(huì)將域名映射為IP地址,反之亦然。所有核心DNS服務(wù)器都是集群,用的最多的DNS服務(wù)器大概就是BIND了。查詢DNS服務(wù)器時(shí),推薦使用dig;查詢DNS解析時(shí),推薦使用nslookup。 使用DNS緩存可以提高DNS解析的性能。Dig 在mac上的使用示例如下:
對(duì)于DNS實(shí)現(xiàn)的負(fù)載均衡非常簡(jiǎn)單,采用輪轉(zhuǎn)的方式,只要為所要服務(wù)的域名增加多個(gè)A記錄即可。
例如:
abel.com. IN A 192.168.23.101 abel.com. IN A 192.168.23.102 abel.com. IN A 192.168.23.103 abel.com. IN A 192.168.23.104
基于DNS的負(fù)載均衡簡(jiǎn)單,易于調(diào)試且容易擴(kuò)展。缺陷在于它有慢性失憶癥,無(wú)法將會(huì)話信息從一個(gè)請(qǐng)求保留到下一個(gè)請(qǐng)求。而且,只是對(duì)目標(biāo)服務(wù)地址進(jìn)行了均衡,無(wú)法考慮請(qǐng)求處理的負(fù)載強(qiáng)度進(jìn)行均衡,同時(shí)容錯(cuò)性較差。支持DNS 負(fù)載均衡的服務(wù)商有AWS Route 53 以及dnspod。
HTTP 負(fù)載均衡
負(fù)載均衡解決的是性能問(wèn)題,要先了解單個(gè)服務(wù)器的狀況。一般地,nginx 的應(yīng)答率比Apache 高,所以,有時(shí)更換Web 服務(wù)器就可以提高性能。
提高Apache Http的方法有禁用空載模塊,禁用DNS查詢,采用壓縮模塊,不使用SymLinksIfOwnerMatch選項(xiàng),并且在Directory選項(xiàng)中啟用FollowSymLinks,等等。
Nginx本身就是高性能的,但可以通過(guò)worker_processes 和worker_cpu_affinity調(diào)整來(lái)匹配服務(wù)器的硬件平臺(tái),還可以對(duì)壓縮進(jìn)行區(qū)分對(duì)待,使用其緩存的能力。例如
Http{ gzip on; gzip_static on; gzip_comp_level 2; gzip_types application/javascript;}
HTTP的負(fù)載均衡相當(dāng)于7層負(fù)載均衡,不論Apache 還是 Nginx 都可以充當(dāng)HTTP的負(fù)載均衡器。
以基于權(quán)重的負(fù)載均衡為例,可以配置Nginx把請(qǐng)求更多地分發(fā)到高配置的后端服務(wù)器上,把相對(duì)較少的請(qǐng)求分發(fā)到低配服務(wù)器。配置的示例如下:
- http{
- upstream sampleapp {
- server 192.168.1.23 weight=2;
- server 192.168.1.24;
- }
- ....
- server{
- listen 80;
- ...
- location / {
- proxy_pass http://myapp;
- }
- }
Nginx 作為負(fù)載均衡工作在7層,可以對(duì)做正則規(guī)則處理(如針對(duì)域名、目錄進(jìn)行分流等) ,配置簡(jiǎn)單,能ping通就能進(jìn)行負(fù)載功能,可以通過(guò)端口檢測(cè)后端服務(wù)器狀態(tài),不支持url檢測(cè)。Nginx 負(fù)載均衡抗高并發(fā),采用epoll網(wǎng)絡(luò)模型處理客戶請(qǐng)求,但應(yīng)用范圍受限。
數(shù)據(jù)庫(kù)負(fù)載均衡
數(shù)據(jù)庫(kù)負(fù)載均衡的一般用法是從讀寫分離開(kāi)始的,因?yàn)橐话愕膽?yīng)用都是讀多寫少的緣故吧。將數(shù)據(jù)庫(kù)做成主從,主數(shù)據(jù)用于寫操作,從數(shù)據(jù)庫(kù)用于讀操作,事務(wù)一般在主庫(kù)完成。
數(shù)據(jù)庫(kù)集群是數(shù)據(jù)庫(kù)負(fù)載均衡的典型方式,集群管理服務(wù)器作為負(fù)載均衡器,例如 MySQL cluster。
更簡(jiǎn)單的方式是通過(guò)Haproxy 來(lái)完成負(fù)載均衡的調(diào)度。
HAProxy能夠補(bǔ)充Nginx的一些缺點(diǎn)比如Session的保持,Cookie的引導(dǎo)等工作,支持url檢測(cè)后端的服務(wù)器,對(duì)于問(wèn)題的排查會(huì)有很好的幫助。
HAProxy擁有更多的負(fù)載均衡策略比如:動(dòng)態(tài)加權(quán)輪循(Dynamic Round Robin),加權(quán)源地址哈希(Weighted Source Hash),加權(quán)URL哈希和加權(quán)參數(shù)哈希(Weighted Parameter Hash)等,單純從效率上來(lái)講HAProxy更會(huì)比Nginx有更出色的負(fù)載均衡速度。
網(wǎng)絡(luò)連接的負(fù)載均衡
LVS(也叫IPVS,IP虛擬服務(wù)器)是在四層交換上設(shè)置Web服務(wù)的虛擬IP地址,對(duì)客戶端是可見(jiàn)的。當(dāng)客戶訪問(wèn)此Web應(yīng)用時(shí),客戶端的Http請(qǐng)求會(huì)先被第四層交換機(jī)接收到,它將基于第四層交換技術(shù)實(shí)時(shí)檢測(cè)后臺(tái)Web服務(wù)器的負(fù)載,根據(jù)設(shè)定的算法進(jìn)行快速交換。常見(jiàn)的算法有輪詢、加權(quán)、最少連接、隨機(jī)和響應(yīng)時(shí)間等。
LVS抗負(fù)載能力強(qiáng),使用IP負(fù)載均衡技術(shù),只做分發(fā),所以LVS本身并沒(méi)有多少流量產(chǎn)生。 LVS的穩(wěn)定性和可靠性都很好應(yīng)用范圍比較廣,可以對(duì)所有應(yīng)用做負(fù)載均衡,缺陷是不支持正則處理,不能做動(dòng)靜分離。
通過(guò)LVS+Keepalived構(gòu)建的LVS集群,LVS負(fù)載均衡用戶請(qǐng)求到后端服務(wù)器,Keepalived的作用是檢測(cè)web服務(wù)器的狀態(tài),如果有一臺(tái)web服務(wù)器死機(jī),或工作出現(xiàn)故障,Keepalived將檢測(cè)到,并將有故障的web服務(wù)器從系統(tǒng)中剔除,當(dāng)web服務(wù)器工作正常后Keepalived自動(dòng)將web服務(wù)器加入到服務(wù)器群中,這些工作全部自動(dòng)完成,不需要人工干涉,需要人工做的只是修復(fù)故障的web服務(wù)器。
下圖是Keepalived的原理圖:
SSL負(fù)載均衡
信任是互聯(lián)網(wǎng)的基石,出于安全性的考量,服務(wù)中往往需要SSL的連接。SSL 有兩種認(rèn)證方式:雙向認(rèn)證 SSL 協(xié)議要求服務(wù)器和用戶雙方都有證書(shū);單向認(rèn)證 SSL 協(xié)議不需要客戶擁有CA證書(shū)。一般Web應(yīng)用,配置SSL單向認(rèn)證即可。但部分金融行業(yè)用戶的應(yīng)用對(duì)接,可能會(huì)要求對(duì)客戶端(相對(duì)而言)做身份驗(yàn)證。這時(shí)就需要做SSL雙向認(rèn)證。
SSL 屬于應(yīng)用層的協(xié)議,所以只能在 7 層上來(lái)做,而 HAProxy 也是支持 SSL 協(xié)議的,所以一種方式是只需簡(jiǎn)單的讓 HAProxy 開(kāi)啟 SSL 支持完成對(duì)內(nèi)解密對(duì)外加密的處理, 但引入 SSL 處理是有額外的性能開(kāi)銷的(如上面談到的認(rèn)證), 所以 一般采用SSL proxy farm, 典型的架構(gòu)如下:
壓力和負(fù)載測(cè)試
測(cè)試負(fù)載的狀況,一般要涉及負(fù)載或壓力測(cè)試。
負(fù)載測(cè)試是模擬實(shí)際軟件系統(tǒng)所承受的負(fù)載條件的系統(tǒng)負(fù)荷,通過(guò)不斷增加負(fù)載載(如逐漸增加模擬用戶的數(shù)量)或其它加載方式來(lái)觀察不同負(fù)載下系統(tǒng)的響應(yīng)時(shí)間和數(shù)據(jù)吞吐量、系統(tǒng)占用的資源等,以檢驗(yàn)系統(tǒng)的行為和特性,并發(fā)現(xiàn)系統(tǒng)可能存在的性能瓶頸、內(nèi)存泄漏、不能實(shí)時(shí)同步等問(wèn)題。
負(fù)載測(cè)試更多地體現(xiàn)了一種方法或一種技術(shù)。壓力測(cè)試是在強(qiáng)負(fù)載(大數(shù)據(jù)量、大量并發(fā)用戶等)下的測(cè)試,查看應(yīng)用系統(tǒng)在峰值使用情況下操作行為,從而有效地發(fā)現(xiàn)系統(tǒng)的某項(xiàng)功能隱患、系統(tǒng)是否具有良好的容錯(cuò)能力和可恢復(fù)能力。壓力測(cè)試分為高負(fù)載下的長(zhǎng)時(shí)間(如24小時(shí)以上)的穩(wěn)定性壓力測(cè)試和極限負(fù)載情況下導(dǎo)致系統(tǒng)崩潰的破壞性壓力測(cè)試。
壓力測(cè)試可以被看作是負(fù)載測(cè)試的一種,即高負(fù)載下的負(fù)載測(cè)試,或者說(shuō)壓力測(cè)試采用負(fù)載測(cè)試技術(shù)。
簡(jiǎn)單地,httperf 或者Apache AB 就可以測(cè)量HTTP 服務(wù)器的負(fù)載性能。
云服務(wù)的負(fù)載均衡
云時(shí)代的到來(lái),使負(fù)載均衡成了平臺(tái)級(jí)的服務(wù),幾乎所有的云服務(wù)提供商都提供了負(fù)載均衡服務(wù)。下面是阿里云的負(fù)載均衡基礎(chǔ)框架圖:
特別的,qingcloud 的vpc 也是挺有特點(diǎn)的,私有網(wǎng)絡(luò) 用于主機(jī)之間互聯(lián),類似于使用交換機(jī)(L2 Switch)自組局域網(wǎng)。彈性IP還好,管理路由器就顯得很貼心了。
AWS 的負(fù)載均衡還是業(yè)界典范,官方給出的示意圖如下:
高可用性
高可用性是負(fù)載均衡帶來(lái)的另一價(jià)值, 即負(fù)載均衡經(jīng)常被用于實(shí)現(xiàn)故障轉(zhuǎn)移。當(dāng)一個(gè)或多個(gè)組件出現(xiàn)故障時(shí),能持續(xù)提供服務(wù)的這些組件都在持續(xù)監(jiān)控中,當(dāng)一個(gè)組件沒(méi)有響應(yīng),負(fù)載均衡器就會(huì)發(fā)現(xiàn)它,并不再向其發(fā)送數(shù)據(jù)。同樣當(dāng)一個(gè)組件重新上線,負(fù)載均衡器會(huì)重新開(kāi)始向其發(fā)送數(shù)據(jù)。
SLA 作為高可用性的指標(biāo),一般有3個(gè)時(shí)間標(biāo)準(zhǔn):99.9%,99.99%,99.999%. 表示不間斷運(yùn)行的離線時(shí)間不超過(guò):
- 3個(gè)9: 8.76 小時(shí)
- 4個(gè)9:52.26 小時(shí)
- 5個(gè)9:5.26 分鐘
三點(diǎn)兩地的災(zāi)備方案并不是誰(shuí)都做的起的,有了云服務(wù)就顯得不那么苦難了。下面是阿里云給出的容災(zāi)示意圖,多可用區(qū)部署,機(jī)房宕機(jī)后,仍能正常工作。
系統(tǒng)的監(jiān)控在系統(tǒng)高可用性上作用很大,個(gè)人推薦zabbix。
總體來(lái)看, 負(fù)載均衡是系統(tǒng)架構(gòu)和DevOps 中的重要技術(shù),對(duì)系統(tǒng)性能影響巨大。當(dāng)然,如果有更高需求的話,就需要考慮硬件的負(fù)載均衡方案了,比如說(shuō)F5。
【本文來(lái)自51CTO專欄作者老曹的原創(chuàng)文章,作者微信公眾號(hào):喔家ArchiSelf,id:wrieless-com】