Bootstrap

多活主备选择性DNS解析(一个域名对应多个IP)

多活主备选择性DNS

问题背景

实现多活主备状态下,用户通过域名访问网站,避免用户访问到备站点;

总结一下:

  • 同时存在多个nginx容器活跃,需要用户每次通过域名访问,都能访问到特定的nginx容器;
  • 主备站点角色可能随着主备状态互换,即原来是主站点的,可能后来是备站点;
  • DNS服务器为第三方提供,无法深度定制;
  • 备机需要能够通过ip单独访问;

在这里插入图片描述

知识背景

DNS解析存在多级缓存(此处仅列举到DNS服务器层;后续流程不涉及)

在这里插入图片描述

DNS一对多域名的解析随机性

当一个域名对应多个IP时,DNS解析具有随机性;常用此做服务器的负载均衡;

在这里插入图片描述

DNS 域名解析负载均衡缺点:
  • 目前的DNS是多级解析的,每一级DNS都可能缓存A记录,当某台服务器下线之后,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS任然会将域名解析到已下线的服务器上,最终导致用户访问失败
  1. 不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。

可能方案

为了实现问题,总结下来,只可能有2种解决方案:

  • 在DNS解析层面,控制DNS解析结果
  • 在DNS解析到备机后,提供备机跳转解决方案

方案一、dns解析层面控制DNS解析结果

1.1 通过内置DNS服务器控制IP解析(伪造DNS)

DNS服务器在实际使用场景中,均为客户提供的第三方DNS服务器,无法控制第三方DNS服务器解析的规则;且即使成功控制,由于存在浏览器缓存、本地缓存等多种不可控因素,不可避免还是会存在解析到备机IP,此方案不可行;

1.2、让备机nginx的状态能够影响DNS服务器解析

目前DNS服务器解析不会判断服务器状态。无法通过主备机的状态改变影响DNS服务器解析;
再者。由于存在浏览器缓存、本地缓存等多种不可控因素。不可避免还是会存在解析到备机IP;此方案不可行

2022.5.3更新DNS服务器确实没法获取各个主机的状态,但是,浏览器却可以根据握手情况选择最优的服务器。

验证:新开一个域名对应2个IP地址(ip1,ip1),测试浏览器端访问结果。如果访问到ip1的服务器,则将ip1服务器nginx容器kill掉,亲测浏览器会解析到ip2;

如下图:
在这里插入图片描述
由于客户端先前DNS解析到131,故kill掉131后,刷新浏览器,在与131服务器建链失败后(推测是收到了[RST ACK]头),尝试与80(正常服务器)进行通讯,建立client hello;

故,不能通过nginx状态影响DNS服务器解析,但是可以通过nginx的状态影响浏览器DNS解析.

然而,我们的需求是通过nginx状态影响主备机的解析,无法直接kill掉备机,因为主备机都需要对外提供服务;所以需要进一步研究如何精确的控制nginx返回状态,在不停掉服务的情况下,让浏览器选择我们想让他选择的主机;

这种方案需要进一步验证;

要采用这种方案,思路应该是这样。

1、我需要找到一个控制点,在浏览器通过域名解析到达备机时的这个控制点的时候,能够让浏览器"知道"这个备机不可用,需要换一台服务器试试
2、由于备机要求能够通过ip访问,故我需要做访问控制,

;