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

Is it possible to run mongo replicaset commands using mgo driver?

是否可以使用来自 golang 应用程序的 mgo 驱动程序 运行 复制集命令,如 rs.initiate()rs.add()

如果是,怎么办??

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.* 助手也是如此。

感谢@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. "_id": "my_replica_set" 在配置中

    为此,mongo 服务器必须以副本集名称 my_replica_set 启动。一种方法是:

    mongod --replSet my_replica_set
    
  4. 根据 Mgo docs 对 "admin" 数据库上的命令使用 session.Run()