mongodb 防止辅助节点将对其自己的数据拷贝所做的更改推送到主节点

vsikbqxv  于 2023-01-08  发布在  Go
关注(0)|答案(1)|浏览(76)

我创建了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
            }
    ]

此外,我还可以创建两个不同的独立数据库来实现这种情况,但我还希望跟踪这两个数据库中发生的任何更新(这种方法需要大量的手动编码,我不喜欢这样)。或在主数据库中删除我想将此数据库与辅助数据库同步。但是如果在辅助数据库中发生了任何更改,我希望将更新的集合与主数据库中存在的集合进行比较。在这种情况下,我不希望同步,但我只想显示两个数据库中现有集合之间的差异。
最后,我想追踪主节点和辅助节点之间的差异。在辅助节点中比主节点新的集合应该显示出来。

euoag5mw

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
故障转移协议旨在确保辅助成员可以随时自动升级为主节点,并在主节点因任何原因不可访问时保持副本集正常运行,同时将数据丢失降至最低。

相关问题