向MongoDB副本集添加新节点时的更改流反应

向MongoDB副本集添加新节点时的更改流反应,mongodb,mongodb-.net-driver,replicaset,changestream,Mongodb,Mongodb .net Driver,Replicaset,Changestream,我使用MongoDB 4.0作为3节点副本集。2个数据节点和1个仲裁器。我的应用程序(ASP.NET Core 2.2)使用变更流。考虑这个场景,我的主节点下降,我的副节点变成主节点,我在副本集中替换一个新节点的节点,并开始同步。在这种情况下,我的变更流会发生什么变化 我的第二个问题是,在我的应用程序中,readPreference是secondary,当我的secondary节点发生故障时,我希望MongoDB能够自动从主节点读取数据,但这并没有发生,我的应用程序在读取过程中出现问题。这正常吗

我使用MongoDB 4.0作为3节点副本集。2个数据节点和1个仲裁器。我的应用程序(ASP.NET Core 2.2)使用变更流。考虑这个场景,我的主节点下降,我的副节点变成主节点,我在副本集中替换一个新节点的节点,并开始同步。在这种情况下,我的变更流会发生什么变化


我的第二个问题是,在我的应用程序中,
readPreference
secondary
,当我的secondary节点发生故障时,我希望MongoDB能够自动从
主节点
读取数据,但这并没有发生,我的应用程序在读取过程中出现问题。这正常吗?

Changestreams对副本集选择具有弹性,并将继续运行,就像什么都没有发生一样。从:

更改流光标保持打开状态,直到发生以下情况之一:

  • 光标显式关闭
  • 发生失效事件;例如,删除或重命名集合
  • 与MongoDB部署的连接已关闭
  • 如果部署是分片集群,则分片移除可能会导致打开的更改流光标关闭,并且关闭的更改流光标可能无法完全恢复
所有其他事件(如副本集选择)都不会影响changestream


对于第二个问题,这是意料之中的,因为您的阅读首选项是明确的
secondary
。如果辅助设备不可用,要从主设备读取,请使用该设置。

谢谢您的帮助。但是我遇到了一个问题,当我添加一个新节点时,在将新节点与主节点同步的过程中,当新节点处于
STARTUP2
状态时,我的更改流直到成为
secondary
,才开始工作。更改流将只返回大多数副本集保留的文档。由于您有一个主-辅仲裁器,如果辅仲裁器尚未复制写入,则changestream不会返回它。一旦具有辅助状态,它就可以复制写入,并且changestream可以返回文档。