我第一次尝试了mongo副本集。
我在ec2上使用ubuntu,启动了三个示例。我使用了每个示例的私有IP地址。我选择了作为主要的,下面是代码。
mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
在这一点上一切都很好。当我访问http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet站点时,我看到我有一个primary、seconday和arbitor。
好了,现在测试一下。
在主数据库中创建一个数据库,代码如下:
use tt
db.tt.save( { a : 123 } )
在辅助服务器上,我这样做并得到以下错误:
db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
我对mongodb和复制非常陌生,但我认为如果我在一个中做了一些事情,它就会转到另一个。那么,如果我在其中添加了一条记录,我需要做些什么才能跨机器复制呢?
9条答案
按热度按时间o8x7eapl1#
你必须设置“secondary okay”模式,让mongo shell知道你允许从secondary读取。这是为了防止您和您的应用程序意外执行最终一致的读取。您可以在shell中使用以下命令执行此操作:
之后,您可以从辅助服务器正常查询。
关于“最终一致性”的说明:在正常情况下,在一秒或更短的时间内,副本集次副本具有与主副本相同的所有数据。在非常高的负载下,您写入主服务器的数据可能需要一段时间才能复制到辅助服务器。这被称为“副本滞后”,并且从滞后的辅助设备阅读被称为“最终一致”读取,因为虽然新写入的数据将在某个点出现(除非网络故障等),但它可能不会立即可用。
**编辑:**从机查询时只需要设置
secondaryOk
,每个session只需要设置一次。des4xlb02#
要避免每次都键入
rs.slaveOk()
,请执行以下操作:创建一个名为
replStart.js
的文件,其中包含一行:rs.slaveOk()
然后在启动Mongo shell时包含
--shell replStart.js
。当然,如果您在本地连接到单个示例,这并不会保存任何输入。3lxsmp7m3#
在mongodb2.0
你应该打字
在次mongod节点中
1dkrff034#
这只是给使用Ruby驱动程序处理此问题的任何人的说明
要在Ruby中设置slaveOk,您只需在创建客户端时将其作为参数传递,如下所示:
https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection
请注意,'args'是第三个可选参数。
6qftjkof5#
我在这里搜索相同的错误,但来自Node.js native driver。我的答案是campeterson和Prabhat的组合。
问题是
readPreference
设置默认为primary
,这会导致令人困惑的slaveOk
错误。我问题是,我只是想从任何节点读取我的副本集。我甚至没有连接到它作为复制集。我只是连接到任何节点来读取它。将
readPreference
设置为primaryPreferred
(或者更好地设置为ReadPreference.PRIMARY_PREFERRED
常量)为我解决了这个问题。只需将其作为一个选项传递给MongoClient.connect()
或client.db()
或任何find()
,aggregate()
或其他函数。ojsjcaue6#
警告:
slaveOk()
已弃用,可能会在下一个主要版本中删除。请使用secondaryOk()
(在mongo shell中)。x6yk4ghg7#
slaveOk不再工作。需要使用readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred
例如
wqsoz72f8#
我只是为DB提供商的一个尴尬情况添加这个答案。
在我们的情况下发生的是主DB和次DB反向移位(主DB到次DB,反之亦然),并且我们得到相同的误差。
所以请检查数据库状态的配置设置,这可能对你有帮助。
o4hqfura9#
将readPreference添加为PRIMARY