之前負責過公司webcdn相關的設計和維護工作,同時做了些應用運維方面的工作,簡單談幾個我對接觸過的幾款負載均衡器的瞭解:
1.keepalived
使用vrrp實現高可用,可以理解成是IP層的高可用,虛擬出一個vip來實現高可用的功能。
實際應用時主要是兩兩組合,提供兩個vip,在一臺掛掉後可以自動轉移至另一臺服務。
比較常見的問題是腦裂問題和ip轉移後的arp問題,第一種問題可以通過tcpdump快速定位rc(要抓vrrp協議),第二種情況可以使用arping的指令碼解決(keepalived 的notify_master設定)。
基本上沒有效能上的問題。
2.lvs
線上用的比較多的一種負載均衡器,核心態轉發型的高可用工具,可以看做是tcp層的負載均衡器,主要原理就是對tcp的報文做些更改,然後進行轉發,支援的狀態檢測方法也比較完善,有埠檢測,url檢測和自定義指令碼檢測。
實際應用中一般是用lvs的dr模式,配合keepalived使用,keepalived提供主機的高可用,lvs提供應用的高可用,lvs採用url的檢測方式(避免埠ok但是應用掛起的情況,比如java應用的gc)。
比較常見的問題是realserver被踢出的問題,可以通過在lvs部署監控並根據檢測方法部署相關的檢測指令碼(網路檢測,埠檢測,url檢測)來找到問題的rc。
很少能遇到效能的問題,在包量很大的情況下(幾十萬/s),可能會遇到網路卡ring buffer和網路卡中斷的問題,可以通過丟包率和mpstat來定位,ring buffer問題可以嘗試增加網路卡的ring buffer設定解決,中斷問題可以採用centos5.8以上的核心配合多佇列(必須)來解決。
3.nginx
現在主流的反向代理軟體,可以通過代理的功能實現負載均衡的功能,本身功能比較完善,既可以做靜態站點,快取又可以做負載均衡器,配置上可以優化的地方很多,有埠檢測和url的檢測,但是檢測的方式是被動式的,會對使用者的訪問造成一定的影響。
以java類應用來說,常見的使用方式是lvs+nginx+tomcat/resin,比較完善的日誌,可以通過分析nginx日誌的狀態碼,響應時間(response time)和後端響應時間(upstream time)來跟蹤qos,定位問題。
效能上問題不大,比較常見的問題是buffer導致的io問題和日誌本地切割導致的nginx慢速響應的問題
第一個問題可以嘗試記憶體換io或者乾脆關掉buffer試試,第二個問題可以把日誌通過網路寫入遠端處理(不過貌似目前nginx不支援)。
4.tengine
nginx的變種,在url check上做了改進,支援主動的檢查,減少了對使用者的影響,同時可以支援多種方式的日誌處理(通過網路寫入遠端處理等),還支援各種自定義的外掛,靈活性比較高。在webcdn的結構設計中我就是用了lvs+tengine+squid/trafficserver的結構。
5.squid/trafficserver/varnish
反向代理軟體,個人覺得還是做快取會比較有優勢。沒有用來做過負載均衡器,這裡就不妄加評論了。。
6.haproxy
個人感覺和nginx差不多,比nginx要輕量級。
一般都是lvs + haproxy來做高可用,比如淘寶的cdn結構就是lvs+haproxy+trafficserver
這個個人用的也比較少。。
7.f5裝置類
高大上的裝置,沒接觸過,不過有介面一切都好說。
一句話:用好一個軟體比用一個好軟體更重要。