我创建了3个节点的副本,其中1个节点是主节点,另外2个节点是辅助节点。我为辅助节点分配的优先级低于主节点。
我希望辅助节点中所做的更改不与主节点同步,但主节点中所做的更改应与辅助节点同步。
我不希望连接是双向的。请找到我在下面执行的rs.status()来实现这种情况,但在次要节点中所做的更改也与主要节点同步。我不希望这些更改反映在主要节点中。
"members" : [
{
"_id" : 0,
"name" : "localhost:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
....
"syncSourceHost" : "",
....
},
{
"_id" : 1,
"name" : "localhost:27020",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
.....
"syncSourceHost" : "localhost:27018",
.....
}
]
其优先级状态配置如下。
"members" : [
{
"_id" : 0,
"host" : "localhost:27018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "localhost:27020",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"secondaryDelaySecs" : NumberLong(0),
"votes" : 1
}
]
此外,我还可以创建两个不同的独立数据库来实现这种情况,但我还希望跟踪这两个数据库中发生的任何更新(这种方法需要大量的手动编码,我不喜欢这样)。或在主数据库中删除我想将此数据库与辅助数据库同步。但是如果在辅助数据库中发生了任何更改,我希望将更新的集合与主数据库中存在的集合进行比较。在这种情况下,我不希望同步,但我只想显示两个数据库中现有集合之间的差异。
最后,我想追踪主节点和辅助节点之间的差异。在辅助节点中比主节点新的集合应该显示出来。
1条答案
按热度按时间euoag5mw1#
我已创建了2个节点的复制副本
这是第一个错误。请至少添加一个仲裁器。请阅读为什么成员数不应该是偶数https://www.mongodb.com/docs/manual/replication/
我正在更新辅助中的现有集合
不,你不是。只有主节点接受写操作。请阅读副本集是如何工作的https://www.mongodb.com/docs/manual/replication/。Nodejs Mongodb驱动程序知道数据库拓扑。它保持与副本的所有成员的连接,检查哪个是当前的主节点,并将所有插入、更新和删除操作以独占方式发送到此节点。默认情况下,它也从主节点读取。
也就是说,mongo可以发起主服务器的重选,考虑到副本服务器中只有两个成员,这可能会比必要的情况发生得更频繁,这个过程被称为故障转移。
Nodejs驱动程序足够智能,可以检测客户端拓扑是否不是最新的,并处理意外写入尝试到刚刚从主节点退出的辅助节点的异常。它实现有关新数据库拓扑的信息,并重复写入新主节点的操作。除非群集无法选择新主节点,否则这些错误不会暴露在应用程序级别,例如,当大多数节点关闭时。
针对2nd edition of the question的更新:
最后,我想跟踪主节点和辅助节点之间的差异。
我担心mongo的设计并没有考虑到节点之间的差异,除了自然的复制延迟或intentionally delayed replica members。
故障转移协议旨在确保辅助成员可以随时自动升级为主节点,并在主节点因任何原因不可访问时保持副本集正常运行,同时将数据丢失降至最低。