公司微服务系统都实现了双活环境(A机房和B机房),早期的时候有一次A机房环境异常,需要将流量全部切到B机房,于是将网关A机房环境的F5 disable掉,这样通过网关的调用都会走B环境的F5调用B环境的系统实例,但是切换之后发现还是有少量的请求走到了A环境的F5,且都是Nginx调用过来的
后面监察发现nginx的配置的网关的代理的写法有问题,因为nginx里面有对网关做代理,但是都是nginx启动的时候域名解析一次,也就是说不重启的化,nginx解析的网关域名永远都是一个,所以即使网关disable掉了A环境的F5,还是会有请求过去
这个时候就需要进行动态的域名解析,也就是用resolver,让nginx每隔一段时间重新对网关域名进行解析,这样才能真正实现双活时候的环境切换。
敏感的信息我都用【】代替
原本的写法如下
location ^~/lcloud-xxx-yyy/ [
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP Sremote_addr,
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
prow-pass http://【网关域名】;
}
调整之后的写法
location ^~/lcloud-xxx-yyy/ [
resolver_timeout 9s;
resolver 【dns_ip1】 【dns_ip2】 valid=20s;
set Sapi "【网关域名】";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP Sremote_addr,
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
prow-pass http://Sapi;
}
resolver_timeout 9s;
用于指定dns解析的超时时间。
resolver address ... [valid=time] [ipv6=on|off]; 可以配置多个dns服务,nginx会采用轮询的方式去访问dns服务,nginx会缓存dns对域名解析的结果,缓存的时间由valid
指定,ipv6用于显示开启或者关闭ipv6。