×

LVS+Nginx负载均衡

96
bobozaker
2017.05.23 23:05* 字数 738

前景

由于公司资金有限,用不了硬件负载(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故障自动剔除。

总结

这种灵活的架构带来好处就是适应复杂的生产环境,弊端就是牺牲了太多的负载性能。
后续会带来更详细的配置说明。

znz
Web note ad 1