前景
由于公司资金有限,用不了硬件负载(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来代理来组成的负载均衡。
- 这样依赖负载压力过大的时候横向添加nginx负载均衡,避免了lvs-dr,在每台realserver上绑定vip,只需在nginx服务器上绑定vip即可。
- 负载的服务增加只需在nginx的配置文件中动态添加。
- 后期横向还可以加入haproxy来做mysql的读写分离。
- lvs+keepalived双机设置为不抢占模式,避免单点故障,当机无缝切换,nginx故障自动剔除。
总结
这种灵活的架构带来好处就是适应复杂的生产环境,弊端就是牺牲了太多的负载性能。
后续会带来更详细的配置说明。