Можно ли запускать команды mongo replicaset с помощью драйвера mgo?

Можно ли запускать команды набора реплик, такие как rs.initiate() и rs.add(), с помощью драйвера mgo из приложения golang?

Если да, то как ??


person Nithin    schedule 26.05.2017    source источник
comment
Конечно. Все драйверы построены на основном принципе отправки структуры команд в базу данных. Для mgo это Run() и полный список Команды базы данных перечислены в основной документации.   -  person Neil Lunn    schedule 26.05.2017
comment
@NeilLunn, не могли бы вы дать мне пример того, как запускать команды rs,initiate() и rs.add()?   -  person Nithin    schedule 26.05.2017


Ответы (2)


Благодаря ответу @ 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, используйте session.Run () для команд в " admin "база данных
person Nithin    schedule 03.06.2017

Пример команды 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. * помощники.

person Alex Blex    schedule 26.05.2017