highload. Создание специализированных...
DESCRIPTION
По материалам конференции .NET разработчиков - www.dotnetconf.ruTRANSCRIPT
Специализированные высокопроизводительные
индексыЕгоров Павел
СКБ Контур, Екатеринбургhttp://skbkontur.ru/career/vacancies
3-я конференция .NET разработчиков25 сентября 2011
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,
monday, Guid.Min),new Key(userId, vasyaId, Priority.High,
friday, 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; k++){
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;
Berkeley DB
Под капотом B+Tree (или Hash)Whitepaper: http://
www.usenix.org/event/usenix99/full_papers/olson/olson.pdf
Web site: http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html
Все уже украдено до нас!Cassandra
SlicePredicate: start, finish, count, reversedclient.multiget_slice(… slicePredicate …)
+ масштабируемость+ шардинг+ …
Cassandra
Под капотом: деревья в памяти + SSTables на диске
Web site:http://cassandra.apache.org/
Все уже украдено до нас!
Составные индексы SQL :-)
Что осталось за кадром
Надежное хранениеМасштабированиеОтказоустойчивостьШардингКак жить с отложенной консистентностью?…