Назад | Перейти на главную страницу

Вторичные серверы MongoDB не догоняют

У меня есть набор реплик, который я пытаюсь обновить до основного с большим объемом памяти и увеличенным дисковым пространством. Поэтому я совершил набег на пару дисков на новом первичном сервере, синхронизировал данные с вторичного и добавил их в набор реплик. Проверив rs.status (), я заметил, что все вторичные серверы отстают примерно на 12 часов от первичного. Поэтому, когда я пытаюсь принудительно установить новый сервер на основное место, это не сработает, потому что он устарел.

Это кажется большой проблемой, потому что в случае отказа основного мы отстаем как минимум на 12 часов, а некоторые почти на 48 часов.

Все оплоги перекрываются, а размер оплогов довольно велик. Единственное, что я могу понять, это то, что я выполняю много операций записи / чтения на первичном сервере, что может держать сервер в блокировке, не позволяя должным образом наверстать упущенное.

Есть ли способ заставить вторичную часть догнать первичную?

В настоящее время существует 5 серверов, последние 2 которых должны заменить 2 других узла. Узел с _id равным 6 должен быть тем, который заменит основной. Узел, наиболее удаленный от основного рабочего времени, отстает чуть более чем на 48 часов.

{
"set" : "gryffindor",
"date" : ISODate("2011-05-12T19:34:57Z"),
"myState" : 2,
"members" : [
    {
        "_id" : 1,
        "name" : "10******:27018",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 20231,
        "optime" : {
            "t" : 1305057514000,
            "i" : 31
        },
        "optimeDate" : ISODate("2011-05-10T19:58:34Z"),
        "lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
    },
    {
        "_id" : 2,
        "name" : "10******:27018",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 20231,
        "optime" : {
            "t" : 1305056009000,
            "i" : 400
        },
        "optimeDate" : ISODate("2011-05-10T19:33:29Z"),
        "lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
    },
    {
        "_id" : 3,
        "name" : "10******:27018",
        "health" : 1,
        "state" : 1,
        "stateStr" : "PRIMARY",
        "uptime" : 20229,
        "optime" : {
            "t" : 1305228858000,
            "i" : 422
        },
        "optimeDate" : ISODate("2011-05-12T19:34:18Z"),
        "lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
    },
    {
        "_id" : 5,
        "name" : "10*******:27018",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 20231,
        "optime" : {
            "t" : 1305058009000,
            "i" : 226
        },
        "optimeDate" : ISODate("2011-05-10T20:06:49Z"),
        "lastHeartbeat" : ISODate("2011-05-12T19:34:56Z")
    },
    {
        "_id" : 6,
        "name" : "10*******:27018",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "optime" : {
            "t" : 1305050495000,
            "i" : 384
        },
        "optimeDate" : ISODate("2011-05-10T18:01:35Z"),
        "self" : true
    }
],
"ok" : 1
}

Просмотрев все, я увидел единственную ошибку, которая вернула меня к mapreduce, который был запущен на первичном сервере, с этой проблемой: https://jira.mongodb.org/browse/SERVER-2861 . Поэтому, когда была предпринята попытка репликации, синхронизация невозможна из-за ошибочной / поврежденной операции в журнале операций.

Чтобы ответить на исходный вопрос (который не решил бы проблему OP), я считаю, что лучший способ заставить вторичный объект «догнать» - это удалить его из набора и снова добавить, но есть вероятность ( как в этом случае), есть и другие проблемы. Проверьте свои журналы.