SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Hash & Cache
Курс «Базы данных»
Цесько Вадим Александрович
http://incubos.org
@incubos
Computer Science Center

16 сентября 2013 г.

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

1 / 27
Содержание

1

Hash

2

Cache

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

2 / 27
Hash

Коллекции: сложность операций

Коллекции: сложность операций
ArrayList:
get(): O(1)
insert(): O(n)
delete(): O(n)
append(): O(1) / O(n)
LinkedList:
get(): O(n)
insert(): O(n)
delete(): O(n)
append(): O(1)
Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

3 / 27
Hash

Как ещё быстрее?

Как ещё быстрее?
Hash table
Ассоциативный массив, отображающий ключи в
значенияa :
1
С помощью хэш-функции от ключа находим
индекс в массиве bucket’ов
2
Перебираем ключи в найденном bucket’е до
совпадения
3
Извлекаем значение
a

http://en.wikipedia.org/wiki/Hash_table

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

4 / 27
Hash

Пример

Пример

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

5 / 27
Hash

Hash table: сложность операций

Hash table: сложность операций
get(): O(1)
insert(): O(1)
delete(): O(1)
append(): O(1)
Допущения
При равномерной функции хэширования
Без учёта ребалансировки

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

6 / 27
Hash

Подводные камни

Подводные камни

Выбор функции хэширования
Разрешение коллизий:
Separate chaining — лишняя память, CPU cache misses
Open addressing — элементов не больше 70% размера
массива, CPU cache pollution

Resize & rehash
Concurrency

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

7 / 27
Hash

Материалы

Материалы

java.util.HashMap
java.util.concurrent.ConcurrentHashMap
http://en.wikipedia.org/wiki/Hash_table
Chris Okasaki. Purely Functional Data Structures1

1

http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

8 / 27
Cache

Классические архитектуры Web-приложений

Классические архитектуры
Web-приложений

Как взаимодействуют с хранилищами
Какие проблемы пытаются решить
Каким образом

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

9 / 27
Cache

Трёхзвенный клиент-сервер

Трёхзвенный клиент-сервер

Зачем нужен Server:
Преобразование форматов
Логика: проверить, посчитать, ...
Гибкость
Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

10 / 27
Cache

Нагрузка растёт

Нагрузка растёт

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

11 / 27
Cache

Нагрузка ещё больше

Нагрузка ещё больше

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

12 / 27
Cache

Что такое cache

Что такое cache
Cache
Реализация in-memory concurrent hash table с
некоторыми особенностями.
1
2

def process(request: Request): Response = {
implicit val timeout = Timeout(50 milliseconds)

3

cache.get(request)
.getOrElse({
val response = buildResponse(request)
cache.put(request, response)
response
})

4
5
6
7
8
9
10

}
Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

13 / 27
Cache

Анализ cache per server

Анализ cache per server
Достоинства
Снизили нагрузку на CPU и БД (если нормальный
cache hit ratio)
Недостатки
В каждом cache одинаковые значения
«Лишние» вычисления (нагрузка на CPU)
Ограниченный размер каждого cache
Получили спектр проблем с апгрейдом системы
Нужны политики «протухания» и вытеснения
Нужно «прогревать» кэш или перезапускать
сервера постепенно
Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

14 / 27
Cache

Distributed cache

Distributed cache

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

15 / 27
Cache

Первый подход к снаряду

Первый подход к снаряду
1
2
3

class Cache {
val servers =
Vector("cache01.yandex.net", "cache02.yandex.net")

4

protected def lookup(key: AnyVal): String =
servers(key.hashCode() % servers.length)

5
6
7

def get(key: AnyVal) =
remoteGet(lookup(key))

8
9
10

def put(key: AnyVal, value: Array[Byte]) =
remotePut(lookup(key), value)

11
12
13

}

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

16 / 27
Cache

Анализ distributed cache

Анализ distributed cache
Достоинства
Считаем всё (примерно) один раз
Больше суммарный объём
Больше влезет значений
Недостатки
Остался спектр проблем с апгрейдом системы
Нужны политики «протухания» (TTL) и
вытеснения (LRU)
Нужно «прогревать» кэш
Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

