我有一个由三个成员组成的副本集。我是否可能只想从两个辅助节点之一读取数据?我使用以下代码,其中 ip 是辅助节点之一,但我仍然看到流量被部署到其他节点。
Mongo mongo = new MongoClient("171.21.43.34");
Run Code Online (Sandbox Code Playgroud) 我想打开monga中的复制.所以,当我尝试使用rs.initiate时,我得到以下errorrs.initiate()
{
"ok" : 0,
"errmsg" : "This node was not started with the replSet option",
"code" : 76,
"codeName" : "NoReplicationEnabled"
}
Run Code Online (Sandbox Code Playgroud)
我是新手,所以我不知道如何纠正它.我遵循这些准则 https://blog.jixee.me/how-to-use-mongo-connector-with-elasticsearch/
我偶然发现 MongoDB 官方网站解释了如何设置奇数成员副本。我还从同一站点听说了Arbiter一词,根据我的理解,它不会被选为主要节点,但它确实参与选举(来自https://docs.mongodb.com/manual/core/replica-set ) -仲裁者/)。
在《为什么我们在 MongoDB 复制中需要“仲裁器”?》中还有一篇与仲裁器相关的帖子。这就涉及到 CAP 定理,这使得事情变得更加复杂。
首先,为什么我们需要使成员数量为奇数?另外,有人可以用简单的外行英语向我解释一下这个仲裁者是什么以及它在给定副本集中的作用是什么?
提前致谢。
database-design mongodb database-replication cap-theorem mongodb-replica-set
我想用docker设置一个MongoDB副本集。设置似乎很好,但是我无法使用Java应用程序连接到集群。我正在Windows 10上使用VirtualBox作为驱动程序运行Docker版本17.06.0-ce。
我按照本教程中的说明进行操作:http : //www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/
因此,我首先在docker中创建了my-mongo-cluster网络,并使用以下命令运行3个容器:
$ docker run --name mongo1 -d --net mongo-cluster -p 9042:27017 mongo:3.6.0 mongod --replSet my-mongo-set
$ docker run --name mongo2 -d --net mongo-cluster -p 9142:27017 mongo:3.6.0 mongod --replSet my-mongo-set
$ docker run --name mongo3 -d --net mongo-cluster -p 9242:27017 mongo:3.6.0 mongod --replSet my-mongo-set
Run Code Online (Sandbox Code Playgroud)
然后,我连接到mongo1容器,并使用以下配置设置副本集:
config = {"_id" : "my-mongo-set", "members" : [{"_id" : 0,"host" : "mongo1:27017"},{"_id" : 1,"host" : "mongo2:27017"},{"_id" : 2,"host" : "mongo3:27017"}]}
rs.initiate(config)
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常。从mongo1容器的日志中可以看出,所有容器都是相互连接的。
现在,我正在尝试从Java应用程序连接到副本集。我正在使用3.6.0版的mongodb驱动程序。这是我用来连接到在docker中运行的副本集的代码:
List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
serverAddresses.add(new ServerAddress(InetAddress.getByName("192.168.99.100"), …Run Code Online (Sandbox Code Playgroud) 我有2个mongo实例在2个不同的服务器(一个主服务器和另一个辅助服务器)中运行;我可以使用以下连接代码从主服务器检索文档:
var db = mongojs('user:pswd@localhost:27017/mydb?authSource=admin');
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从辅助服务器检索文档时,出现以下错误:
{[MongoError:不是master和slaveOk = false]
名称:“ MongoError”,
消息:“ not master and slaveOk = false”,
确定:0,
errmsg:“ not master and slaveOk = false”,
代码:13435}
我也尝试使用代码:
var db = mongojs('user:pswd@localhost:27017/mydb?authSource=admin&slaveOk=true');
Run Code Online (Sandbox Code Playgroud)
我想念什么?
设置:
1个主要,3个辅助和1个仲裁(全部5个正在运行.)
当我在primary中执行stepDown()时,在shell中获得以下错误 -
m101:PRIMARY> rs.stepDown()
2017-06-07T15:01:21.357 E QUERY [thread1] Error: error doing query: failed: network error while attempting to run command 'replSetStepDown' on host '127.0.0.1:27018' :
DB.prototype.runCommand@src/mongo/shell/db.js:132:1
DB.prototype.adminCommand@src/mongo/shell/db.js:150:16
rs.stepDown@src/mongo/shell/utils.js:1261:12
@(shell):1:1
2017-06-07T15:01:21.360 I NETWORK [thread1] trying reconnect to 127.0.0.1:27018 (127.0.0.1) failed
2017-06-07T15:01:21.361 I NETWORK [thread1] reconnect 127.0.0.1:27018 (127.0.0.1) ok
m101:SECONDARY>
Run Code Online (Sandbox Code Playgroud)
请注意,主要最终更改为辅助.但为什么我收到这个错误,"失败:网络错误"在这里?
以下是降级的主要日志文件中的部分 -
2017-06-07T15:01:22.170 I REPL [replication-5] Restarting oplog query due to error: InterruptedDueToReplStateChange: operation was interrupted. Last fetched optime (with hash): { ts: Timestamp 1496827872000|1, t: 2 }[-3490433912114125886]. Restarts …Run Code Online (Sandbox Code Playgroud) mongo 完全重装后,还记得之前的副本集配置;它把这个存储在哪里?
我使用我们项目的用户帐户在 linux 服务器上安装了 mongo 到该用户拥有的目录中。我设置了复制并让它工作正常。然后,为了测试一些更精细的安装点,我删除了整个 mongo 目录并重新安装。进入mongo,发现replication已经和之前一样设置好了;所以看起来 mongo 将信息存储在某个地方。
我检查了几个可能持有副本集配置的区域:
systemLog.path),另一个用于存储 ( storage.dbPath),并且都指向已删除的 mongo 目录。有谁知道 mongo 在哪里存储此配置信息?
我在aws上设置了一个看起来像这样的集群
- mycluster
--- shard0
----- node0 : P
----- node1 : S
----- node2 : S
--- shard1
----- node0: P
----- node1: S
----- node2: S
--- shard2
----- node0: P
----- node1: S
----- node2: S
Run Code Online (Sandbox Code Playgroud)
我想通过连接字符串URI连接到它.
我的连接字符串目前看起来像这样:
mongodb://host0:portX,...,host9:portZ/test-database?replicaSet=mycluster
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,当我尝试连接它时,我得到错误无法访问.
但是,我可以很好地连接到单个分片.
mongodb://host0:portX,...,host3:portZ/test-database?replicaSet=shard0
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么阻止我连接到整个群集?
如何配置已删除的副本集成员以形成新的副本集?
我有一个包含 4 个 mongod 实例的副本集
rs.config() 的输出
{
"_id" : "rs0",
"members" : [
{
"_id" : 0,
"host" : "localhost:27031"
},
{
"_id" : 1,
"host" : "localhost:27032"
},
{
"_id" : 2,
"host" : "localhost:27033"
},
{
"_id" : 3,
"host" : "localhost:27034"
}
],
"settings" : {
"replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2")
}
}
Run Code Online (Sandbox Code Playgroud)
我从副本集中删除了 2 个实例
rs.remove("localhost:27033")
rs.remove("localhost:27034")
Run Code Online (Sandbox Code Playgroud)
现在我的要求是用这 2 个删除的成员形成一个新的副本集。最好的方法是什么?
我目前的解决方案
连接到已删除的成员
mongo --port 27033
Run Code Online (Sandbox Code Playgroud)
并执行
conf = {
"_id" : "rs0",
"members" : [ …Run Code Online (Sandbox Code Playgroud) mongodb ×9
replication ×2
cap-theorem ×1
docker ×1
mongodb-java ×1
mongojs ×1
node.js ×1
parse-server ×1