Ключи сессий, которые не истекали
Redis забился блобами laravel_session. Horizon терял reserved job из-за allkeys-lru.
Во вторник, когда трафик был тихий, Horizon начал терять reserved job. INFO Redis писал used_memory_human 1.9G, maxmemory 2G, evicted_keys рос. SCAN по laravel_session:* вернул 1.79 миллиона ключей. expires на всю db был 12. Ключи очереди лежали рядом с блобами сессий под allkeys-lru. Lock листинга и reserved job уходили вместе.
SESSION_DRIVER был redis, потому что cookie-авторизация Sanctum держит сессию на хосте API. Анонимные запросы в каталог всё равно создавали сессию. Lifetime cookie в конфиге 120 минут. У ключа в Redis TTL не было. Краулер, который не вернулся, оставлял хеш навсегда.
Проблема была в ключах сессий без EXPIRE рядом с Horizon под LRU. Тихий трафик всё равно забил Redis. Job исчезали. Нужен TTL на записи, без сессии на публичных маршрутах каталога и noeviction, чтобы полный Redis ошибался, а не ронял reserved job.
Для чего здесь Redis
Очередь, lock, множество грязных id и сессии вошедших. HTML остаётся в Memcached. Анонимные запросы не поднимают StartSession на публичных маршрутах каталога. Ключ сессии на записи получает EXPIRE 7200. maxmemory-policy это noeviction. Если Redis полон, веб-воркер получает ошибку. Reserved job не исчезает.
- auth_token остаётся httpOnly на cookie. Redis хранит id сессии, не токен в JSON.
- FLUSHDB это не фикс. Следующий краулер заполнит те же ключи без TTL.
- Префикс Horizon и префикс сессий на одном инстансе. Префикс от LRU не спасает.
used_memory сел до размера очереди плюс несколько тысяч живых сессий. Упавшие job с пустым payload перестали появляться. Интересное число в первый раз в INFO было expires, не used_memory.
Какой опыт из этого
INFO expires теперь первое число, которое читаю. used_memory без TTL это бомба рядом с Horizon.
allkeys-lru считает reserved job таким же, как блоб сессии. noeviction делает полноту ошибкой веба, которую видно, а не тихой потерей job.
Анонимным хитам каталога сессия не нужна. У Sanctum она есть после логина. Это разделение дешевле 1.79 миллиона хешей.
