Похожие презентации:
presentation
1.
Миграция кеша сроков доставки:Memcached → Redis
Ozon Delivery Service — техническое обоснование
2.
Контекст и цельЧто кешируется
Текущее состояние
Цель
Сроки доставки: точные
(warehouse_id:delivery_type_id) и
неточные (warehouse_id:location_uid).
TTL 10 минут, инвалидация по
удалению склада.
Memcached (42 ноды) + частичный
dual-write в Redis (redis.MGet/MSet
уже в флоу).
Полный отказ от Memcached, переход
на Redis с сохранением
производительности и надёжности.
3.
Текущий Memcached: топология иконфигурация
Топология
Ключи и TTL
Инвалидация
42 ноды в prod, версия 1.6.38, порт
11211, лимит памяти 160 MB на ноду.
Ключи: warehouse_id:delivery_type_id
(точные), warehouse_id:location_uid
(неточные). TTL 10 минут.
По удалению склада (pattern delete по
warehouse id).
4.
Нагрузка днём (базовые метрики)631K/с
100 MB/s
2.19 GB
RPS команд: get ~449K, set ~182K
IO: read 61, write 39
Память: 52 MB/нода, 33% заполнение
51.4%
0.77 мс
Hit ratio, evicted 0
Латентность: p50 0.70, p95 2.66, p99 2.94
5.
Пиковые нагрузки — ночные стресстесты1.76M/с
287 MB/s
5.7 GB
RPS пик: get ~1.28M, set ~484K (x2.8)
IO пик: read 172, write 115 (x2.9)
Память пик: 136 MB/нода, 85% заполнение
(x2.6)
1516
51.3%
Коннекты: почти не растут
Hit ratio: не меняется
6.
Таймауты и лимиты в prod• setDeliveryDatesCached memcached.SetMultiV2 failed: connect timeout
• o3auth i/o timeout на порт 11211
• context deadline exceeded
• o3auth "ERROR Too many open connections"
• getDeliveryDatesCached memcached.GetMulti failed
7.
Расчёт целевого Redis-кластераТип
Число шардов
Память на шард
Шардированный RedisCluster (хешслоты), однородный кеш.
24
1 GB
пик 1.8M с запасом x2 = 3.6M;
~150K/шард
суммарно ~24 GB; пик 5.7 GB -> ~24%
заполнение
Политика: maxmemory-policy allkeys-lru; TTL 10 минут; инвалидация по префиксу склада.
8.
Сравнение Memcached vs RedisПараметр
Memcached (текущий)
Redis (целевой)
RPS-потолок
1.76M/с (пик)
3.6M/с (с запасом)
Шардирование
42 ноды, без шардинга
24 шарда, хеш-слоты
Память на пике
5.7 GB (85% заполнение)
24 GB (24% заполнение)
Коннекты
~1500, лимит 30K
настраиваемый пул
9.
Матрица рисков• RPS 1.8M — Redis однопоточный, нужен шардинг (24 шарда)
• Память 5.7 GB — минимум 6-7 GB, избежать eviction
• IO 287 MB/s — сетевая нагрузка сопоставима
• Коннекты ~1500, но были "too many open connections" — настроить пул
• Dual-write уже частично готов — снижает риск
10.
План миграцииDual-write: запись в
Memcached и Redis
Канареечное переключение
чтения на Redis
Полный отказ от Memcached
Демонтаж инфраструктуры
Memcached
11.
Итог и рекомендацияПерейти на RedisCluster: 24 шарда по 1 GB, allkeys-lru, TTL 10 минут. Это обеспечит запас по RPS (x2), памяти
(x4) и устранит таймауты.
1.8M RPS
24 GB
пик, с запасом x2
запас x4 от пика