问题标签 [replicaset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mongodb - MongoDB ReplicaSet - 当只剩下 PRIMARY 时,PRIMARY 角色下降到 SECONDARY
我正在研究使用 MongoDB ReplicaSet 来实现高可用性。
但是刚刚发现在具有 3 个节点的 ReplicaSet 中,如果 PRIMARY mongod 是唯一剩下的一个(即其他 2 个mongod
实例死亡或被关闭),那么几秒钟后它将角色切换到 SECONDARY 并且不再接受写入。这使得副本集的价值低于单个实例。
我知道并了解 PRIMARY 选举,但 PRIMARY 角色固定在服务器上(通过使用priority
设置为,例如,10)并且(例如由于网络问题)其他服务器无法访问,为什么主服务器就放弃了?!
在 Windows (mongodb-win32-x86_64-2008plus-2.4.8) 和 Linux (CentOS) 上使用 2.4.8 和 Linux 上的 2.0.x 进行测试
赏金开始:
如果当 PRIMARY 感到孤单时副本集放弃了,有什么替代方法可以确保 100% 可用性?或者,该案例可能需要特殊配置。当前的实现使 ReplicaSet 在出现网络问题时变得脆弱。
更新:
唉,我之前没有说过 #3 发生故障(留下主要和次要),然后过了一段时间,次要发生故障。然后 PRIMARY 真的只是“放弃”,因为已经知道 #3 在一段时间内不可用。这实际上是在我的测试环境中测试的。
我们最初想把 SECONDARY 和 #3(也就是 ARBITER)放在同一个服务器上,但是因为标题的问题,我们不能使用这样的配置。
感谢 Alan Spencer 首先解释了 MongoDB 采用的逻辑。
mongodb - MongoDB:只有一个辅助节点在复制中落后?
我有一个 Mongo 副本集正在运行。这是配置:
- sj01-A(初级)
- sj01-B(二级)
- dal05-A(二级)
- dal05-B(二级)
- 仲裁者
几个月来,它一直在平稳地嗡嗡作响。没有真正的问题。昨晚深夜,我们的监控通知我,其中一个辅助服务器在复制方面落后了。目前大约落后一个小时,并且不断落后(以缓慢的速度)。其他辅助节点都没有这个问题——它们跟上主节点没有问题。
我在任何这些机器上的日志中都找不到任何东西来表明可能是什么原因。我过去有过复制滞后的经验,但它总是影响到每一个二级服务器,而不仅仅是一个二级服务器。这感觉像是硬件问题,但这些是物理机器(没有虚拟化),我们的供应商运行检查似乎表明没有问题。
如果他们有帮助,请提供更多信息:
- 滞后的二级服务器现在的负载大约是其他二级服务器的一半。大约一半的磁盘 IO 和网络,以及更少的内存使用。
- 我们不会以任何方式使用上限集合。
- 所有机器都具有相同的硬件配置(仲裁器除外)。
我很感激给予的任何指导。谢谢!
mongodb - 将副本集添加到已经运行的 mongo 分片集群
大家好,我已经使用 thsi 配置建立了一个 mongo 集群
- 我有 3 台运行 mongos 的不同机器(都是具有不同 IP 的物理机器,以确保稳定性/性能/可用性)。
- 3 个不同的虚拟机上的 3 个配置服务器。
- 两个 Mongo 分片在高端机器上运行(两个 mongod 实例在两个端口上运行,两个 mongod 都有单独的 db 目录)。
这套装置已经到位并且已经在运行。
我想将副本集添加到这两个分片现在意味着每个分片将有两个副本。我的问题是
- 当每个分片已经存在时,如何将副本集添加到现有集群
- 每个 Replica 将携带与其对应的 shard 相同的 db 空间,其中包含近 2 TB 的数据?
- 我应该使用不同的机器来托管这些副本以确保故障转移吗?
python - MongoReplicaSetClient 在主重选期间意外失败
我正在将引用 mongo 资源的代码库迁移到使用复制,并且我看到 MongoReplicaSetClient 的一些意外行为。除非我在选举新的主节点期间尝试写入,否则客户端工作正常。
我正在运行的简单测试是:
* 启动一个 3 节点副本集
* 连接 MongoReplicaSetClient('localhost:27017,localhost:27018,localhost:27017', replicaSet='rs0'
* 执行写入
* 杀死主要和立即执行一次写入
* 主选举完成后执行另一次写入
上述所有步骤都可以正常工作,除了倒数第二个主要是关闭的。根据MongoReplicaSetClient文档,我希望在不存在主节点的情况下执行的所有写入尝试都会引发AutoReconnect错误。然而,我看到的是一个通用的 AssertionError。
有谁知道这是否是预期的行为?我想正确处理此类事件,甚至阻止所有写入,直到选举完成。
mongodb - MongoReplicationSetClient 在 pymongo 2.6.3 中返回一个空集
我在尝试连接到远程副本集时遇到了 MongoReplicaClient 的问题。出于某种原因,MongoReplicaSetClient 只是为不在我的本地主机上的任何副本集返回一个空集。奇怪的是 MongoClient 工作正常。我不确定如何进一步调试它,因为它无论如何都不会出错。由于通过 MongoClient 连接工作正常,因此似乎排除了联网。有谁知道为什么会发生这种情况?
[更新]
经过进一步调查,当本地主机在不使用其 FQDN 的情况下无法解析远程主机名时,此问题似乎会影响 Pymongo 2.6.3。问题是,如果在这种情况下将 FQDN 提供给 MongoReplicaSetClient,它只会返回一个空集。以下是我重现该问题的方式:
环境
程序
1)确认远程主机名无法解析
在 pymongo 2.5 上测试
1)使用主机名连接到副本集(按预期中断)
2)使用FQDN(Works)连接到副本集
在 pymongo 2.6.3 上测试
1)使用主机名连接到副本集(按预期中断)
2)使用FQDN连接到副本集(返回一个空集)
确认
您可以看到,一旦 localhost 可以通过主机名解决问题,该问题在 2.6.3 中将不再出现。就好像 MongoReplicaSetClient 不知道如何处理 FQDN。
1) 确认远程主机名解析
2) 使用主机名和 FQDN 确认 MongoReplicaSetClient 连接
mongodb - 有什么方法可以检查 pymongo 中不可用的主/主
在我的应用程序中,当主机由于某种原因不可用时(例如 DC 之间的连接断开),我试图优雅地处理情况。在这种情况下,应该在前端禁用写入操作,并且应该将缓存数据库用于某些读取操作。
我曾尝试使用rs.status()
命令。它在mongo
shell 中工作,但pymongo
在 master 不可用时不起作用,因为replSetGetStatus
command 不在 list 中rp.secondary_ok_commands
。结果我遇到了异常:
AutoReconnect:没有可用于使用 ReadPreference PRIMARY 查询的副本集主。
当然我可以处理这个异常,但它是在超时后生成的(在我的例子中是 10 秒)。但就我而言,它太长了。我更喜欢立即响应,如果有时它会不正确,这对我来说是可以的。
mongodb - 如何使用 mongoengine 连接 mongodb 副本集?
我正在尝试使用 MongoEngine 连接到 MongoDB 副本集?我想连接到任何可用的辅助服务器。
我只能找到 pyMongo 的例子。有什么帮助吗?
node.js - mongoose.mongo.MongoClient.connect() 是否可以在没有 mongo shell 的情况下工作?
我正在连接到不是本地主机的 mongo 服务器。我正在使用猫鼬。在某些时候,我需要连接 mongo 本机驱动程序,所以我这样做:
但conn
对象是null
。
最近我改变了服务器结构,现在所有的 mongo 数据库都是远程的,在我的新节点机器上我根本没有安装 mongo shell ......首先一切工作正常,连接 uri 是:
主要在哪里x.x.x.x:27017
,由于初始主要中断一段时间后,新的主要已被选举,现在我从相同的 uri 开始,但连接对象是null
,我不知道为什么......
有没有人有类似的问题?或者可能是解决方案或想法....
mongodb - 将独立集转换为副本集的困难
我想将 MongoDB River 用于 ElasticSearch,但为此我需要将我的独立集转换为副本集。
我按照官方文档进行操作,但是在执行第 2 步时遇到此消息:
一些参考资料说我需要运行rs.initiate()
,但是当 Mongo 服务器关闭时我怎么能这样做呢?
mongodb - MongoDB replicaSet secondary machine continues to query primary every minute
I have setup a mongo replicaSet on three different machines. When I run rs.status(), I receive the following:
Everything seems to be running fine and all machines are up to date. Yet, when I view the oplog, the same query from one of the secondary machines is occurring every minute. Here is one sample of those queries:
Each query is exactly the same including the timestamp (secs_running has a period of 60). This query is only coming from client "xxx.xxx.xx.157". Due to the multiple occurrences of this query, mongo is really bogging down the machine.
Some other potential useful info:
Appreciate any help or clues of where to look. Thanks!