MongoDB — алерт когда oplog window сжимается
Запись в primary растёт быстрее, чем oplog успевает храниться. Если secondary отстанет дольше oplog window — придётся initial sync (часы простоя). Узнаёшь обычно когда уже поздно.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/mongo-oplog
# */15 * * * * mongo /opt/mongo-oplog.sh
URI=${MONGO_URI:-mongodb://localhost:27017}
WARN_HOURS=${WARN_HOURS:-12} # alert when window < 12 h
WINDOW_H=$(mongosh --quiet "$URI" --eval '
const r = db.getSiblingDB("local").oplog.rs.stats();
const cap = r.maxSize;
const used = r.size;
const rate = used / (db.getSiblingDB("local").oplog.rs.find().sort({ts:-1}).limit(1).next().ts.t -
db.getSiblingDB("local").oplog.rs.find().sort({ts:1 }).limit(1).next().ts.t);
print(Math.floor(cap / rate / 3600));
')
if [ "${WINDOW_H:-0}" -lt "$WARN_HOURS" ]; then
curl -fsS "$HEARTBEAT_URL" --data "oplog_window_h=$WINDOW_H,threshold=$WARN_HOURS"
exit 2
fi
echo "OK (window=${WINDOW_H}h)"
То же самое в Enterno.io
Заверните в Enterno heartbeat — отслеживайте тренд window-shrink за неделю и расширяйте oplog заранее, без даунтайма initial sync.
Похожие рецепты
Secondary в replica set отстаёт от primary, через минуту приложение начнёт читать stale-данные. Нужен HTTP-эндпойнт со словом "ok" / "lag".
Нужно ловить момент, когда реплика начала отставать от мастера больше чем на 10 секунд.
Slave-Redis отстаёт от master — read-after-write возвращает старые данные. Стандартного алерта нет, нужен внешний.