Налаштування AWS ElastiCache (Redis/Memcached) під ключ

Пікове навантаження на каталог або особистий кабінет обвалює відгук саме тоді, коли приходять покупці. Ми налаштовуємо AWS ElastiCache під ключ: проєктуємо топологію, переносимо кеш, налаштовуємо відмовостійкість і передаємо кластер із документацією. Час відгуку під навантаженням скорочується в рази, а витрати на інфраструктуру перестають зростати.
Часті запитання

Налаштування AWS ElastiCache: де ламається кеш

Налаштування AWS ElastiCache починається не із запуску вузла, а з розрахунку: кеш виносять перед базою, щоб зняти вузьке місце бази даних — повторювані вибірки й агрегати віддають з пам'яті, а не з диска.

При неправильній конфігурації сервіс сам стає точкою відмови: збої кешу Redis проявляються як зростання часу відповіді та лавина запитів, що обрушується на базу.

Найчастіша причина — переповнення пам'яті кешу. Ліміт задають без запасу під службові структури та фрагментацію, а політику витіснення залишають за замовчуванням.

Якщо вона забороняє видалення ключів, запис починає падати з помилками; якщо видаляє все підряд — із кешу вимиваються гарячі дані, і база отримує саме той потік, від якого йшли.

Другий сценарій — холодний старт кешу. Після скидання, перезапуску вузла або ручного очищення кеш порожній, і весь трафік одномоментно йде в базу. Без прогріву й обмеження паралелізму база не витримує пік, хоча формально «лише очистили кеш».

Третій — вузол без реплікації. Відмова забирає і прогрітий набір ключів, і частину записів, а відновлення починається з нуля. Репліка й регламент перемикання перетворюють це на коротку деградацію замість простою.

Ці сценарії ми й розбираємо до конфігурації: рахуємо обсяг гарячих даних і запас пам'яті, задаємо правила витіснення й перезапуску, піднімаємо репліку з автоматичним перемиканням — розбираємо, як кожен із них закривається на практиці.

Що дає винесений кеш: відгук, навантаження, відмови

Перше, що видно в метриках після перенесення читань в ElastiCache, — падіння частки повільних запитів.

Типовий профіль навантаження зменшується з кількох відсотків звернень до гарячих ключів до десятих часток відсотка, а час відгуку застосунку перестає залежати від того, чи потрапив запит у конкурентне блокування на основній базі.

Верхній процентиль перестає «виїжджати» в години активності, і це видно не на синтетиці, а на бойовому трафіку.

Другий ефект — розвантаження основної бази в пікові години. Повторювані вибірки довідників, сесій, лічильників і прав ідуть у кеш, тому база обслуговує переважно запис і унікальні запити, а не один і той самий набір читань.

Запас за з'єднаннями та дисковими операціями залишається під зростання, а не витрачається на повтори.

Третій — відмовостійкість самого кешу. Конфігурація з репліками в різних зонах доступності та автоматичним перемиканням перетворює втрату вузла на короткий сплеск промахів, а не на відмову сервісу: клієнтська логіка при промаху йде в базу й заповнює кеш заново.

За коректно заданого строку життя ключів і захисту від одночасного перерахунку це не перетворюється на лавину запитів.

Четвертий — знятий клас відмов через перевантаження. Раніше пік трафіку означав чергу запитів і таймаути; тепер зайве навантаження лягає на кеш, який масштабується горизонтально.

Замість деградації до недоступності сервіс тримає час відгуку в межах норми, а зростання трафіку перестає бути аварійною подією.

Кластери ElastiCache: режими роботи й топології

Кеш в AWS ElastiCache збирають у кілька топологій, і режими ElastiCache визначають не стільки швидкість, скільки клас відмов. Одиночний вузол дає мінімум мережевих переходів, але втрата хоста означає повну втрату кешу: застосунок одразу йде в базу й добиває її піком запитів.

Реплікація кешу закриває цю діру — ведений вузол підвищується автоматично, а клієнт перепідключається до нової адреси за секунди.

Шардування кешу вирішує іншу задачу: ключі розкладаються за слотами, пам'ять і пропускна здатність зростають горизонтально. Обмеження — частина операцій між слотами недоступна, а клієнтським бібліотекам потрібне явне ввімкнення підтримки топології кластера.

Варіант Коли підходить Обмеження
Одиночний вузол Тестові контури, дані дешевше перерахувати Немає автоматичного переходу: відмова = втрата кешу
Реплікація з автоматичним переходом Сесії, кошики, де простій помітний Репліка масштабує читання, не запис
Шардування кешу Датасет не вміщається в один вузол Складніший клієнт, частина операцій між слотами недоступна
Кеш усередині застосунку Гарячі довідники з рідкісною зміною Не розділяється між екземплярами, інвалідація потребує розсилки

