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

Механизм хранения WiredTiger сообщает о большом количестве откатов в MongoDB

У нас есть набор репликации MongoDB, состоящий из трех членов:

        "members" : [
                {
                        "_id" : 6,
                        "host" : "10.0.0.17:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 2,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 7,
                        "host" : "10.0.0.18:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 2,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 8,
                        "host" : "10.0.0.19:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 2,
                        "tags" : {
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],

Кластер находится под умеренной нагрузкой, не более нескольких десятков запросов в секунду. db.serverStatus() на первичном отчете, что почти все транзакции откатываются:

"transaction begins" : 2625009877,
"transaction checkpoint currently running" : 0,
"transaction checkpoint generation" : 22618,
"transaction checkpoint max time (msecs)" : 5849,
"transaction checkpoint min time (msecs)" : 153,
"transaction checkpoint most recent time (msecs)" : 1869,
"transaction checkpoint scrub dirty target" : 0,
"transaction checkpoint scrub time (msecs)" : 0,
"transaction checkpoint total time (msecs)" : 11017082,
"transaction checkpoints" : 22617,
"transaction checkpoints skipped because database was clean" : 0,
"transaction failures due to cache overflow" : 0,
"transaction fsync calls for checkpoint after allocating the transaction ID" : 22617,
"transaction fsync duration for checkpoint after allocating the transaction ID (usecs)" : 354402,
"transaction range of IDs currently pinned" : 0,
"transaction range of IDs currently pinned by a checkpoint" : 0,
"transaction range of IDs currently pinned by named snapshots" : 0,
"transaction range of timestamps currently pinned" : 8589934583,
"transaction range of timestamps pinned by the oldest timestamp" : 8589934583,
"transaction sync calls" : 0,
"transactions committed" : 30213144,
"transactions rolled back" : 2594972913,
"update conflicts" : 578

В основном, мои вопросы: что здесь происходит? Нормально ли иметь столько транзакций и столько откатов? Если нет, то какова основная причина и что нужно исправить?

Upd.: Мы перешли на 3.6.8-2.0 (это был последний пакет Percona из серии 3.6), и проблема не исчезла.

Многие показатели в db.serverStatus().wiredTiger могут сбивать с толку, поскольку они отражают базовые метрики и терминологию механизма хранения WiredTiger, а не API MongoDB. Такие термины, как сделки, сессии, и откаты имеют другой контекст для внутреннего устройства хранения, чем функции MongoDB для конечного пользователя. Некоторые из представленных метрик не очень полезны для мониторинга конечных пользователей, но они могут предоставить диагностическую информацию для разработчиков, знакомых с базовым API хранилища.

Что здесь происходит?

Механизм хранения WiredTiger использует Многоверсионный контроль параллелизма (MVCC) для обеспечения одновременного доступа к внутренним потокам, которые читают и записывают данные. Сервер MongoDB имеет уровень интеграции, который реализует команды, предоставляемые через API-интерфейс MongoDB (используемый драйверами) с использованием базового API-интерфейса механизма хранения.

В WiredTiger API есть внутренние сеансы и транзакции чтобы внутренние потоки могли работать с согласованным моментальным снимком данных. Внутренняя транзакция может завершиться фиксацией (данные были записаны) или откатом (транзакция была прервана намеренно или из-за ошибки).

Нормально ли иметь столько транзакций и столько откатов?

Да это нормально. Запросы только для чтения через уровень интеграции MongoDB используют API транзакций WiredTiger для согласованного чтения, но поскольку у них нет данных для фиксации, транзакции намеренно прерываются и добавляются к метрике «откат транзакций».

Метрика «отката транзакций» также может быть увеличена для других случаев использования, таких как конфликты записи (одновременные внутренние обновления одного и того же документа, которые будут прозрачно повторяться).

Если нет, какова основная причина и как ее исправить?

Этот показатель не должен быть предметом особого внимания или мониторинга.