17 / 27
Cache

Memcached

Memcached
http://www.memcached.org/
Разработан для LiveJournal в 2002
Используется в YouTube, Flickr, Reddit, Facebook,
Orange, Twitter, Tumblr, Wikipedia, Yandex
Входит в Google App Engine, Windows Azure,
Amazon Web Services
In-memory
Ключ — строка (до 250 байт)
Многопоточный + libevent
LRU + TTL (up to 30 days)
Простой текстовый и бинарный протокол: set,
add, replace, append, prepend, get, delete, ...
Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

18 / 27
Cache

Проблема: Изменение кластера memcached

Проблема: Изменение кластера
memcached
Причины
Список серверов в клиенте
Количество серверов в hash-функции
Решения
Сервис-proxy перед memcached
Consistent hashing

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

19 / 27
Cache

Сервис-proxy

Сервис-proxy
Функции:
Слушает клиентский порт
Хэширует ключ и проксирует запрос
Держит соединения ко всем экземплярам cache
Недостатки
+1 сетевой hop
Весь трафик через одну точку
SPOF

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

20 / 27
Cache

Consistent hashing

Consistent hashing

Определение
When a hash table is resized and consistent hashing is
used, only K /n keys need to be remapped on average,
where K is the number of keys, and n is the number of
slotsa .
a

http://en.wikipedia.org/wiki/Consistent_hashing

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

21 / 27
Cache

Consistent hashing: своими руками

Consistent hashing: своими руками
Будем отображать ключи в слоты, а затем слоты на
машины:
1

val slots = Vector(100, 200, 300, 400)

2
3
4
5
6

def slot(key: AnyVal): Int = {
val hash = key % slots.last
slots.indexWhere(hash < _)
}

Если переполняется слот 200-299, то подвигаем:
1

val slots = Vector(100, 200, 275, 325, 400)

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

22 / 27
Cache

Consistent hashing: по-взрослому

Consistent hashing: по-взрослому

http://docs.basho.com/riak/1.1.4/references/
appendices/concepts/#Clustering 16 сентября 2013 г. 23 / 27
Цесько В. А. (CompSciCenter)
Hash & Cache
Cache

Consistent hashing: репликация

Consistent hashing: репликация

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

24 / 27
Cache

Проблема: Перезапуск кластера

Проблема: Перезапуск кластера

Причины
In-memory ⇒ пустой кэш ⇒ БД «ложится»
Решения
«Разогрев»
Persistent storage

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

25 / 27
Cache

Redis: Persistent Key-Value Storage

Redis: Persistent Key-Value Storage
http://www.redis.io/
Наиболее популярный Key-Value Storage2
Используется в GitHub, Disqus, Pinterest,
Stackoverlow, Flickr, Blizzard, Instagram, Twitter
Key-Value, but Value: String, List, Set,
SortedSet, Hash
In-memory and/or Snapshots and/or Commit Logs
Single-threaded by design + Master-slave
Опционально LRU и/или TTL
Очень богатый API3
2
3

http://db-engines.com/en/ranking/key-value+store
http://redis.io/commands

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

26 / 27
Вопросы?

Вопросы?

http://incubos.org/contacts/
Общие вопросы — в Twitter: @incubos
Вопросы по лекциям — в комментариях:
http://incubos.org/blog/
Частные вопросы — в почту
vadim.tsesko@gmail.com

Цесько В. А. (CompSciCenter)

Hash & Cache

16 сентября 2013 г.

27 / 27

Más contenido relacionado

La actualidad más candente

Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
Vadim Tsesko
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Ontico
 
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
Ontico
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Alexey Lesovsky
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
Ontico
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Ontico
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
Ontico
 

La actualidad más candente (20)

Haystack
HaystackHaystack
Haystack
 
Technopolis.NoSQL 03 Cassandra
Technopolis.NoSQL 03 CassandraTechnopolis.NoSQL 03 Cassandra
Technopolis.NoSQL 03 Cassandra
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
DNS в условиях хостинг-провайдера / Константин Новаковский (Selectel)
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
 