Топологію вибирають за даними, а не за навантаженням у моменті: для більшості бойових сценаріїв достатньо двох шардів із реплікою в кожному — це дає перехід на резервний вузол і запас під зростання. Відпрацювання відмови перевіряємо на стенді, а не в бою.

Як проходить впровадження: від аудиту до передачі

Налаштування AWS ElastiCache іде від профілю навантаження, а не від створення кластера. Спочатку знімаємо, що й як часто читає застосунок, скільки живуть дані та що відбувається при промаху — від цього залежать схема розміщення, обсяг пам'яті й правила витіснення.

  1. Аудит навантаження. Знімаємо профіль звернень застосунку й бази: співвідношення читання й запису, гарячі ключі, розкид розмірів значень, добові піки. На виході — вимоги до обсягу пам'яті та кількості операцій за секунду.
  2. Схема розміщення кешу. Вирішуємо, що кешуємо — сесії, довідники, результати важких запитів, — де ставимо строк життя, а де явну інвалідацію. Простори ключів розділяємо за сервісами, щоб один не витісняв дані іншого.
  3. Налаштування кластера. Піднімаємо конфігурацію з репліками та автоматичним переходом при відмові, вузли розміщуємо в різних зонах доступності, шифрування вмикаємо і під час передачі, і в сховищі. Політику витіснення задаємо за підсумками аудиту, а не за замовчуванням.
  4. Доступ і ізоляція. Кластер живе в приватних підмережах, вхід — за групами безпеки та обліковими даними зі сховища секретів із ротацією. Окремо перевіряємо, що тестовий контур не бачить продуктивних даних.
  5. Перевірка відмовостійкості. Керовано виводимо вузол, емулюємо відмову зони доступності, дивимося, як застосунок переживає промах і з якою швидкістю кеш наповнюється заново. Фіксуємо час відновлення та поведінку при переповненні пам'яті.
  6. Передача документації. Віддаємо схему розміщення, параметри кластера, правила витіснення, регламент ротації ключів та інструкції з типових операцій — масштабування, оновлення, відкат версії.

Документація та артефакти, які залишаються у вас

Налаштування AWS ElastiCache завершується не статусом кластера, а пакетом артефактів, за яким ваша команда експлуатує кеш без нас. Усе лежить у вашому репозиторії та базі знань, передаємо з розбором на дзвінку.

  • Схема кластера — топологія шардів і реплік, розподіл за зонами доступності, точки підключення, порядок перемикання при відмові вузла.
  • Політики доступу до кешу — ролі та групи безпеки, шифрування в транзиті й на диску, ротація облікових даних, межі мережевого доступу.
  • Регламент прогріву кешу — порядок наповнення після перезапуску, обмеження навантаження на джерело даних, ознака завершеного прогріву.
  • Регламент скидання та інвалідації — що й коли витісняємо, як масове очищення не ронить базу, чим перевіряємо результат.
  • Інструкція для чергової зміни — ключові метрики, їхнє трактування, типова послідовність дій і момент, коли потрібно телефонувати нам.
  • Документація на інфраструктуру — опис конфігурації в репозиторії, параметри груп, історія правок і порядок змін.
  • Звіт за перевірками — прогнані сценарії навантаження й відмови, знайдені обмеження, що усвідомлено залишилося за периметром.

Пакет розрахований на інженера, який бачить кластер уперше: за ним можна провести чергування, відкотити зміну та обґрунтувати правку. Перед передачею розбираємо кожен документ із вашою командою та відповідаємо на запитання щодо конфігурації.

Кейс: як зняли пікове навантаження на каталог товарів

Точка, з якої почали

Каталог на 180 тисяч позицій із фільтрами й сортуваннями: кожен показ списку — це десятки запитів до основної бази. На розпродажі пікові читання впиралися в стелю, p95 віддачі картки йшов за секунду, частка повільних запитів трималася на 8-9%.

Частина кошиків губилася на таймаутах, а база не залишала запасу під запис — замовлення й оновлення залишків ставали в чергу за читанням.

Окремий біль — відмова вузла кешу. Кластер стояв в одній зоні без репліки: при перезапуску гарячі ключі охолоджувалися разом, весь трафік падав на базу, а відновлення займало до 40 хвилин ручної роботи.

Що змінили й що отримали

Розгорнули кластер AWS ElastiCache з реплікою в іншій зоні доступності та автоматичним перемиканням при відмові вузла.

Кешували не «все підряд», а гарячі вибірки — картки, зрізи каталогу, лічильники — з TTL за типом даних і різними політиками витіснення, щоб рідкісні ключі не витискали популярні. Прогрів після кожного релізу й ліміт на розмір значення прибрали сплеск читань на старті.

Заміри за місяць: частка влучань у кеш 94-97%, читання на основну базу впали в 6 разів, повільні запити — з 9% до 0,3%. Відмову вузла тепер переживають за 30-40 секунд без ручних дій: репліка піднімається, каталог продовжує відповідати з кешу.

Раніше такий інцидент означав деградацію каталогу й 40 хвилин ручного відновлення — тепер це рядок у моніторингу.

