Klienci tracili zawartość koszyka i zostawali wylogowani losowo podczas zakupów. Problem nasilał się w weekendy przy dużym ruchu. Czas naprawy: 2 godziny.
Objawy
- Klienci wylogowywani losowo w trakcie zakupów
- Koszyk resetuje się bez powodu
- Problem częstszy przy dużym ruchu
- Redis
INFO memory:used_memorybliskiemaxmemory
Przyczyna
Redis był skonfigurowany z maxmemory-policy allkeys-lru – przy braku wolnej pamięci usuwał najdawniej używane klucze, w tym aktywne sesje użytkowników.
Rozwiązanie
# Sprawdź aktualną konfigurację Redis redis-cli INFO memory redis-cli CONFIG GET maxmemory redis-cli CONFIG GET maxmemory-policy # Dla sesji Magento ustaw noeviction lub volatile-lru redis-cli CONFIG SET maxmemory-policy volatile-lru # volatile-lru usuwa tylko klucze z TTL (nie sesje bez wygaśnięcia) # lub: noeviction - odmawia zapisu gdy brakuje pamięci (bezpieczniejsze) # Zwiększ pamięć dla Redis redis-cli CONFIG SET maxmemory 2gb # Oddziel cache i sesje na dwa instancje Redis # env.php - osobny Redis dla sesji:
<?php
// app/etc/env.php
'session' => [
'save' => 'redis',
'redis' => [
'host' => '127.0.0.1',
'port' => '6380', // osobna instancja!
'database' => '0',
'max_concurrency' => '6',
'break_after_frontend' => '5',
'disable_locking' => '0',
],
],
'cache' => [
'frontend' => [
'default' => [
'backend' => 'Cm_Cache_Backend_Redis',
'backend_options' => [
'server' => '127.0.0.1',
'port' => '6379', // osobna instancja cache
],
],
],
],
Wnioski
Redis używany jednocześnie do cache i sesji to proszenie się o problemy. Cache może być evicted – sesje nie mogą. Oddziel je na dwie instancje z różnymi politykami eviction: allkeys-lru dla cache, noeviction lub volatile-lru dla sesji.
