Jak przyspieszyć obsługę sesji aplikacji Python/MySQL za pomocą Redis na Ubuntu 22.04

Obsługa sesji stanowi fundament działania wielu aplikacji internetowych, umożliwiając przechowywanie informacji o użytkowniku pomiędzy kolejnymi żądaniami. Dzięki temu możliwe jest implementowanie funkcji takich jak uwierzytelnianie, personalizacja treści czy zarządzanie koszykiem zakupowym. Tradycyjne podejście, oparte na zapisywaniu danych sesji w relacyjnej bazie danych, może prowadzić do spowolnienia działania aplikacji, zwłaszcza przy dużym natężeniu ruchu, co negatywnie wpływa na skalowalność.

Redis, jako szybka, operująca w pamięci podręcznej baza danych typu klucz-wartość, staje się idealnym rozwiązaniem do przechowywania danych sesji. Wykorzystanie Redis w tym celu znacząco przyspiesza proces obsługi sesji i zwiększa możliwości skalowania aplikacji.

W poniższym poradniku przedstawimy proces konfiguracji i wykorzystania Redis do przyspieszenia obsługi sesji w aplikacjach Python/MySQL działających na serwerze Ubuntu 22.04.

Instalacja i konfiguracja Redis

Instalacja serwera Redis

1. Uaktualnij listę dostępnych pakietów:


sudo apt update

2. Zainstaluj pakiet redis-server:


sudo apt install redis-server

Konfiguracja Redis

1. Otwórz plik konfiguracyjny Redis /etc/redis/redis.conf za pomocą edytora tekstu:


sudo nano /etc/redis/redis.conf

2. Odszukaj w pliku linię z parametrem protected-mode i zmień jego wartość na no, co pozwoli na dostęp do Redis z innych hostów (niezalecane w środowiskach produkcyjnych bez odpowiedniej konfiguracji firewall):


protected-mode no

3. Zapisz wprowadzone zmiany i zamknij plik konfiguracyjny.

Uruchomienie i włączenie Redis

1. Aktywuj usługę Redis:


sudo systemctl start redis-server

2. Włącz automatyczne uruchamianie usługi Redis podczas startu systemu:


sudo systemctl enable redis-server

3. Sprawdź status usługi Redis, aby upewnić się, że działa poprawnie:


sudo systemctl status redis-server

Konfiguracja aplikacji Python/MySQL

Instalacja biblioteki Redis-py

Zainstaluj bibliotekę redis-py, która umożliwia interakcję z Redis za pomocą kodu Python:


pip install redis

Konfiguracja ustawień sesji

W pliku konfiguracyjnym aplikacji Python, np. settings.py, wprowadź poniższe ustawienia, dostosowując je do własnej konfiguracji:


REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DB = 0
REDIS_PASSWORD = None
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'session_cache'
SESSION_CACHE_PATH = 'redis://' + REDIS_HOST + ':' + str(REDIS_PORT) + '/' + str(REDIS_DB)

Utworzenie nowego mechanizmu pamięci podręcznej dla sesji

Zdefiniuj nowy bufor pamięci podręcznej o nazwie session_cache w ustawieniach aplikacji Django:


SESSION_CACHES = {
    'session_cache': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': REDIS_CACHE_PATH,
    }
}

Testowanie konfiguracji

Aby zweryfikować poprawność konfiguracji, uruchom serwer aplikacji Django:


python manage.py migrate
python manage.py runserver

Przejdź do aplikacji i zaloguj się. Dane sesji powinny być teraz zapisywane w Redis, co zapewni szybszą obsługę.

Konfiguracja czasu trwania sesji

Aby zarządzać czasem przechowywania sesji w Redis, ustaw parametr wygasania sesji, co automatycznie usunie nieaktywne sesje:


SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
SESSION_CACHE_ALIAS = 'session_cache'
SESSION_REDIS_TIMEOUT = 300

SESSION_REDIS_TIMEOUT określa czas wygasania sesji w sekundach.

