Highload: специализированные высокопроизводительные...

Preview:

DESCRIPTION

Highload: высокопроизводительные специализированные индексы. Мотивация, алгоритмическая основа, готовые решения

Citation preview

Специализированные высокопроизводительные

индексыЕгоров Павел

СКБ Контур, Екатеринбургhttp://skbkontur.ru

1. Почему SQL – отстой? :-)2. Типовые задачи

3. Алгоритмы и структуры данных: решение типовых задач

4. «Все уже украдено до нас!»5. Что осталось за кадром?

+ Structured Query Language+ Атомарность и изоляция+ Контроль целостности

Купить более крутую железякуПотом ещё круче!И ещё…

Радикальное упрощение запросовШардинг

• Structured Query Language• Атомарность и изоляция• Контроль целостности

• Structured Query Language• Атомарность и изоляция• Контроль целостности

Следующие / предыдущие 10

только от Васитолько важноеза период времени

Последние 10

Over 9000

Что могут деревья поиска?

• Search, Add, RemoveO(log N)

• Итерирование в порядке возрастанияпереход на следующий элемент – O(1)

• Порядковый номер ключаO(log N)

Что понадобится нам?

Insert(item)Delete(item)

GetRange(first, last, count)GetCount(first, last)

Показать последние 10

GetRange(new Key(userId, DateTime.MaxValue, Guid.MaxValue),new Key(userId, DateTime.MinValue, Guid.MinValue), 10)

Показать 10 предшествующих X

GetRange(new Key(userId, X.Timestamp, X.ItemId),new Key(userId, DateTime.MinValue, Guid.MinValue), 10)

…пришедших от Васи

GetRange(new Key(userId, vasya.Id, DateTime.Max, Guid.Max),new Key(userId, vasya.Id, DateTime.Min, Guid.Min), 10);

Важные, от Васи, с понедельника по пятницу

GetRange(new Key(userId, vasyaId, Priority.High,

friday, Guid.Min),new Key(userId, vasyaId, Priority.High,

monday, Guid.Max)10);

От Васи, Пети, и Кати

GetRange(... vasyaId ..., M).Union (GetRange(... petyaId ..., M).Union(

GetRange(... katyaId ..., M))).OrderBy(k => k.Timestamp).Take(M);O(A * M * log N) А можно ли эффективнее?

HEAP

• Вставка – O(log N)• Извлечение минимального элемента O(log N)

IEnumerable<Key> GetRange (string author);

var heap = new Heap<IEnumerator<Key>>();foreach(var a in authors)

heap.Add(GetRange(a).GetEnumerator()); for(int j=0; j<M; j++){

var i = heap.ExtractRoot(); yield return i.Current; if (i.MoveNext())

heap.Add(i);}

O(A * log N + M * log A)

было O(A * M * log N)

Все уже украдено до нас!BerkeleyDB

db = BTreeDatabase.Open(“dbFile”, “dbName”, cfg);

using (var cur = db.Cursor(…)) {if (cur.Move(new DatabaseEntry(keyBytes), true))

return true;} return false;

Все уже украдено до нас!Cassandra

SlicePredicate: start, finish, count, reversedclient.multiget_slice(… slicePredicate …)

+ масштабируемость+ шардинг+ …

Cassandra

Под капотом: деревья в памяти + SSTables на диске

Web site:http://cassandra.apache.org/

Все уже украдено до нас!

Составные индексы SQL :-)

Что осталось за кадром

Надежное хранениеМасштабированиеОтказоустойчивостьШардингКак жить с отложенной консистентностью?…

Общая картинка

Тут была импровизация с рисованием маркерами на доске :-)

Я рассказал о том, как все устроено в целом, как взаимодействую индексы и хранилище и т.п.

Общая картинка

Есть ещё одна презентация, немного раскрывающая тему общей картинки:

http://www.slideshare.net/xoposhiy/highload-dump-2011

Конец!

Павел ЕгоровСКБ Контур, Екатеринбург

pe@skbkontur.rutwitter.com/xoposhiy

Recommended