前景
由于公司資金有限,用不了硬件負載(NetScaler、F5、Radware和Array)所以最近看了一些軟負載的方案,最后覺得keepalived+lvs_dr+nginx(其中nginx也可以用tengine來代替,有強大的阿里開源項目提供較好的中文文檔)比較符合公司的場景。本來考慮過haproxy配合lvs或者lvs_fullnat模式但是由于不夠靈活或者復雜只好暫時放棄,后面有機會再慢慢實踐。
用 keepalived+lvs的原因
- 抗負載能力強,因為lvs工作方式的邏輯是非常之簡單,而且工作在網絡4層僅做請求分發之用,沒有流量
- 工作穩定
- 還有一個重要原因是keepalived的配置文件可以用include分離很簡潔明了、易于擴展。
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface $DEVICE
virtual_router_id $ROUTEID
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
$VIP
}
}
include /etc/keepalived/conf.d/*.conf
#可以用腳本來批量生成不同服務的配置文件比如web.conf mysql.conf 這樣有助于管理
- keepalived還有一個好處就是可以像nginx那樣修改配置文件后平滑啟動
#/etc/init.d/keepalived reload
- 這次和nginx配合主要采用lvs_dr模式用來分流,nginx用來負載
Nginx的負載
- nginx工作在7層上,對網絡依賴較小,理論上只要ping得通,網頁訪問正常,nginx就能連得通,nginx同時還能區分內外網
- 配置文件也可以分離,可以動態添加負載的服務
- nginx安裝和配置比較簡單,測試起來也很方便
- 平滑啟動reload
- nginx也同樣能承受很高負載且穩定
- 最重要的是nginx可以負載簡單的tcp負載(可以用nginx_tcp_proxy_module、或者nginx從1.9.0后引入模塊ngx_stream_core_module,模塊是沒有編譯的,需要用到編譯需添加--with-stream)
架構圖
原理上的廢話我就少講了,因為好多的博客或者簡書的大神講的非常多非常好。
我來總結一下為什么用這中架構吧,公司的需要負載的東西非常雜,不可能歸類之后在選用不同的方案來負載,所以要選一個靈活擴展性高的架構。lvs來分流、nginx來代理來組成的負載均衡。
整體架構.png
- 這樣依賴負載壓力過大的時候橫向添加nginx負載均衡,避免了lvs-dr,在每臺realserver上綁定vip,只需在nginx服務器上綁定vip即可。
- 負載的服務增加只需在nginx的配置文件中動態添加。
- 后期橫向還可以加入haproxy來做mysql的讀寫分離。
- lvs+keepalived雙機設置為不搶占模式,避免單點故障,當機無縫切換,nginx故障自動剔除。
總結
這種靈活的架構帶來好處就是適應復雜的生產環境,弊端就是犧牲了太多的負載性能。
后續會帶來更詳細的配置說明。