Optymalizacja połączeń z Redis

W celu zwiększenia wydajności, skonfiguruj multipleksowanie połączeń z Redis:


REDIS_CONNECTION_POOL = {
    'max_connections': 10,
    'timeout': 20,
    'host': REDIS_HOST,
    'port': REDIS_PORT,
    'db': REDIS_DB,
    'password': REDIS_PASSWORD,
}

Konfiguracja replikacji Redis

Aby zapewnić wysoką dostępność i skalowalność, możesz skonfigurować replikację Redis. Poniżej przedstawiono przykład konfiguracji serwera głównego i podrzędnego:

Na serwerze głównym:


sudo redis-server /etc/redis/redis.conf --replicaof 127.0.0.1 6379

Na serwerze podrzędnym:


sudo redis-server /etc/redis/redis.conf --slaveof 127.0.0.1 6379

Konfiguracja klastra Redis

Aby uzyskać jeszcze większą skalowalność, możesz skonfigurować klaster Redis. Poniżej przedstawiono przykład konfiguracji dla każdego węzła klastra:

Na każdym serwerze klastra:


sudo redis-server /etc/redis/redis.conf --cluster-enabled yes --cluster-config-file /etc/redis/redis.conf --cluster-node-timeout 5000

Podsumowanie

Wdrożenie Redis do obsługi sesji w aplikacjach Python/MySQL przynosi szereg korzyści, takich jak znaczące przyspieszenie działania, zwiększenie skalowalności oraz zapewnienie wysokiej dostępności. Przedstawione kroki obejmują kompleksowy proces konfiguracji i optymalizacji obsługi sesji przy użyciu Redis. Wdrażając te rozwiązania, można podnieść wydajność aplikacji oraz zapewnić lepsze doświadczenie użytkownikom.

Najczęściej zadawane pytania (FAQ)

1. Jakie są korzyści wynikające z użycia Redis do przechowywania danych sesji?
Redis to szybka, operująca w pamięci podręcznej baza danych, co przekłada się na znaczące przyspieszenie obsługi sesji, zwiększenie skalowalności i zapewnienie wysokiej dostępności.

2. Jak skonfigurować Redis do przechowywania danych sesji?
Należy zainstalować Redis, zmodyfikować plik konfiguracyjny redis.conf, uruchomić i włączyć usługę Redis, a następnie skonfigurować ustawienia sesji w aplikacji Python/MySQL.

3. Jak można sprawdzić, czy konfiguracja Redis dla obsługi sesji działa poprawnie?
Po uruchomieniu serwera aplikacji Django i zalogowaniu, dane sesji powinny być przechowywane w Redis.

4. Jak ustawić czas wygasania sesji w Redis?
Należy ustawić parametr SESSION_REDIS_TIMEOUT w pliku konfiguracyjnym sesji.

5. Jak skonfigurować multipleksowanie połączeń z Redis?
Użyj parametru REDIS_CONNECTION_POOL w konfiguracji sesji.

6. Jak skonfigurować replikację Redis?
Uruchom serwer główny i podrzędny Redis za pomocą odpowiednich poleceń, konfigurując serwer podrzędny jako replikę serwera głównego.

7. Jak skonfigurować klaster Redis?
Włącz klaster na każdym serwerze i skonfiguruj pliki redis.conf dla każdego węzła.

8. Jakie są najlepsze praktyki związane z obsługą sesji za pomocą Redis?
Zaleca się konfigurację czasu wygasania sesji, multipleksowania połączeń oraz replikacji lub klastrowania w celu optymalizacji wydajności i skalowalności.

9. Gdzie można znaleźć dodatkowe informacje na temat obsługi sesji przy użyciu Redis?
Zajrzyj do dokumentacji Django Cache oraz dokumentacji Redis Session Management.

10. Czy można manualnie usuwać dane sesji z Redis?
Tak, można użyć poleceń Redis, takich jak KEYS, SCAN i DEL, aby wyszukać i usunąć dane sesji.