连接重试算法(用于 TCP/IP 连接)

对于 TCP/IP 连接,如果客户端运行的是 Microsoft Windows XP 或更高版本,则当两个伙伴名称都在缓存中时,数据访问接口遵循连接重试算法。不论是初次与会话建立连接,还是在中断已建立连接后重新连接,这都适用。打开连接之后,还需要一些时间完成预登录和登录的步骤。

注意注意

打开连接所用的时间可能会超过重试时间,这是由于下列外部因素所致:DNS 查找速度缓慢、域控制器/Kerberos 密钥发行中心 (KDC) 速度缓慢、联系 SQL Server Browser 需要时间、网络阻塞等。此类外部因素可能会阻止客户端连接到镜像数据库。此外,外部因素还可能会导致打开连接所用的时间长于分配的重试时间。有关跳过 DNS 和 SQL Server Browser 以尝试连接到初始伙伴的信息,请参阅建立到数据库镜像会话的初始连接

如果连接尝试失败或者重试时间过期而未成功重试,则数据访问接口将尝试使用另一个伙伴。如果此时未打开连接,则数据访问接口还会尝试使用初始伙伴名称和故障转移伙伴名称,直到连接打开或登录期限超时。默认的登录超时期限为 15 秒。建议登录超时期限至少为 5 秒。如果指定较短的超时期限,则可能导致连接尝试失败。

重试时间为登录期限的某个百分比数。在后续的每轮中,连接尝试的重试时间会逐渐变大。在第一轮中,两次尝试的每次重试时间都是总登录时间的 8%。在后续的每轮中,重试算法会按相同的百分比增加最大重试时间。因此,前八次连接尝试的重试时间如下:

8%, 8%, 16%, 16%, 24%, 24%, 32%, 32%

重试时间使用以下公式进行计算:

RetryTime**=PreviousRetryTime+(** 0.08 *LoginTimeout)

其中,PreviousRetryTime 初始值为 0。

例如,如果使用默认的登录超时期限 15 秒,则 LoginTimeout = 15。在这种情况下,前三轮中分配的重试时间如下:

轮次

RetryTime 计算

每次尝试的重试时间

1

0 +(0.08 * 15)

1.2 秒

2

1.2 +(0.08 * 15)

2.4 秒

3

2.4 +(0.08 * 15)

3.6 秒

4

3.6 +(0.08 * 15)

4.8 秒

下图说明了这些后续连接尝试的重试时间,每个重试时间均超时。

15 秒登录超时的最长重试延迟时间

对于默认的登录超时期限,分配给前三轮连接尝试的最长时间为 14.4 秒。如果每次尝试都使用了它的全部分配时间,则在登录期限超时之前仅剩下 0.6 秒的时间。在这种情况下,第四轮的时间会缩短,仅允许使用初始伙伴名称进行最后的快速连接尝试。但是,连接尝试可能会在其分配的重试时间内失败,尤其是在稍后的轮次中。例如,接收网络错误可能会导致在重试时间到期之前尝试便已结束。如果较早的尝试因网络错误而失败,则可以为第四轮(还可能包括更多轮)提供更多的时间。

尝试失败的另一个原因是服务器实例处于不活动状态,如同服务器实例执行数据库故障转移时发生的情况。在这种情况下,可以利用重试延迟时间来防止客户端因快速进行后续连接尝试而导致伙伴重载。

注意注意

当两个伙伴名称均可用时,如果登录超时期限无限大,则客户端会交替使用初始伙伴名称和故障转移伙伴名称,无限期地尝试重新连接到服务器。

故障转移期间的重试延迟时间

如果客户端尝试连接到进行故障转移的伙伴,则此伙伴会立即做出响应表明它处于不活动状态。在这种情况下,每轮连接尝试都会比分配的重试时间更短暂。也就是说,在登录期限超时之前会发生多轮连接尝试。为了避免在故障转移期间因一系列快速的连接尝试而导致伙伴重载,数据访问接口在每次重试循环之后增加了短暂的重试延迟时间。给定重试延迟时间的长度由重试延迟时间算法确定。在第一轮之后,延迟时间为 100 毫秒。在接下来三轮的每轮之后,重试延迟时间加倍,分别达到 200、400 和 800。对于所有的稍后轮次,重试延迟时间为 1 秒,直到连接尝试成功或超时。

注意注意

如果服务器实例停止,则连接请求会立即失败。

下图说明了在手动故障转移(其中伙伴会切换其角色)期间重试延迟时间如何影响连接尝试。登录超时期限为 15 秒。

重试延迟时间算法