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

27
Hash & Cache Курс Базы данных Цесько Вадим Александрович http://incubos.org @incubos Computer Science Center 16 сентября 2013 г. Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 1 / 27

description

Обсуждаем здесь: http://incubos.org/posts/2013/09/16/db/

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

Page 1: Базы данных. Hash & Cache

Hash & CacheКурс «Базы данных»

Цесько Вадим Александровичhttp://incubos.org

@incubos

Computer Science Center

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 1 / 27

Page 2: Базы данных. Hash & Cache

Содержание

1 Hash

2 Cache

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 2 / 27

Page 3: Базы данных. Hash & Cache

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

Page 4: Базы данных. Hash & Cache

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

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

Hash tableАссоциативный массив, отображающий ключи взначенияa:

1 С помощью хэш-функции от ключа находиминдекс в массиве bucket’ов

2 Перебираем ключи в найденном bucket’е досовпадения

3 Извлекаем значениеahttp://en.wikipedia.org/wiki/Hash_table

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 4 / 27

Page 5: Базы данных. Hash & Cache

Hash Пример

Пример

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 5 / 27

Page 6: Базы данных. Hash & Cache

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

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

get(): O(1)insert(): O(1)delete(): O(1)append(): O(1)

ДопущенияПри равномерной функции хэшированияБез учёта ребалансировки

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 6 / 27

Page 7: Базы данных. Hash & Cache

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

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

Выбор функции хэшированияРазрешение коллизий:

Separate chaining — лишняя память, CPU cache missesOpen addressing — элементов не больше 70% размерамассива, CPU cache pollution

Resize & rehashConcurrency

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 7 / 27

Page 8: Базы данных. Hash & Cache

Hash Материалы

Материалы

java.util.HashMapjava.util.concurrent.ConcurrentHashMaphttp://en.wikipedia.org/wiki/Hash_tableChris Okasaki. Purely Functional Data Structures1

1http://www.cs.cmu.edu/~rwh/theses/okasaki.pdfЦесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 8 / 27

Page 9: Базы данных. Hash & Cache

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

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

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 9 / 27

Page 10: Базы данных. Hash & Cache

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

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

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 10 / 27

Page 11: Базы данных. Hash & Cache

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

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 11 / 27

Page 12: Базы данных. Hash & Cache

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

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 12 / 27

Page 13: Базы данных. Hash & Cache

Cache Что такое cache

Что такое cache

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

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

4 cache.get(request)5 .getOrElse({6 val response = buildResponse(request)7 cache.put(request, response)8 response9 })

10 }

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 13 / 27

Page 14: Базы данных. Hash & Cache

Cache Анализ cache per server

Анализ cache per serverДостоинства

Снизили нагрузку на CPU и БД (если нормальныйcache hit ratio)

НедостаткиВ каждом cache одинаковые значения«Лишние» вычисления (нагрузка на CPU)Ограниченный размер каждого cacheПолучили спектр проблем с апгрейдом системыНужны политики «протухания» и вытесненияНужно «прогревать» кэш или перезапускатьсервера постепенно

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 14 / 27

Page 15: Базы данных. Hash & Cache

Cache Distributed cache

Distributed cache

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 15 / 27

Page 16: Базы данных. Hash & Cache

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

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

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

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

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

10

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 16 / 27

Page 17: Базы данных. Hash & Cache

Cache Анализ distributed cache

Анализ distributed cache

ДостоинстваСчитаем всё (примерно) один разБольше суммарный объёмБольше влезет значений

НедостаткиОстался спектр проблем с апгрейдом системыНужны политики «протухания» (TTL) ивытеснения (LRU)Нужно «прогревать» кэш

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 17 / 27

Page 18: Базы данных. Hash & Cache

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 ServicesIn-memoryКлюч — строка (до 250 байт)Многопоточный + libeventLRU + TTL (up to 30 days)Простой текстовый и бинарный протокол: set,add, replace, append, prepend, get, delete, ...

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 18 / 27

Page 19: Базы данных. Hash & Cache

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

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

ПричиныСписок серверов в клиентеКоличество серверов в hash-функции

РешенияСервис-proxy перед memcachedConsistent hashing

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 19 / 27

Page 20: Базы данных. Hash & Cache

Cache Сервис-proxy

Сервис-proxy

Функции:Слушает клиентский портХэширует ключ и проксирует запросДержит соединения ко всем экземплярам cache

Недостатки+1 сетевой hopВесь трафик через одну точкуSPOF

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 20 / 27

Page 21: Базы данных. Hash & Cache

Cache Consistent hashing

Consistent hashing

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

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 21 / 27

Page 22: Базы данных. Hash & Cache

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

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

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

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

3 def slot(key: AnyVal): Int = {4 val hash = key % slots.last5 slots.indexWhere(hash < _)6 }

Если переполняется слот 200-299, то подвигаем:1 val slots = Vector(100, 200, 275, 325, 400)

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 22 / 27

Page 23: Базы данных. Hash & Cache

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

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

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

Page 24: Базы данных. Hash & Cache

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

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 24 / 27

Page 25: Базы данных. Hash & Cache

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

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

ПричиныIn-memory ⇒ пустой кэш ⇒ БД «ложится»

Решения«Разогрев»Persistent storage

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 25 / 27

Page 26: Базы данных. Hash & Cache

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, TwitterKey-Value, but Value: String, List, Set,SortedSet, HashIn-memory and/or Snapshots and/or Commit LogsSingle-threaded by design + Master-slaveОпционально LRU и/или TTLОчень богатый API3

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 26 / 27

Page 27: Базы данных. Hash & Cache

Вопросы?

Вопросы?

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

Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 27 / 27