SOA: строим свой service mesh / Иван Круглов (Booking.com)
SOA: строим свой service mesh / Иван Круглов (Booking.com)SOA: строим свой service mesh / Иван Круглов (Booking.com)
SOA: строим свой service mesh / Иван Круглов (Booking.com)
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
 
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
Тюним память и сетевой стек в Linux: история перевода высоконагруженных серве...
 
Класс!ная Cassandra
Класс!ная CassandraКласс!ная Cassandra
Класс!ная Cassandra
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 

Destacado

Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
Vadim Tsesko
 
Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
Vadim Tsesko
 
Multidimensional indexing
Multidimensional indexingMultidimensional indexing
Multidimensional indexing
Vadim Tsesko
 
Базы данных. ZooKeeper
Базы данных. ZooKeeperБазы данных. ZooKeeper
Базы данных. ZooKeeper
Vadim Tsesko
 
Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
Vadim Tsesko
 

Destacado (13)

Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
 
Базы данных. Distributed Commit
Базы данных. Distributed CommitБазы данных. Distributed Commit
Базы данных. Distributed Commit
 
Actor model
Actor modelActor model
Actor model
 
Базы данных. HDFS
Базы данных. HDFSБазы данных. HDFS
Базы данных. HDFS
 
Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
 
YoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.ВертикаляхYoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.Вертикалях
 
Multidimensional indexing
Multidimensional indexingMultidimensional indexing
Multidimensional indexing
 
Базы данных. ZooKeeper
Базы данных. ZooKeeperБазы данных. ZooKeeper
Базы данных. ZooKeeper
 
Фреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в ЯндексеФреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в Яндексе
 
Actor model
Actor modelActor model
Actor model
 
Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
 
Actor model. Futures & Promises. Reactive Streams.
Actor model. Futures & Promises. Reactive Streams.Actor model. Futures & Promises. Reactive Streams.
Actor model. Futures & Promises. Reactive Streams.
 
Потоковая фильтрация событий
Потоковая фильтрация событийПотоковая фильтрация событий
Потоковая фильтрация событий
 

Similar a Базы данных. Hash & Cache

Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Ontico
 
Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008
Ontico
 
Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008
Ontico
 
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleЗачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Yandex
 
02062022_ASH_Bazgutdinov_FORS.pdf
02062022_ASH_Bazgutdinov_FORS.pdf02062022_ASH_Bazgutdinov_FORS.pdf
02062022_ASH_Bazgutdinov_FORS.pdf
cookie1969
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
Yandex
 
Лекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицыЛекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицы
Mikhail Kurnosov
 
Cache2012 administrationbasics
Cache2012 administrationbasicsCache2012 administrationbasics
Cache2012 administrationbasics
Denis Pavlov
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
rit2011
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
Alex Tutubalin
 

Similar a Базы данных. Hash & Cache (20)

Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский) Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
Как построить высокопроизводительный Front-end сервер (Александр Крижановский)
 
Исследование работы Кэш-памяти центрального процессора
Исследование работы Кэш-памяти центрального процессораИсследование работы Кэш-памяти центрального процессора
Исследование работы Кэш-памяти центрального процессора
 
Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008Smirnov Memcached High Load 2008
Smirnov Memcached High Load 2008
 
Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008Smirnov Memcached Highload 2008
Smirnov Memcached Highload 2008
 
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyleЗачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
Зачем нужны постпроцессоры при живых препроцессорах — Алексей Иванов, JetStyle
 
02062022_ASH_Bazgutdinov_FORS.pdf
02062022_ASH_Bazgutdinov_FORS.pdf02062022_ASH_Bazgutdinov_FORS.pdf
02062022_ASH_Bazgutdinov_FORS.pdf
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»Егор Львовский — «Кеширование на клиенте и сервере»
Егор Львовский — «Кеширование на клиенте и сервере»
 
Лекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицыЛекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицы
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Cache2012 administrationbasics
Cache2012 administrationbasicsCache2012 administrationbasics
Cache2012 administrationbasics
 
