是否可以使用golang应用程序中的mgo驱动程序运行rs.initiate()
和rs.add()
等副本集命令?
如果是,怎么??
答案 0 :(得分:4)
rs.initiate命令的示例:
session, err := mgo.Dial("rs1.example.net")
if err != nil {
panic(err)
}
defer session.Close()
config := bson.M{
"_id": "my_replica_set",
"members": []bson.M{
{"_id": 0, "host": "rs1.example.net:27017"},
{"_id": 1, "host": "rs2.example.net:27017", "priority": 2},
{"_id": 2, "host": "rs3.example.net", "arbiterOnly": true},
},
}
result := bson.M{}
if err := session.DB("admin").Run(bson.M{"replSetInitiate": config}, &result); err != nil {
panic(err)
}
rs.add和任何其他rs。*助手相同。
答案 1 :(得分:3)
感谢@ alex-blex的答案给了我一个开始。但这最终对我有用:
session, err := mgo.Dial("rs1.example.net?connect=direct")
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
config := bson.M{
"_id": "my_replica_set",
"members": []bson.M{
{"_id": 0, "host": "rs1.example.net:27017"},
{"_id": 1, "host": "rs2.example.net:27017", "priority": 2},
{"_id": 2, "host": "rs3.example.net", "arbiterOnly": true},
},
}
result := bson.M{}
if err := session.Run(bson.M{"replSetInitiate": config}, &result); err != nil {
panic(err)
}
请注意以下事项:
?connect=direct
。
如果未指定,连接将超时,可能是因为副本集尚未初始化。
session.SetMode(mgo.Monotonic, true)
会话模式应该是monotonic
,因为mgo使用的默认会话是primary
,它执行主要的所有操作。由于副本集尚未初始化,因此不会是主副本,操作(在这种情况下,replSetInitiate
)将暂停
"_id": "my_replica_set"
要使其正常工作,必须使用副本集名称my_replica_set
启动mongo服务器。一种方法是:
mongod --replSet my_replica_set