是否可以使用mgo驱动程序运行mongo replicaset命令?

时间:2017-05-26 07:36:05

标签: mongodb go mgo

是否可以使用golang应用程序中的mgo驱动程序运行rs.initiate()rs.add()等副本集命令?

如果是,怎么??

2 个答案:

答案 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)
}

请注意以下事项:

    连接字符串中的
  1. ?connect=direct

    如果未指定,连接将超时,可能是因为副本集尚未初始化。

  2. session.SetMode(mgo.Monotonic, true)

    会话模式应该是monotonic,因为mgo使用的默认会话是primary,它执行主要的所有操作。由于副本集尚未初始化,因此不会是主副本,操作(在这种情况下,replSetInitiate)将暂停

  3. 配置

    中的
  4. "_id": "my_replica_set"

    要使其正常工作,必须使用副本集名称my_replica_set启动mongo服务器。一种方法是:

    mongod --replSet my_replica_set
    
  5. 根据Mgo docs,对“admin”数据库
  6. 上的命令使用session.Run()