MySQL replica — алерт когда SQL_Thread зависла
MySQL replica перестала применять binlog (Slave_SQL_Running=No после ошибки query) — но мониторишь только heartbeat, lag не растёт линейно потому что просто стоп.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/mysql-repl
# */1 * * * * root /opt/mysql-repl-check.sh
USER=${MYSQL_USER:-monitor}
PWD=${MYSQL_PWD:-changeme}
HOST=${MYSQL_HOST:-127.0.0.1}
# 8.0.22+ uses REPLICA, older uses SLAVE — try both
OUT=$(mysql -u"$USER" -p"$PWD" -h"$HOST" -e 'SHOW REPLICA STATUS\G' 2>&1)
[ -z "$OUT" ] && OUT=$(mysql -u"$USER" -p"$PWD" -h"$HOST" -e 'SHOW SLAVE STATUS\G' 2>&1)
IO_OK=$(echo "$OUT" | awk -F: '/Slave_IO_Running:|Replica_IO_Running:/ {gsub(/ /,"",$2); print $2}')
SQL_OK=$(echo "$OUT" | awk -F: '/Slave_SQL_Running:|Replica_SQL_Running:/{gsub(/ /,"",$2); print $2}')
LAG=$(echo "$OUT" | awk -F: '/Seconds_Behind_Master:|Seconds_Behind_Source:/{gsub(/ /,"",$2); print $2}')
ERR=$(echo "$OUT" | awk -F: '/Last_SQL_Error:|Last_Error:/{sub(/^[^:]*:/, ""); print; exit}')
if [ "$IO_OK" != "Yes" ] || [ "$SQL_OK" != "Yes" ]; then
curl -fsS "$HEARTBEAT_URL" --data-urlencode "err=IO=$IO_OK,SQL=$SQL_OK,lag=$LAG,reason=$ERR"
exit 2
fi
echo "OK (lag=${LAG}s)"
То же самое в Enterno.io
Замените cron + curl на Enterno heartbeat — получите retention-историю репликации (когда зависало последний раз) и алерт сразу в Telegram + email + Slack без поднятия Alertmanager.
Похожие рецепты
long_query_time = 1, slow_query_log включён. Нужно понимать, когда количество медленных запросов в минуту резко вырастает (deploy сломал индекс, ORM начал N+1).
Secondary в replica set отстаёт от primary, через минуту приложение начнёт читать stale-данные. Нужен HTTP-эндпойнт со словом "ok" / "lag".
Нужно ловить момент, когда реплика начала отставать от мастера больше чем на 10 секунд.