Web, кэширование и memcached

Содержание

Слайд 2

Кэширование

Время отклика сервера – важный фактор для пользователей.
Для сложного сайта генерация одной страницы

Кэширование Время отклика сервера – важный фактор для пользователей. Для сложного сайта
~ 20-50 запросов к БД.
Вычислительно сложные задачи (запросы) ~ 1-∞ секунд.
Кэширование как способ минимизации времени отклика и снижения нагрузки на сервер.

Слайд 3

Кэш

Кэш встречается везде: ЦП, жесткий диск, магнитола в машине, буферы ОС, …
Успех

Кэш Кэш встречается везде: ЦП, жесткий диск, магнитола в машине, буферы ОС,
кэша в принципе локальности.

Слайд 4

memcached

Большая хэш-таблица в памяти, доступная через сетевой протокол.
Операции:
get/set/del
«Атомарность»
incr/decr
cas/add/replace
append/prepend

Brad Fitzpatrick

memcached Большая хэш-таблица в памяти, доступная через сетевой протокол. Операции: get/set/del «Атомарность»

Слайд 5

Общая схема кэширования

Общая схема кэширования

Слайд 6

Архитектура memcached

Никаких вычислительно сложных операций.
Все операции – O(1).
Никаких нитей – асинхронный ввод/вывод.
Время

Архитектура memcached Никаких вычислительно сложных операций. Все операции – O(1). Никаких нитей
отклика сервера – почти RTT.

Слайд 7

Потеря ключей

Ограниченность объема памяти, выделенного memcached.
Истек срок жизни ключа.
Отказ сервера или процесса

Потеря ключей Ограниченность объема памяти, выделенного memcached. Истек срок жизни ключа. Отказ сервера или процесса memcached.
memcached.

Слайд 8

Применение memcached

«Можно потерять»:
кэширование выборок БД;
вычислительно сложные значения.
«Не хотелось бы потерять»:
счетчики посетителей, просмотров

Применение memcached «Можно потерять»: кэширование выборок БД; вычислительно сложные значения. «Не хотелось
и т.п.
«Совсем не должны терять»:
сессии пользователей.

Слайд 9

Задачи

Формирование ключа кэширования.
Кластеризация memcached.
Счетчики и атомарность.
Как избежать одновременного перестроения кэшей.
Сброс группы

Задачи Формирование ключа кэширования. Кластеризация memcached. Счетчики и атомарность. Как избежать одновременного
кэшей.
Анализ статистики memcached, slab-аллокатор.
Отладка memcached, дополнительные вопросы.

Слайд 10

Ключ кэширования

Ключ – строка ограниченной длины.
По параметрам выборки должен однозначно определяться ключ.
При

Ключ кэширования Ключ – строка ограниченной длины. По параметрам выборки должен однозначно
изменении параметров выборки ключ должен изменяться.
Вариант: ключ = md5(serialize(параметры))

Слайд 11

Кластеризация memcached

Зачем:
увеличение объема кэша;
обеспечение некоторой отказоустойчивости;
распределение нагрузки.
Как распределить ключи?

Кластеризация memcached Зачем: увеличение объема кэша; обеспечение некоторой отказоустойчивости; распределение нагрузки. Как распределить ключи?

Слайд 12

Распределение ключей

Необходима функция: f(ключ)=номер_сервера
«Стандартный вариант» по модулю: f(ключ)=crc32(ключ)%кол-во_серверов
Consistent hashing:

Распределение ключей Необходима функция: f(ключ)=номер_сервера «Стандартный вариант» по модулю: f(ключ)=crc32(ключ)%кол-во_серверов Consistent hashing:

Слайд 13

Атомарность операций

memcached не обеспечивает операций блокировки.
Обычные операции get/set не обеспечивают атомарности.
Самые простые

Атомарность операций memcached не обеспечивает операций блокировки. Обычные операции get/set не обеспечивают
атомарные операции: инкремент/декремент (incr/decr).

Слайд 14

Счетчики в memcached

Пример: счетчик просмотров в реальном времени.
число просмотров аккумулируется и сохраняется

Счетчики в memcached Пример: счетчик просмотров в реальном времени. число просмотров аккумулируется
в БД;
после просмотра увеличиваем (incr) счетчик в memcached;
если получили ошибку, выбираем начальное значение из БД (set).
Наличие race condition.

Слайд 15

Счетчик онлайнеров

450

580

434

497

101

503

0

1

2

3

4

5

Текущий изменяемый ключ

Значение счетчика = ∑ (5,0,1,2,3)

Онлайнеры – кол-во уникальных сессий за

Счетчик онлайнеров 450 580 434 497 101 503 0 1 2 3
последние 5 минут

Время жизни каждого ключа – 5 минут

Слайд 16

Одновременное перестроение кэшей

Пусть есть кэш с большим количеством обращений на чтение.
В какой-то

Одновременное перестроение кэшей Пусть есть кэш с большим количеством обращений на чтение.
момент истекает срок жизни кэша.
Большое число frontendов пытаются одновременно перестроить кеш.
Получаем огромную нагрузку на backend в один момент времени.

Слайд 17

Решение проблемы

Храним ключи кэшей без ограничения по времени.
В значение кэша записываем реальное

Решение проблемы Храним ключи кэшей без ограничения по времени. В значение кэша
время жизни кэша.
Если получили устаревший кэш, предпринимаем попытку перестроения с блокировкой.
Если кто-то уже перестраивает кэш, подождем или вернём старое значение.

Слайд 18

Пример

