【转载请注明出处】:https://blog.youkuaiyun.com/huahao1989/article/details/106131743
动态Nginx负载均衡的配置,可以通过Consul+Consul-Template方式,但是这种方案有个缺点:每次发现配置变更都需要reload Nginx,而reload是有一定损耗的。而且,如果你需要长连接支持的话,那么当reload时Nginx长连接所在worker进程会进行优雅退出,并当该worker进程上的所有连接都释放时,进程才真正退出(表现为worker进程处于worker process is shutting down)。因此,如果能做到不reload就能动态更改upstream,那么就完美了。
目前的开源解决方法有3种:
1、Tengine的Dyups模块
2、微博的Upsync模块+Consul
3、使用OpenResty的balancer_by_lua。
这里使用的是Consul+OpenResty 来实现动态负载均衡。Consul的安装这里将不再介绍。
OpenResty简介
OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
Lua简介
Lua是一个简洁、轻量、可扩展的程序设计语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
如何做到动态呢?
正常使用Nginx作为API网关, 需要如下配置, 当加后端实例时, reload一下Nginx, 使其生效
upstream backend {
server 192.168.0.1;
server 192.168.0.2;
}
那么只要让upstream变成动态可编程就OK了, 当新增后端实例时, 无需reload, 自动生效。
在OpenResty通过长轮训和版本号及时获取Consul的kv store变化。Consul提供了time_wait和修改版本号概念,如果Consul发现该kv没有变化就会hang住这个请求5分钟,在这5分钟内如果有任何变化都会及时返回结果。通过比较版本号我们就知道是超时了还是kv的确被修改了。