Скачать CV
Назад к бизнес-кейсам

Redis

Ключи сессий, которые не истекали

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 не исчезает.

Вытеснение HTML и вытеснение job это разные поломки. Политика у них не общая.
Вытеснение HTML и вытеснение 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 миллиона хешей.

Назад к бизнес-кейсам