Обращаемся за кэшем, например ‘user_info_id_159’
Сравниваем срок годности с текущим временем.
Кэш «протух» →

Пример Обращаемся за кэшем, например ‘user_info_id_159’ Сравниваем срок годности с текущим временем.
необходимо его построить заново.

срок годности:
2008-10-07 21:00
данные кэша: [
id: 159
login: ‘user’
nick: ‘Hello’

]

Ключ user_info_id_159:

Слайд 19

Пример

Пытаемся заблокироваться по ключу user_info_id_159_lock.
Не удалось получить блокировку:
ждём снятия блокировки;
не дождались:

Пример Пытаемся заблокироваться по ключу user_info_id_159_lock. Не удалось получить блокировку: ждём снятия
возвращаем старые данные кэша;
дождались: выбираем значения ключа заново, возвращаем новые данные (построенный кэш другим процессом).
Удалось получить блокировку:
строим кэш самостоятельно.

Слайд 20

Блокировки в memcached

Первый вариант: get/set блокировка
get(lock) ? 1 → locked
set(lock, 1, small_timeout)

Блокировки в memcached Первый вариант: get/set блокировка get(lock) ? 1 → locked
… delete(lock)
неатомарная, простая, работоспособна для нас.
Корректная блокировка: gets/cas блокировка
gets(lock) → значение, unique
cas(lock, 1, unique, small_timeout)
атомарна, корректна.

Слайд 21

Сброс группы кэшей

Один и тот же объект часто входит в несколько разных

Сброс группы кэшей Один и тот же объект часто входит в несколько
выборок, а значит и кэшей, т.е. изменение объекта должно приводить к инвалидации группы кэшей.
memcached не поддерживает «папки», т.к. это противоречит сложности О(1) для всех операций.
Что делать?

Слайд 22

Тэгирование кэшей

Тэг – это имя и версия группы кэшей.
Версия – монотонно увеличивающееся

Тэгирование кэшей Тэг – это имя и версия группы кэшей. Версия –
число.
Сброс группы кэшей – увеличение версии тэга группы.

Слайд 23

Тэгирование кэшей

В memcached вместе с данными кэша отправляем номера версий всех тэгов,

Тэгирование кэшей В memcached вместе с данными кэша отправляем номера версий всех
которые были актуальны на момент создания кэша.
При получении кэша, он считается валидным, если:
у него не истекло собственное «время жизни»;
текущая версия всех тэгов, с которыми связан кэш, равна версиям, записанным в кэше.

Слайд 24

Пример

Было:

Записали в кэш:

tag1 → 25

tag2 → 63

срок годности: 2008-10-07 21:00
данные кэша: [

Пример Было: Записали в кэш: tag1 → 25 tag2 → 63 срок

]
тэги: [
tag1 : 25
tag2 : 63
]

Слайд 25

Пример

tag2++

Пример tag2++

Слайд 26

Пример

Стало:

Лежит в кэше:

tag1 → 25

tag2 → 64

срок годности: 2008-10-07 21:00
данные кэша: [

Пример Стало: Лежит в кэше: tag1 → 25 tag2 → 64 срок

]
тэги: [
tag1 : 25
tag2 : 63
]

кэш устарел!

Слайд 27

Версия тэга и слейвы БД

Удачный вариант версии – текущее время:
монотонно увеличивается;
при потере

Версия тэга и слейвы БД Удачный вариант версии – текущее время: монотонно
значения тэга в memcached корректно восстанавливается.
Версия в виде времени может использоваться для компенсации задержки в синхронизации слейвов БД:
если (текущее время – версия) < 10 сек., используем для выборки мастера.

Слайд 28

Статистика memcached

Команда stats позволяет получить различную статистику по работе memcached.
«Обычная статистика»:
процент хитов

Статистика memcached Команда stats позволяет получить различную статистику по работе memcached. «Обычная
по отношению к общему числу «get» (эффективность кэша);
ключи, удаленные раньше времени из кэша (достаточность объема памяти);
объем памяти процесса, uptime и т.п.

Слайд 29

slab-аллокатор

Баланс между внутренней фрагментацией и эффективностью использования памяти.
Эффективные O(1) алгоритмы.
Набор slab’ов под

slab-аллокатор Баланс между внутренней фрагментацией и эффективностью использования памяти. Эффективные O(1) алгоритмы.
блоки предопределенного размера: 64, 128, 256, …, 210.
Каждый slab: использовано кусков, занято кусков, список свободных кусков, очередь LRU.

Слайд 30

Статистика slab-аллокатора

Статистика slab-аллокатора

Слайд 31

Отладка memcached

Проблемы плохо воспроизводятся в локальном/тестовом окружении.
Отладка возможна только в реальном времени

Отладка memcached Проблемы плохо воспроизводятся в локальном/тестовом окружении. Отладка возможна только в
(без остановок).
Вариант решения: одно действие – один символ в лог:
MLWUHHHHHHHHHHHHHHHMLLHHHHHHHHHH

Слайд 32

Дополнительные вопросы

memcached как способ межпроцессного/межъязыкового взаимодействия;
Кэширование memcached («кэширование кэша»): в теле процесса,

Дополнительные вопросы memcached как способ межпроцессного/межъязыкового взаимодействия; Кэширование memcached («кэширование кэша»): в
в локальном кэше (eAccelerator и т.п.)
Другая семантика: memcachedb, memcacheq, и т.п.
Имя файла: Web,-кэширование-и-memcached.pptx
Количество просмотров: 172
Количество скачиваний: 0