问题描述

写入数据至云数据库MongoDB副本集实例时,出现"errmsg": "not master", "code": 10107, "codeName": "NotMaster""errmsg": "not master", "code": 10107, "codeName": "NotWritablePrimary"Time out after 30000ms while waiting for a server that matches writableServerSelector.报错。

常见原因

副本集实例发生了主备切换,导致节点角色发生变化,如果您的业务通过主节点(Primary节点)的地址连接,主备切换后实际连接的节点角色变成了从节点(Secondary节点),所以写入失败。
说明 导致实例发生主备切换的原因有很多种,具体请参见为什么实例会发生主备切换?

每个副本集实例包含一个主节点、一个或多个从节点、一个隐藏节点(Hidden节点)和可选的一个或多个只读节点(ReadOnly节点)。其中主节点、从节点和隐藏节点合起来统称为“主备节点”。每个节点有自己的属性信息,包括节点角色(Primary、Secondary、HiddenReadOnly)、节点ID、节点地址、域名信息和端口等。主备切换会导致节点角色发生变化,而不会改变节点的其他属性。

副本集实例中节点1的角色是主节点,节点2的角色是从节点,如果主备切换前您连接的是主节点地址,即节点1的地址,实例发生主备切换后,节点1变成了从节点,您实际连接的是从节点地址,所以写入失败。

解决方案

  • 手动切换实例的节点角色,将业务实际连接的单节点地址对应节点切换为主节点。如何切换节点角色,请参见切换节点角色
  • 推荐生产环境的应用程序通过ConnectionStringURI地址连接数据库。当某个节点出现故障时,不会因为主备切换而影响应用的读写操作,更多信息,请参见副本集实例连接说明
  • 请为业务设计重连机制和异常处理能力,连接闪断后可自动重连,保障业务稳定运行。