Cloud Haskell. Александр Вершилов
Cloud Haskell. Александр ВершиловCloud Haskell. Александр Вершилов
Cloud Haskell. Александр Вершилов
 
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
распределенное файловое хранилище (Nginx, zfs, perl). перепелица мамонтов. зал 2
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryИнтервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Масштабирование сервисов с помощью Apache Mesos
Масштабирование сервисов с помощью Apache MesosМасштабирование сервисов с помощью Apache Mesos
Масштабирование сервисов с помощью Apache Mesos
 
Scaling services with apache mesos (and docker)
Scaling services with apache mesos (and docker)Scaling services with apache mesos (and docker)
Scaling services with apache mesos (and docker)
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Кеширование. Api. http 1.1 (rfc 2616)
Кеширование. Api. http 1.1 (rfc 2616)Кеширование. Api. http 1.1 (rfc 2616)
Кеширование. Api. http 1.1 (rfc 2616)
 

Базы данных. Hash & Cache

  • 1. Hash & Cache Курс «Базы данных» Цесько Вадим Александрович http://incubos.org @incubos Computer Science Center 16 сентября 2013 г. Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 1 / 27
  • 2. Содержание 1 Hash 2 Cache Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 2 / 27
  • 3. Hash Коллекции: сложность операций Коллекции: сложность операций ArrayList: get(): O(1) insert(): O(n) delete(): O(n) append(): O(1) / O(n) LinkedList: get(): O(n) insert(): O(n) delete(): O(n) append(): O(1) Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 3 / 27
  • 4. Hash Как ещё быстрее? Как ещё быстрее? Hash table Ассоциативный массив, отображающий ключи в значенияa : 1 С помощью хэш-функции от ключа находим индекс в массиве bucket’ов 2 Перебираем ключи в найденном bucket’е до совпадения 3 Извлекаем значение a http://en.wikipedia.org/wiki/Hash_table Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 4 / 27
  • 5. Hash Пример Пример Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 5 / 27
  • 6. Hash Hash table: сложность операций Hash table: сложность операций get(): O(1) insert(): O(1) delete(): O(1) append(): O(1) Допущения При равномерной функции хэширования Без учёта ребалансировки Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 6 / 27
  • 7. Hash Подводные камни Подводные камни Выбор функции хэширования Разрешение коллизий: Separate chaining — лишняя память, CPU cache misses Open addressing — элементов не больше 70% размера массива, CPU cache pollution Resize & rehash Concurrency Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 7 / 27
  • 8. Hash Материалы Материалы java.util.HashMap java.util.concurrent.ConcurrentHashMap http://en.wikipedia.org/wiki/Hash_table Chris Okasaki. Purely Functional Data Structures1 1 http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 8 / 27
  • 9. Cache Классические архитектуры Web-приложений Классические архитектуры Web-приложений Как взаимодействуют с хранилищами Какие проблемы пытаются решить Каким образом Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 9 / 27
  • 10. Cache Трёхзвенный клиент-сервер Трёхзвенный клиент-сервер Зачем нужен Server: Преобразование форматов Логика: проверить, посчитать, ... Гибкость Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 10 / 27
  • 11. Cache Нагрузка растёт Нагрузка растёт Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 11 / 27
  • 12. Cache Нагрузка ещё больше Нагрузка ещё больше Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 12 / 27
  • 13. Cache Что такое cache Что такое cache Cache Реализация in-memory concurrent hash table с некоторыми особенностями. 1 2 def process(request: Request): Response = { implicit val timeout = Timeout(50 milliseconds) 3 cache.get(request) .getOrElse({ val response = buildResponse(request) cache.put(request, response) response }) 4 5 6 7 8 9 10 } Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 13 / 27
  • 14. Cache Анализ cache per server Анализ cache per server Достоинства Снизили нагрузку на CPU и БД (если нормальный cache hit ratio) Недостатки В каждом cache одинаковые значения «Лишние» вычисления (нагрузка на CPU) Ограниченный размер каждого cache Получили спектр проблем с апгрейдом системы Нужны политики «протухания» и вытеснения Нужно «прогревать» кэш или перезапускать сервера постепенно Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 14 / 27
  • 15. Cache Distributed cache Distributed cache Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 15 / 27
  • 16. Cache Первый подход к снаряду Первый подход к снаряду 1 2 3 class Cache { val servers = Vector("cache01.yandex.net", "cache02.yandex.net") 4 protected def lookup(key: AnyVal): String = servers(key.hashCode() % servers.length) 5 6 7 def get(key: AnyVal) = remoteGet(lookup(key)) 8 9 10 def put(key: AnyVal, value: Array[Byte]) = remotePut(lookup(key), value) 11 12 13 } Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 16 / 27
  • 17. Cache Анализ distributed cache Анализ distributed cache Достоинства Считаем всё (примерно) один раз Больше суммарный объём Больше влезет значений Недостатки Остался спектр проблем с апгрейдом системы Нужны политики «протухания» (TTL) и вытеснения (LRU) Нужно «прогревать» кэш Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 17 / 27
  • 18. Cache Memcached Memcached http://www.memcached.org/ Разработан для LiveJournal в 2002 Используется в YouTube, Flickr, Reddit, Facebook, Orange, Twitter, Tumblr, Wikipedia, Yandex Входит в Google App Engine, Windows Azure, Amazon Web Services In-memory Ключ — строка (до 250 байт) Многопоточный + libevent LRU + TTL (up to 30 days) Простой текстовый и бинарный протокол: set, add, replace, append, prepend, get, delete, ... Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 18 / 27
  • 19. Cache Проблема: Изменение кластера memcached Проблема: Изменение кластера memcached Причины Список серверов в клиенте Количество серверов в hash-функции Решения Сервис-proxy перед memcached Consistent hashing Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 19 / 27
  • 20. Cache Сервис-proxy Сервис-proxy Функции: Слушает клиентский порт Хэширует ключ и проксирует запрос Держит соединения ко всем экземплярам cache Недостатки +1 сетевой hop Весь трафик через одну точку SPOF Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 20 / 27
  • 21. Cache Consistent hashing Consistent hashing Определение When a hash table is resized and consistent hashing is used, only K /n keys need to be remapped on average, where K is the number of keys, and n is the number of slotsa . a http://en.wikipedia.org/wiki/Consistent_hashing Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 21 / 27
  • 22. Cache Consistent hashing: своими руками Consistent hashing: своими руками Будем отображать ключи в слоты, а затем слоты на машины: 1 val slots = Vector(100, 200, 300, 400) 2 3 4 5 6 def slot(key: AnyVal): Int = { val hash = key % slots.last slots.indexWhere(hash < _) } Если переполняется слот 200-299, то подвигаем: 1 val slots = Vector(100, 200, 275, 325, 400) Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 22 / 27
  • 23. Cache Consistent hashing: по-взрослому Consistent hashing: по-взрослому http://docs.basho.com/riak/1.1.4/references/ appendices/concepts/#Clustering 16 сентября 2013 г. 23 / 27 Цесько В. А. (CompSciCenter) Hash & Cache
  • 24. Cache Consistent hashing: репликация Consistent hashing: репликация Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 24 / 27
  • 25. Cache Проблема: Перезапуск кластера Проблема: Перезапуск кластера Причины In-memory ⇒ пустой кэш ⇒ БД «ложится» Решения «Разогрев» Persistent storage Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 25 / 27
  • 26. Cache Redis: Persistent Key-Value Storage Redis: Persistent Key-Value Storage http://www.redis.io/ Наиболее популярный Key-Value Storage2 Используется в GitHub, Disqus, Pinterest, Stackoverlow, Flickr, Blizzard, Instagram, Twitter Key-Value, but Value: String, List, Set, SortedSet, Hash In-memory and/or Snapshots and/or Commit Logs Single-threaded by design + Master-slave Опционально LRU и/или TTL Очень богатый API3 2 3 http://db-engines.com/en/ranking/key-value+store http://redis.io/commands Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 26 / 27
  • 27. Вопросы? Вопросы? http://incubos.org/contacts/ Общие вопросы — в Twitter: @incubos Вопросы по лекциям — в комментариях: http://incubos.org/blog/ Частные вопросы — в почту vadim.tsesko@gmail.com Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 27 / 27