Title: Redis Group: Databases Icon: πŸ—ƒοΈ Order: 99 --- ## πŸ“š Table of Contents / Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ 1. [Minimal Safe redis.conf for PROD](#1-ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ-бСзопасный-redisconf-для-prod--minimal-safe-redisconf-for-prod) 2. [Typical Incident: Redis Down](#2-Ρ‚ΠΈΠΏΠΎΠ²ΠΎΠΉ-ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚-redis-ΡƒΠΏΠ°Π»-Π½ΠΎΡ‡ΡŒΡŽ--typical-incident-redis-went-down-at-night) 3. [Emergency Start](#3-Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ-запуск-Ссли-redis-Π½Π΅-стартуСт--emergency-start-redis-does-not-start) 4. [Admin Command Cheatsheet](#4-ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°-ΠΊΠΎΠΌΠ°Π½Π΄-администратора--admin-command-cheatsheet) 5. [Production Red Flags](#5-красныС-Ρ„Π»Π°Π³ΠΈ-Π²-prod--production-red-flags) 6. [Pre-PROD Checklist](#6-ΠΌΠΈΠ½ΠΈ-чСклист-ΠΏΠ΅Ρ€Π΅Π΄-prod--pre-prod-checklist) 7. [Interview Question](#7-вопрос-с-собСсСдования--interview-question) 8. [Persistence: RDB / AOF / None](#8-persistence-rdb--aof--none) 9. [Sorted Set / Stream](#9-sorted-set--stream) 10. [Read-through / Write-through Cache](#10-read-through--write-through-cache) 11. [Redis Eviction](#11-redis-eviction--ΠΊΠ°ΠΊ-Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚) 12. [Logrotate Configuration](#12-logrotate-configuration--конфигурация-logrotate) --- # Redis β€” PROD ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° для сисадмина / Redis β€” PROD cheatsheet for sysadmins > ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: конфигурация, ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Ρ‹, диагностика. > Practical document: configuration, incidents, diagnostics. > Π‘Π΅Π· Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½. > No theory, real production only. --- ## 1. ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ бСзопасный `redis.conf` для PROD / Minimal safe `redis.conf` for PROD ```bash /etc/redis/redis.conf # Debian/Ubuntu /etc/redis.conf # RHEL-based ``` ```bash # === NETWORK / Π‘Π•Π’Π¬ === bind 127.0.0.1 # Listen only locally / Π‘Π»ΡƒΡˆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ локально protected-mode yes # Extra safety / Π”ΠΎΠΏ. Π·Π°Ρ‰ΠΈΡ‚Π° port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 # === AUTH / ΠΠ’Π’ΠžΠ Π˜Π—ΠΠ¦Π˜Π― === requirepass STRONG_PASSWORD # Mandatory in prod / ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΏΡ€ΠΎΠ΄Π΅ # === MEMORY / ПАМЯВЬ === maxmemory 2gb # Hard RAM limit / Жёсткий Π»ΠΈΠΌΠΈΡ‚ RAM maxmemory-policy allkeys-lru # Cache eviction policy / ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° вытСснСния maxmemory-samples 5 # === PERSISTENCE / БОΠ₯Π ΠΠΠ•ΠΠ˜Π• === save 900 1 save 300 10 save 60 10000 appendonly yes # Enable AOF / Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ AOF appendfsync everysec # Balance safety/perf / Баланс надёТности no-appendfsync-on-rewrite yes # === PERFORMANCE / ΠŸΠ ΠžΠ˜Π—Π’ΠžΠ”Π˜Π’Π•Π›Π¬ΠΠžΠ‘Π’Π¬ === lazyfree-lazy-eviction yes # Async key deletion / АсинхронноС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ lazyfree-lazy-expire yes lazyfree-lazy-server-del yes # === LIMITS / Π›Π˜ΠœΠ˜Π’Π« === maxclients 10000 # Connection limit / Π›ΠΈΠΌΠΈΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ # === LOGGING / Π›ΠžΠ“Π˜ === loglevel notice logfile /var/log/redis/redis-server.log # === SAFETY / Π‘Π•Π—ΠžΠŸΠΠ‘ΠΠžΠ‘Π’Π¬ === stop-writes-on-bgsave-error yes ``` **Π’Π°ΠΆΠ½ΠΎ / Important:** - `maxmemory` обязатСлСн / mandatory - Redis Π±Π΅Π· Π»ΠΈΠΌΠΈΡ‚Π° памяти = OOM Π½ΠΎΡ‡ΡŒΡŽ / no limit = OOM kill --- ## 2. Π’ΠΈΠΏΠΎΠ²ΠΎΠΉ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚: Β«Redis ΡƒΠΏΠ°Π» Π½ΠΎΡ‡ΡŒΡŽ" / Typical incident: "Redis went down at night" ### Быстрая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° / Quick check ```bash systemctl status redis # Service state journalctl -u redis --since "2 hours ago" # Recent logs ``` ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° OOM / OOM check: ```bash dmesg | grep -i oom ``` ### Диагностика Redis / Redis diagnostics ```bash redis-cli -a PASSWORD ping redis-cli -a PASSWORD INFO ``` ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ / Key metrics: - `used_memory` β€” RAM usage - `maxmemory` β€” configured limit - `evicted_keys` β€” evictions count - `rejected_connections` β€” connection issues --- ### ЧастыС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΠ°Π΄Π΅Π½ΠΈΠΉ / Common root causes #### 1. НСт `maxmemory` / No `maxmemory` ```bash redis-cli INFO memory | grep maxmemory ``` Ѐикс / Fix: ```conf maxmemory 2gb maxmemory-policy allkeys-lru ``` --- #### 2. `noeviction` policy Redis stops accepting writes when memory is full. ```bash redis-cli INFO stats | grep rejected ``` Ѐикс / Fix: ```conf maxmemory-policy allkeys-lru ``` --- #### 3. Fork failed (RDB snapshot) ```bash grep fork /var/log/redis/redis-server.log ``` ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ / Causes: - insufficient RAM - too frequent snapshots --- #### 4. Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ file descriptors / FD limit reached ```bash redis-cli INFO clients ulimit -n ``` Ѐикс / Fix (systemd): ```bash LimitNOFILE=100000 ``` --- ## 3. Аварийный запуск (Ссли Redis Π½Π΅ стартуСт) / Emergency start (Redis does not start) ```bash redis-server --appendonly no --save "" ``` ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… / Data cleanup: ```bash FLUSHALL ``` --- ## 4. Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ администратора / Admin command cheatsheet ### ΠžΠ±Ρ‰ΠΈΠ΅ / General ```bash PING # Health check INFO # Full info INFO memory # Memory stats INFO stats # Runtime stats INFO persistence # RDB/AOF state INFO replication # Master/replica INFO clients # Connected clients ``` ### ΠŸΠ°ΠΌΡΡ‚ΡŒ / Memory ```bash MEMORY STATS # Memory internals MEMORY USAGE key # Per-key usage redis-cli --bigkeys # Find large keys ``` ### TTL / Expiration ```bash TTL key # Seconds to expire PTTL key # Milliseconds to expire ``` ### ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ / Clients ```bash CLIENT LIST # Active connections CLIENT KILL ip:port # Kill client ``` ### ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ / Performance ```bash SLOWLOG GET 10 # Last slow commands SLOWLOG LEN # Slowlog size ``` ### ΠžΠΏΠ°ΡΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ / Dangerous commands ```bash FLUSHALL FLUSHDB MONITOR KEYS * ``` `KEYS *` blocks Redis in production. --- ## 5. ΠšΡ€Π°ΡΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ Π² PROD / Production red flags - Redis without `maxmemory` - Keys without TTL - Redis used as primary storage - Redis exposed to the Internet - Redis Cluster without real need --- ## 6. Мини-чСклист ΠΏΠ΅Ρ€Π΅Π΄ PROD / Pre-PROD checklist - [ ] `maxmemory` configured - [ ] eviction policy defined - [ ] Redis role is clear (cache / queue / storage) - [ ] acceptable data loss defined - [ ] memory monitoring enabled - [ ] Redis not publicly accessible --- ## 7. Вопрос с собСсСдования / Interview question **What happens when Redis reaches `maxmemory`?** Expected answer: eviction policies, `noeviction`, impact on application. --- ## 8. Persistence: RDB / AOF / None ### RDB (snapshot) **RU:** снимок Π±Π°Π·Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ N сСкунд, быстрый, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° потСря послСдних Π΄Π°Π½Π½Ρ‹Ρ… **EN:** full DB snapshot every N seconds, fast, may lose last changes ### AOF (Append Only File) **RU:** Π»ΠΎΠ³ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ, ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ **EN:** append commands to log, minimal loss, slower ### None **RU:** Ρ‚ΠΎΠ»ΡŒΠΊΠΎ RAM, потСря ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ **EN:** RAM only, lost on crash --- ## 9. Sorted Set / Stream ### Sorted Set **RU:** ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты + score, Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³, Ρ‚ΠΎΠΏ-N **EN:** unique elements + score, ranking, top-N ### Stream **RU:** ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ событий, ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π»ΠΎΠ³, consumer group **EN:** sequential events, queue, log, consumer group --- ## 10. Read-through / Write-through cache ### Read-through **RU:** ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Redis β†’ MySQL β†’ Redis **EN:** check Redis β†’ MySQL β†’ Redis ### Write-through **RU:** ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ MySQL + Redis ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ **EN:** write to MySQL + Redis simultaneously --- ## 11. Redis eviction / Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ **RU:** ΠΏΡ€ΠΈ достиТСнии `maxmemory` ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΠΎ `maxmemory-policy` - allkeys-lru, volatile-lru, allkeys-random, volatile-random, noeviction **EN:** on reaching `maxmemory`, keys evicted based on `maxmemory-policy` - allkeys-lru, volatile-lru, allkeys-random, volatile-random, noeviction --- ## 12. Logrotate Configuration / ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Logrotate ```bash /etc/logrotate.d/redis-server ``` ```bash /var/log/redis/*.log { daily rotate 14 compress delaycompress missingok notifempty create 640 redis adm sharedscripts postrotate redis-cli -a DEBUG RELOAD > /dev/null 2>&1 || true endscript } ``` > [!TIP] > Alternatively, use `redis-cli DEBUG RELOAD` or configure log rotation in `redis.conf` directly. > ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `redis-cli DEBUG RELOAD` ΠΈΠ»ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π»ΠΎΠ³ΠΎΠ² Π² `redis.conf`. ---