hadr启用备库只读功能后,备机可以承担查询请求,但是到遇到日志重放时,旧连接被终止、新连接被阻挡。影响查询业务的连续性。有哪些手段可以避免这种现象?
有个设想:通过设置较大的日志假脱机容量空间是否有效(即HADR_SPOOL_LIMIT)?
谢谢!
hadr备库只读功能目前存在replay only window的情况,即对某些主库上的操作,如DDL,reorg,runstats等,备库上的连接会被中断,当退出replay only window后,备库才允许新的数据库连接。可以考虑在replay only window期间临时将只读数据库连接切换到主库上。可以通过db2dsdriver.cfg客户端配置来实现:
<configuration>
<dsncollection>
<dsn alias="SAMPLE" name="SAMPLE" host="172.16.15.56" port="50000">
<parameter name="Authentication" value="Server"/>
</dsn>
</dsncollection>
<databases>
<database name="SAMPLE" host="172.16.15.56" port="50000">
<acr>
<parameter name="enableAcr" value="true"/>
<parameter name="enableSeamlessAcr" value="true"/>
<parameter name="enableAlternateServerListFirstConnect" value="false"/>
<parameter name="affinityFailbackInterval" value="60"/>
<parameter name="maxAcrRetries" value="1"/>
<parameter name="acrRetryInterval" value="0"/>
<alternateserverlist>
<server name="server1" hostname="172.16.15.56" port="50000"></server>
<server name="server2" hostname="172.16.15.58" port="50000"></server>
</alternateserverlist>
<affinitylist>
<list name="list1" serverorder="server1,server2"></list>
</affinitylist>
<clientaffinitydefined>
<client name="client1" hostname="172.16.15.56" listname="list1"></client>
</clientaffinitydefined>
</acr>
</database>
</databases>
<parameters>
<parameter name="CommProtocol" value="TCPIP"/>
</parameters>
</configuration>
该配置中,172.16.15.56是hadr备库,172.16.15.58是hadr主库,正常时只读应用连接到172.16.15.56,当进入replay only window后,只读数据库连接断开报错,尝试连接到172.16.15.58主库。随后,每间隔affinityFailbackInterval秒,只读数据库连接尝试回切到备库172.16.15.56,如果已经退出了replay only window,该尝试会成功,否则只读应用继续在主库上运行。
建议主库上会导致进入replay only window的操作在运维窗口进行,减少对只读应用的影响。