На контролі залишили алерти щодо пам'яті та частки влучань плюс ревізію TTL під зміни асортименту — щоб кеш не перетворився на джерело застарілих даних.

Чим відрізняється Redis від Memcached у кешуванні

Різниця починається з моделі даних. Memcached — пласке сховище пар «ключ-значення»: значення це рядки або бінарні блоки, а структури клієнт серіалізує сам.

Redis працює з типами — хеші, списки, упорядковані множини, лічильники, потоки: інкремент, вибірка діапазону з черги або топ за рейтингом виконуються на сервері однією операцією, без циклу читання-зміна-запис і гонок між клієнтами.

Збереження стану — другий вододіл. Memcached тримає дані тільки в пам'яті: ні реплік, ні знімків на диск, тому перезапуск вузла або витіснення ключів повертають застосунок до бази цілком.

Redis знімає стан на диск, веде журнал змін і тримає репліки — після відмови кеш прогрівається частково, а не з нуля.

Кластерний режим відрізняється принципово. Memcached масштабується на стороні клієнта: бібліотека сама розкладає ключі за вузлами, і при зміні їхньої кількості частина ключів змінює власника — шар кешу відповідає промахами, база отримує сплеск.

У кластерному режимі Redis розбиття ключів за вузлами й переведення навантаження при відмові репліки виконуються на сервері та приховані від застосунку.

Помилка у виборі можлива в обидва боки. Memcached доречний там, де втрата кешу не критична — фрагменти сторінок, сесії; але черги, блокування й лічильники на ньому перетворюються на саморобну логіку на клієнті.

Redis беруть заради десятка ключів і платять репліками, пам'яттю та обслуговуванням. В ElastiCache движок задається при створенні кластера й на льоту не змінюється: перехід — це новий кластер і заново прогрітий кеш.

Технічні сумніви замовників перед стартом

Заперечення перед стартом зазвичай однакові: чи доведеться правити код, що станеться при відмові вузла, як не віддати користувачу застарілі дані, хто отримає доступ до кешу.

Відповідаємо коротко; деталі розбираємо на дзвінку за вашою схемою — з урахуванням уже працюючого нестабільного кешу, якщо він є.

Чи потрібно змінювати код застосунку?

У більшості випадків правки в коді застосунку не потрібні: клієнтські бібліотеки Redis і Memcached стандартні, змінюється тільки адреса підключення в конфігурації.

Переписувати логіку доводиться, якщо у вас свої схеми ключів або нестандартний розбір відповіді — такі місця позначаємо заздалегідь.

Як бути зі застарілими даними в кеші?

Для кожного типу ключів задаємо строк життя та політику витіснення, щоб пам'ять не забивалася мертвими записами. Там, де важлива актуальність, запис скидається відразу після зміни в базі — застарілі дані в кеші не доживають до наступного читання.

Хто і як отримає доступ до кешу?

Кеш розміщуємо в приватних підмережах без виходу в інтернет, обмежуємо доступ групами безпеки та шифруємо трафік. Паролі та ключі лежать у секрет-сховищі й ротуються, адміністративних доступів із застосунку не залишається.

У нас уже є кеш, але він нестабільний — переробляти все?

Спочатку знімаємо метрики щодо пам'яті, затримок і обривів з'єднань, відокремлюємо помилку конфігурації від нестачі ресурсів. Далі або лікуємо поточний кластер, або переносимо дані в новий без зупинки сервісу — втрачені під час переїзду ключі компенсуємо прогрівом.

Обговоримо задачу: що уточнити перед початком робіт

Перш ніж називати строки й обсяг робіт, нам потрібні ввідні щодо навантаження та поточної схеми. Зазвичай достатньо однієї розмови з вашим інженером і опису того, як застосунок ходить в AWS ElastiCache — решту уточнюємо самі.

За підсумками повертаємося з оцінкою робіт, планом впровадження за етапами та схемою майбутнього кластера.

Що варто тримати під рукою під час обговорення задачі:

  • профіль навантаження — скільки запитів за секунду тримає пік і наскільки він вищий за середній;
  • обсяг і структура даних у кеші: що зберігається, як часто змінюється, які ключі живуть найдовше;
  • поведінка застосунку при відмові вузла: що відбувається, коли кеш стає недоступним;
  • вимоги до збереження даних: чи можна втратити частину при перезапуску або потрібен запис на диск;
  • мережевий контур: у якій мережі живуть сервіси та кому потрібен доступ до кешу;
  • цільові показники: час відгуку, частка влучань у кеш, час відновлення після збою;
  • обмеження: вікна на зміни, доступи, вимоги безпеки й аудиту.

Якщо частини ввідних немає — не страшно: щось зберемо разом, щось знімемо замірами на вашому контурі. Опишіть задачу у вільній формі — повернемося з оцінкою, планом впровадження та схемою кластера, яку можна обговорювати з командою.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141