MarkLogic集群间大文档迁移源主机超时,如何调整超时时间?
碰到这种跨集群传大文档的超时问题确实头疼,你已经试过xdmp:set-request-time-limit(600)但没生效,而且超时出在源主机,那得从源集群的几个关键配置入手调整,我给你梳理下:
App Server全局超时
你用的xdmp:set-request-time-limit()只能修改当前请求的超时上限,但如果源集群上对应的App Server(比如你用来读取文档的REST API服务、XDBC服务或者自定义App Server)本身的全局请求超时设置比10分钟小,那这个函数的设置会被覆盖。
去源集群的Admin界面,找到对应的App Server,修改Request Timeout参数(单位是秒),直接设为600甚至更大的值。保存后重启App Server生效。跨集群调用的函数级超时
如果你的传输逻辑是通过在目标集群调用源集群的函数(比如用xdmp:invoke、xdmp:eval或者xdmp:http-get)来获取文档,那要在这些调用的选项里明确指定超时:- 用
xdmp:invoke的话,加上timeout选项:xdmp:invoke( "fetch-large-doc.xqy", (), <options xmlns="xdmp:invoke"> <timeout>600</timeout> </options> ) - 用HTTP调用源集群REST API的话,在
xdmp:http-get的选项里设置:xdmp:http-get( "http://source-cluster-host:8000/v1/documents?uri=/path/to/large/doc", <options xmlns="xdmp:http"> <timeout>600</timeout> </options> )
这个设置会针对单次跨集群请求生效,避免源主机那边的请求提前超时。
- 用
任务服务器超时(如果用异步传输)
要是你是通过任务服务器来异步执行大文档传输,那源集群的任务服务器也有自己的超时限制。去Admin界面的Groups > [你的组] > Task Servers,修改Task Timeout参数为600秒以上,确保异步任务有足够时间完成。内部集群通信超时
极端情况下,大文档传输可能触发MarkLogic内部集群通信的超时限制。你可以检查源集群的Groups > [你的组] > General里的Inter-Cluster Timeout参数,适当调大这个值(单位是秒),不过这个参数影响范围较广,调整前最好评估集群的整体稳定性。
另外补充下,xdmp:set-request-time-limit()没生效的原因大概率是:你是在目标集群的请求里调用这个函数,但超时发生在源集群的请求上——源集群那边的请求根本没拿到你设置的超时值,所以得把超时设置直接应用在源集群的请求上下文里。
内容的提问来源于stack exchange,提问作者mikel

