А. Аксенов "Как устроен NoSql", DUMP-2014
description
Transcript of А. Аксенов "Как устроен NoSql", DUMP-2014
![Page 1: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/1.jpg)
Как устроен NoSQL
Андрей Аксёнов, http://sphinxsearch.com/Екатеринбург, ДАМП 2014
![Page 2: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/2.jpg)
Disclaimer• Ремикс двух докладов с Highload 2013• Константин Осипов, “Популярные алгоритмы
хранения данных на диске”• Mark Callaghan, “MySQL vs something else:
evaluating alternative databases”
• Ничего нового, всё скучно• Только набор ключевых слов, всё крайне
поверхностно (иначе нельзя)• Уходите сразу
![Page 3: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/3.jpg)
![Page 4: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/4.jpg)
![Page 5: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/5.jpg)
![Page 6: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/6.jpg)
![Page 7: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/7.jpg)
Зачем этот доклад?• Пропаганда и разжигание• Алгоритмический фундаментализм
![Page 8: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/8.jpg)
Зачем этот доклад?• Пропаганда и разжигание• Алгоритмический фундаментализм• НЕ помогу выбрать базу – бенчмаркай сам• НЕ расскажу про спецграбли – невозможно• НЕ буду ничего сравнивать – бессмысленно• Попробую (попробую) сделать обзор
фундамента, на котором Всё Стоит• В объеме своего непонимания!!!
![Page 9: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/9.jpg)
Про термины• Строки == документы == объекты == …• Колонки == поля == значения == …• Point/range lookup/read• Point, WHERE id=123• Range, WHERE price>=100 AND price<=500
• CSV, SQL, XML, JSON, WTF… а суть одна – документы и их части
![Page 10: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/10.jpg)
Структуры данных• Как хранятся собственно данные?• Как хранятся индексы?• Какая базовая СД хранилки• Какой внутри нее (!) формат строки?• Во что выливаются чтения, во что записи?• Как СДХ, ФС ложатся на типичные для нашей системы запросы?
![Page 11: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/11.jpg)
Про данные• Структура хранения?• Одинаковая ли в памяти, на диске?• Отдельные строки, линейный файл• Отдельные строки, B- или B+дерево• Отдельные (сжатые) колонки, линейный файл• Сжатые вместе блоки строк, линейный файл• Сжатые наборы частей строк, блочный файл• …и еще что угодно
![Page 12: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/12.jpg)
Про данные• Формат строки (если есть)?• NB, не связано со структурой хранения!• Можно положить JSON в .MYD? Конечно.• Можно положить BSON в .ibd? Разумеется.
• Ключевой выбор строчной хранилки?• Схема снаружи (и некий бинарный формат)• Схема внутри (и далее JSON, BSON, XML, ASN.1,
MessagePack, что угодно ещё)
![Page 13: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/13.jpg)
Про данные, NoSQL revolution!• Было как-то общепринято• Plain file• B-tree
• Стало еще вдобавок• LSM, Log Structured Merge• Bitcask, “Log Structured Hash Table”• Column-based
• LZO, LZ4, snappy, …
![Page 14: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/14.jpg)
Про данные, NoSQL revolution!• Было как-то общепринято• Plain file 1937• B-tree 1972
• Стало еще вдобавок• LSM, Log Structured Merge 1996• Bitcask, “Log Structured Hash Table” 2010• Column-based 1969!!!
• LZO, LZ4, snappy, … 1996
![Page 15: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/15.jpg)
![Page 16: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/16.jpg)
Про индексы, NoSQL revolution!• Было как-то общепринято• B-tree
• Стало еще вдобавок• LSM + Bloom (псевдоиндекс по PK)• Fractal trees (LSM + forward pointer???)• Column-based (псевдоиндекс по колонке)
![Page 17: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/17.jpg)
Про мишуру, NoSQL revolution!• Было как-то общепринято• Фиксированные схемы, реляционная модель• Нормализация, JOIN• SQL синтаксис
• Стало еще вдобавок• Отсутствие схем, сплошной JSON• Денормализация, шардинг• REST, JSON синтаксис запросов
![Page 18: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/18.jpg)
Индексы, сука, ВАЖНО• Point lookup (aka read)
SELECT * … WHERE id=123• Range lookup
SELECT * … WHERE price>100 AND price<200• Аналитика
SELECT AVG(salary) FROM emp• Нету индексов – привет, полный перебор• Даже для аналитики – строки vs индекс
![Page 19: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/19.jpg)
Как устроено B-tree?• Дерево из больших (8..64K) страничек• В узлах – тысячи пар key, offset• В листах – единицы...тысячи пар key, value• Разные стратегии апдейта (UIP, COW-R/S)
• Value – либо сама строка, либо rowptr• Для данных – и то, и другое• Для индексов – только rowptr
![Page 20: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/20.jpg)
Как устроены LSM/SSTable?• Sorted runs, сортированные по PK строки• Необязательно один “файл”, может, куча
• C0 / Memtable – sorted run в памяти• C1 / L0, L1, L2, …, Lmax – sorted run на диске• Разные стратегии про размер, слияния
• Новая строка -> mem -> L0 -> L1 -> ….• Постоянное слияние, merge
![Page 21: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/21.jpg)
![Page 22: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/22.jpg)
Про тов.Bloom• F{ключ} -> { сразу нет, может быть }• Чем больше бит/ключ, тем точнее, ~10 ок• Дико таращит для point lookups• Совсем не помогает для range lookups
![Page 23: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/23.jpg)
Чем отличются Btree, LSM based?• Тащемта стратегиями записи (!!!)• InnoDB = Btree, UIP• LMDB = Btree, COW-S• LevelDB, Cassandra = LSM, leveled compact• mem, L0, …, Lmax; 10x на шаг
• Hbase, Cassandra = LSM, n-files compact• mem, L0, L1; N файлов 1..32 гб в L0; 64 гб L1
• Sophia, MaSM, TokuDB, …
![Page 24: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/24.jpg)
Как устроен Bitcask?• Log-only, строки постоянно дописываются
“в конец” (текущий активный лог-файл)• Кольцевой буфер логов, сборка мусора• Отдельная “карта” ключей (PK)• Все ключи – всегда в памяти• В терминах RDB – это PK индексы
![Page 25: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/25.jpg)
![Page 26: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/26.jpg)
Как устроены column based?• Строк в общем случае вообще нету• Хранятся отдельные колонки, пожато• SELECT * WHERE id=X довольно ужасен• Потому что в пределе num_cols IO
• SELECT a,b,c WHERE d иногда прекрасен• Когда селективность d все равно плохая• Когда колонок много• Когда сжатие хорошее
![Page 27: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/27.jpg)
Когда Тагил рулит• 1 тупое целое число в колонке• RDB, NoSQL = 4 байта• Columnar = 0.016 байт … 4 байта• RLE, 0x01 | 0xAB …• PFD, 0x02 | 11 01 10 10b | 00b 00b 11b 10b …• GVI, 0x01 | 0x34 0x12 | 0x56 | 0x78 | 0x9A• И еще куча клёвых интересных техник
![Page 28: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/28.jpg)
Итого, как хранятся строки?• Классика, тупо подряд в файле• Классика, B-tree• Классика, не хранятся совсем (колонки)
• ПРОРЫВ, отсортировано в файле по PK!!!• И еще немножечко сжато, может быть
![Page 29: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/29.jpg)
Итого, как хранятся индексы?
• Классика, B-tree• Классика, не хранятся совсем (колонки)
• ПРОРЫВ, отсортировано в файле по PK!!!• И еще немножечко Bloom filter
![Page 30: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/30.jpg)
Мощный обман NoSQL• Ура, больше нету ALTER, все динамично!!!• Ура, можно забить на проектирование!!!
• Ой, это только для хранения• Ой, а оно теперь жрет диск, как из пушки• Ой, все равно CREATE INDEX• Ой, все равно обновлять индекс стоит денег• Ой, все равно проектировать-то надо
![Page 31: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/31.jpg)
Так говоришь, как будто всё плохо!• Ну, плохо всё, но не всё-всё-всё • LSM итп таки обеспечивают• Быстрые записи, append only (как MyISAM)• Быстрые PK point, range (вдобавок)
• Важно, что неявный PK индекс тут один• Важно, что хранилка != формат• Важно, что другие индексы = тот же Btree…• …либо поколоночное хранение
![Page 32: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/32.jpg)
Так говоришь, как будто всё плохо!• Поколоночные индексы таки обеспечивают• Медленные записи, если вдруг сдуру онлайн• Медленные PK point, range• (Очень) эффективное хранение, (очень)
быстрый “перебор” отдельных колонок• Однако, фактически write-once, без
обновлений
![Page 33: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/33.jpg)
Эффекты “усиления”• Read, write, space amplification• “Сколько байт пишем на 1 измененный”• 1?• А что насчет WAL?• А что насчет заполненности страничек?• А как это работает в железе?• А какой размер сектора?
![Page 34: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/34.jpg)
![Page 35: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/35.jpg)
• Mark Callaghan, Highload 2013
![Page 36: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/36.jpg)
Это слайд-заглушка• Вышли мыши как-то раз• Разузнать, который час• Раз, два, три, четыре!• Мыши дёрнули за гири!• Вдруг раздался страшный звон:• PON, PATA, PATA-PON!!!
• …ну не успел я, не успел
![Page 37: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/37.jpg)
А где нови клёви JSON итп?!• Синтаксис – ничто, семантика – все!• SQL, XML, JSON, Put, Get, txt, wtf…• …• Point read, range read, full scan, etc!!!
![Page 38: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/38.jpg)
Итого• Данные научились хранить в LSM, cols, жать• А индексы все равно типично Btree!!!• Резкий key => value это мило, но не панацея
• Знай, как устроено• Понимай, как может исполниться запрос• Планируй и выбрай соответственно• Ну то есть... как обычно!!!
![Page 39: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/39.jpg)
Вопросы?(Можно подумать, я уложусь в 40 мин.)
![Page 40: А. Аксенов "Как устроен NoSql", DUMP-2014](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c522924a79592b6d8b45b1/html5/thumbnails/40.jpg)