nginx 以及haproxy 通过dns服务发现实现负载处理的一些问题
nginx 以及haproxy 都支持基于dns 的服务负载处理,比如nginx 支持基于A记录以及srv的,haproxy 基于service_template 也支持基于A记录以及srv的,但是实际上是有一些缺陷的,以下简单说明下
一些问题
- 灵活性不够好
nginx 的做好是配置valid 时间,太小了,请求多,太大了服务更新慢,haproxy 相对好一些,但是dns 请求会多一些,相对支持的配置参数还是比较少的,可以基于服务发现工具,基于模版模式解决
- 权重处理上有点弱
目前包括nginx 以及haproxy 的都是基于平等策略,问题就比较明显了,比如不同主机配置,一般我们希望负载时不一样的,目前暂时缺少这种能力,可以基于服务发现工具,基于模版模式解决
- 监控不是很灵活
与静态配置不一样,因为那个参数时动态的,监控上看到的数据会有差异,比如haproxy 是自定义的名称,这个对于监控比较费事,当然nginx 实际也存在类似的问题
- dns 动态更新的问题
如果基于dns 的负载处理,核心是dns 数据的准确性,如果有问题(比如配置有问题,造成异常数据进入了系统)当然haproxy 包含了主动健康监测,社区版的nginx 只有被动的,最好的方式是基于服务发现平台(consul,nacos 的等)然后扩展dns 支持(consul 自带,nacos 需要可以基于coredns plugin)
说明
dns 很不错,用好了,用对了价值很大,但是如果使用不当,造成的影响会是灾难级别的(依赖的都会有影响),了解套路,结合业务特点设计方案是比较重要的
参考资料
https://github.com/rongfengliang/nginx_haproxy_dnsmasq_ds_learning
https://www.haproxy.com/blog/dns-service-discovery-haproxy
https://blog.nginx.org/blog/dynamic-dns-resolution-open-sourced-in-nginx
https://github.com/rongfengliang/coredns-nacos
https://github.com/cloud66-oss/coredns_mysql
https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#server-template
https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server