View
767
Download
3
Category
Preview:
DESCRIPTION
Обсуждаем здесь: http://incubos.org/posts/2013/09/16/db/
Citation preview
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 Извлекаем значениеahttp://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 missesOpen addressing — элементов не больше 70% размерамассива, CPU cache pollution
Resize & rehashConcurrency
Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 7 / 27
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
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 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
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 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
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 ServicesIn-memoryКлюч — строка (до 250 байт)Многопоточный + libeventLRU + TTL (up to 30 days)Простой текстовый и бинарный протокол: set,add, replace, append, prepend, get, delete, ...
Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 18 / 27
Cache Проблема: Изменение кластера memcached
Проблема: Изменение кластераmemcached
ПричиныСписок серверов в клиентеКоличество серверов в hash-функции
РешенияСервис-proxy перед memcachedConsistent 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 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
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
Cache Consistent hashing: по-взрослому
Consistent hashing: по-взрослому
http://docs.basho.com/riak/1.1.4/references/appendices/concepts/#ClusteringЦесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 23 / 27
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, 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
Вопросы?
Вопросы?
http://incubos.org/contacts/Общие вопросы — в Twitter: @incubosВопросы по лекциям — в комментариях:http://incubos.org/blog/Частные вопросы — в почтуvadim.tsesko@gmail.com
Цесько В. А. (CompSciCenter) Hash & Cache 16 сентября 2013 г. 27 / 27
Recommended