學習完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師
負載均衡
什么是負載均衡呢喇伯?用戶輸入的流量通過負載均衡器按照某種負載均衡算法把流量均勻的分散到后端的多個服務器上,接收到請求的服務器可以獨立的響應請求夯膀,達到負載分擔的目的。從應用場景上來說,常見的負載均衡模型有全局負載均衡和集群內(nèi)負載均衡,從產(chǎn)品形態(tài)角度來說圆兵,又可以分為硬件負載均衡和軟件負載均衡。全局負載均衡一般通過DNS實現(xiàn)策泣,通過將一個域名解析到不同VIP衙傀,來實現(xiàn)不同的region調(diào)度能力抬吟;硬件負載均衡器常見的有F5萨咕、A10、Array火本,它們的優(yōu)缺點都比較明顯危队,優(yōu)點是功能強大聪建,有專門的售后服務團隊,性能比較好茫陆,缺點是缺少定制的靈活性金麸,維護成本較高;現(xiàn)在的互聯(lián)網(wǎng)更多的思路是通過軟件負載均衡來實現(xiàn)簿盅,這樣可以滿足各種定制化需求挥下,常見的軟件負載均衡有 LVS、Nginx桨醋、Haproxy棚瘟。
阿里云高性能負載均衡使用 LVS 和 Tengine,我們在一個 region 區(qū)分不同的機房,每個機房都有 LVS 集群和 Tengine 集群喜最,對于用戶配置的四層監(jiān)聽偎蘸,LVS 后面會直接掛載用戶 ECS,七層用戶監(jiān)聽 ECS 則掛載在 Tengine 上瞬内,四層監(jiān)聽的流量直接由 LVS 轉發(fā)到 ECS迷雪,而 7 層監(jiān)聽的流量會經(jīng)過 LVS 到 Tenigine 再到用戶 ECS。每一個 region 里都會有多個可用區(qū),達到主備容災目的蜂怎,每一個集群里都有多臺設備劲弦,第一是為了提升性能,第二也是基于容災考慮慧邮。
圖為高性能負載均衡控制管理概要圖,SLB 產(chǎn)品也有 SDN 概念舟陆,轉發(fā)和控制是分離的误澳,用戶所有配置通過控制臺先到控制器,通過集中控制器轉換將用戶配置推送到不同設備上秦躯,每臺設備上都有 Agent 接收控制器下發(fā)的需求忆谓,通過本地轉換成 LVS 和 Tengine 能夠識別的配置,這個過程支持熱配置踱承,不影響用戶轉發(fā)倡缠,不需要 reload 才能使新配置生效。
LVS
LVS 支持的三種模式
早期 LVS 支持三種模式茎活,DR 模式昙沦、TUN 模式和 NAT 模式。
DR 模式
DR 模式經(jīng)過 LVS 之后载荔,LVS 會將 MAC 地址更改盾饮、封裝 MAC 頭,內(nèi)層 IP 報文不動,報文經(jīng)過 LVS 負載均衡查找到 RS 之后丘损,將源 MAC 頭改成自己的普办,目的 MAC 改成 RS 地址,MAC 尋址是在二層網(wǎng)絡里徘钥,對網(wǎng)絡部署有一定的限定衔蹲,在大規(guī)模分布式集群部署里,這種模式的靈活性沒有辦法滿足需求呈础;
TUN 模式
TUN 模式走在 LVS 之后舆驶,LVS 會在原有報文基礎上封裝 IP 頭,到了后端 RS 之后而钞,RS 需要解開 IP 報文封裝贞远,才能拿到原始報文,不管是 DR 模式還是 TUN 模式笨忌,后端 RS 都可以看到真實客戶源 IP蓝仲,目的 IP 是自己的 VIP,VIP 在 RS 設備上需要配置官疲,這樣可以直接繞過 LVS 返回給用戶袱结,TUN 模式問題在于需要在后端 ECS 上配置解封裝模塊,在 Linux 上已經(jīng)支持這種模塊途凫,但是 Windows 上還沒有提供支持垢夹,所以會對用戶系統(tǒng)鏡像選擇有限定。
NAT 模式
NAT 模式用戶訪問的是 VIP维费,LVS 查找完后會將目的 IP 做 DNAT 轉換果元,選擇出 RS 地址,因為客戶端的 IP 沒變犀盟,在回包的時候直接向公網(wǎng)真實客戶端 IP 去路由而晒,NAT 的約束是因為 LVS 做了 DNAT 轉換,所以回包需要走 LVS阅畴,把報文頭轉換回去倡怎,由于 ECS 看到的是客戶端真實的源地址,我們需要在用戶 ECS 上配置路由贱枣,將到 ECS 的默認路由指向 LVS 上监署,這對用戶場景也做了限制。
LVS 基于 NetFilter 框架實現(xiàn)
NetFilter 是 Linux 提供的網(wǎng)絡開放平臺纽哥,基于平臺可以開發(fā)自己的業(yè)務功能模塊钠乏,早期好多安全廠商都是基于 NetFilter 做一些業(yè)務模型實現(xiàn),這種模型比較靈活春塌,但通用模型里更多的是兼容性考慮晓避,路徑會非常長簇捍;而且通用模型中沒辦法發(fā)揮多核特性,目前 CPU 的發(fā)展更多是向橫向擴展够滑,我們經(jīng)常見到多路服務器,每路上有多少核吕世,早期通用模型對多核支持并不是特別友善彰触,在多核設計上有些欠缺,導致我們在通用模型上做一些應用開發(fā)時的擴展性是有限的命辖,隨著核的數(shù)量越來越多况毅,性能不增反降。
LVS 的改進
早期模式的各種限制制約了我們的發(fā)展尔艇,所以我們首先做了 FullNAT尔许,相比原來的 NAT 方式,F(xiàn)ullNAT 多了 SNAT 屬性终娃,將客戶端的原 IP 地址作了轉換味廊;其次,我們在并行化上做了處理棠耕,充分利用多核實現(xiàn)性能線性提升余佛;然后是快速路徑,我們在做網(wǎng)絡轉發(fā)模型時很容易想到設計快速路徑和慢速路徑窍荧,慢速路徑更多是解決首包如何通過設備問題辉巡,可能需要查ACL或路由,需要判斷許多和策略相關的東西蕊退,后面所有報文都可以通過快速路徑轉發(fā)出去郊楣;還有指令相關優(yōu)化,利用因特爾特殊指令提升性能瓤荔;另外針對多核架構净蚤,NUMA 多節(jié)點內(nèi)存訪問,通過訪問 Local 節(jié)點內(nèi)存可能獲得更好的延遲表現(xiàn)输硝。
客戶端進來 IP 首先訪問 LVS 的 VIP塞栅,原 IP 是客戶端的,目的 IP 是 LVS 的 VIP腔丧,經(jīng)過 FullNAT 轉換后放椰,原 IP 變成 LVS 的 Local 地址,目的地址是 LVS 選擇出來的 RS 地址愉粤,這樣在 RS 回包時比較容易砾医,只要路由可達,報文一定會交到 LVS 上衣厘,不需要在 RS 上做特殊的配置如蚜。右面就是 DNAT + SNAT 轉換压恒,報文就可以通過 LVS 轉發(fā)回客戶端,這種方式主要帶來應用場景部署靈活性選擇错邦。
通過并行化實現(xiàn)對 LVS 性能的改善探赫,性能沒有辦法得到線性提升更多的是因為每條路徑都需要訪問全局資源,就會不可避免引入鎖的開箱撬呢,另外伦吠,同一條鏈接上的報文可能分散在不同的核上,大家去訪問全局資源時也會導致 cache 的丟失魂拦。所以我們通過 RSS 技術把同一個五源組報文扔到同一個 CPU 上處理毛仪,保證入方向的所有相同連接上的報文都能交給相同 CPU 處理,每個核在轉發(fā)出去時都用當前 CPU 上的 Local 地址芯勘,通過設置一些 fdir 規(guī)則箱靴,報文回來時后端 RS 訪問的目的地址就是對應 CPU 上的 local 地址,可以交到指定的 CPU 上去處理荷愕,這樣一條連接上左右方向報文都可以交給同一個 CPU 處理衡怀,將流在不同的 CPU 隔離開;另外安疗,我們把所有配置資源包括動態(tài)緩存資源在每個 CPU 上作了拷貝狈癞,將資源局部化,這使整個流從進入 LVS 到轉發(fā)出去訪問的資源都是固定在一個核上的本地資源茂契,使性能達到最大化蝶桶,實現(xiàn)線性提升。
改進后的 LVS 表現(xiàn)如下:
- 出于對容災和性能提升的考慮掉冶,我們做了集群化部署真竖,每個 region 有不同機房,每個機房有多個調(diào)度單元厌小,每個單元有多臺 LVS 設備恢共;
- 每臺 LVS 經(jīng)過優(yōu)化后,都能達到更高性能璧亚,大容量讨韭,單臺 LVS 可以達到 4000W PPS,600W CPS癣蟋、單個 group 可以到達 1億 并發(fā)透硝;
- 支持 region、IDC疯搅、集群和應用級的高可用濒生;
- 實現(xiàn)了防攻擊功能,并在原版 LVS 上提供了更豐富的功能幔欧,可以基于各個維度做管理控制罪治,精確的統(tǒng)計丽声,流量的分析等。
Tengine
Tengine 在應用過程中也遇到了各種問題觉义,最嚴重的就是性能問題雁社,我們發(fā)現(xiàn)隨著 CPU 數(shù)量越來越多,QPS 值并沒有線性提升晒骇;Nginx 本身是多 worker 模型霉撵,每個 worker 是單進程模式,多 worker 架構做 CPU 親和厉碟,內(nèi)部基于事件驅動的模型喊巍,其本身已經(jīng)提供了很高的性能屠缭,單核 Nginx 可以跑到 1W5~2W QPS箍鼓。Nginx 往下第一層是 socket API,socket 往下有一層 VFS呵曹,再往下是 TCP款咖、IP,socket 層比較薄奄喂,經(jīng)過量化的分析和評估铐殃,性能開銷最大的是 TCP 協(xié)議棧和 VFS 部分,因為同步開銷大跨新,我們發(fā)現(xiàn)橫向擴展不行富腊,對此,我們做了一些優(yōu)化域帐。
七層反向代理的路徑更長赘被,處理更復雜,所以它的性能比 LVS 低很多肖揣,我們比較關注單機和集群的性能民假,集群性能可以靠堆設備去解決,單機如果不提升龙优,成本會一直增加羊异,從性能角度來看,有以下的優(yōu)化思路和方向:
- 基于 Kernel 做開發(fā)彤断,比如優(yōu)化協(xié)議棧野舶;
- 基于 AliSocket 的優(yōu)化,AliSocket 是阿里研發(fā)的高性能 TCP 協(xié)議棧平臺宰衙,底層是 DPDK筒愚,它將資源做了局部化處理,報文分發(fā)不同核處理菩浙,性能非常出色巢掺;
- HTTPS 業(yè)務越來越多句伶,流量逐步遞增,我們采用硬件加速卡方式做一些加解密的性能提升陆淀,還有 HTTPS 的會話復用考余;
- 基于 Web 傳輸層的性能優(yōu)化