MongoDB replica set — алерт по lag репликации
Secondary в replica set отстаёт от primary, через минуту приложение начнёт читать stale-данные. Нужен HTTP-эндпойнт со словом "ok" / "lag".
Рецепт
#!/usr/bin/env bash
# Wrap as HTTP via fastcgi or python -m http.server.
THRESHOLD_S="${LAG_THRESHOLD_S:-10}"
LAG=$(mongo --quiet --eval '
var s = rs.printSecondaryReplicationInfo();
var st = rs.status();
var lag = 0;
st.members.forEach(function (m) {
if (m.stateStr === "SECONDARY" && m.optimeDate) {
var d = (st.date - m.optimeDate) / 1000;
if (d > lag) lag = d;
}
});
print(Math.round(lag));
' 2>/dev/null)
[ -z "$LAG" ] && { echo "no-data"; exit 1; }
[ "$LAG" -ge "$THRESHOLD_S" ] && echo "lag $LAG" || echo "ok $LAG"
То же самое в Enterno.io
Эндпойнт + HTTP-монитор Enterno с keyword-rule "не содержит ok" даёт алерт ровно когда replica начала отставать. Pioneer+ хранит response-time, что коррелирует с тяжёлыми writes.
Похожие рецепты
Нужно ловить момент, когда реплика начала отставать от мастера больше чем на 10 секунд.
Slave-Redis отстаёт от master — read-after-write возвращает старые данные. Стандартного алерта нет, нужен внешний.
long_query_time = 1, slow_query_log включён. Нужно понимать, когда количество медленных запросов в минуту резко вырастает (deploy сломал индекс, ORM начал N+1).