36
© Copyright 2014 Andrey Smirnov Как работают системы хранения данных? Хранение - на диске. Давайте напишем свою!

Курс высокие нагрузки и надежность: отрывок

Embed Size (px)

DESCRIPTION

Разработка надёжных высоконагруженных систем Москва, 24, 25 и 26 мая http://smira.highload.ru/ Трехдневный мастер-класс с практическими заданиями

Citation preview

Page 1: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Как работают системы хранения данных?

• Хранение - на диске.

• Давайте напишем свою!

Page 2: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Файловая система• Почему не система хранения данных?

• В плюсах:

• почти ничего не надо писать

• конкурентный доступ из разных приложений❔

• переносимость

• инструменты

• производительность

• Почему тогда не используется?

Page 3: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Простая плоская структураkey: len + chars

value: len + chars

key: len + chars

value: len + chars

key: len + chars

value: len + chars

….

Page 4: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Как это работает?

• Как будут добавляться записи?

• Как удаляться?

• Как изменить значение?

• Как прочитать значение по ключу?

Page 5: Курс высокие нагрузки и надежность: отрывок

?© Copyright 2014 Andrey Smirnov

Что можно изменить, чтобы структура работала лучше?

Page 6: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Улучшения

• Отсортировать записи

• Флаг удаленности

• Индекс в отдельном файле

• Хэш-структура на диске

Page 7: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Проблемы ввода-вывода

• random IO

• block size/alignment

• буферы ОС/sync

Page 8: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Page 9: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Что делать?

• Страничный ввод-вывод

• Последовательный ввод-вывод (append-only)

Page 10: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Log-Structured Merge-Tree

С0

С1

merge

Page 11: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

LevelDBmemtable Log

Level 0

SST

SSTSST

Level 1

Level 2

SST SST SST

SSTSST SST SST SST …

Level 3

Page 12: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

LevelDB• memtable - в памяти, только последние операции, ограничено в размере

• Log - для восстановления memtable

• SST - отсортированные ключ-значения, неизменяемый

• Level-0 - возможно пересечение

Page 13: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

LevelDB• Level1-LevelN: 10^L MB

• Level1-LevelN: непересекающие ключи

• Маркеры удаления

• Level0 ⇛ N: “молодые” ключи ⇛ “старые” ключи

• Сжатие: Snappy

Page 14: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Compaction: Level-0

Level 0

SST

SSTSST

Level 1

Level 2

SST SST SST

SSTSST SST SST SST

Level 3

Page 15: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Compaction: Level-0

Level 0

SST

SSTSST

Level 1

Level 2

SST SST SST

SSTSST SST SST SST

Level 3

SST

Page 16: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Compaction: Level-1+

Level 0

SST

SSTSST

Level 1

Level 2

SST SST SST

SSTSST SST SST SST

Level 3

SST

Page 17: Курс высокие нагрузки и надежность: отрывок

?© Copyright 2014 Andrey Smirnov

Как выполнить слияние эффективно? !Чем ограничен объем данных при слиянии?

Page 18: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Типовые операции

• Поиск

• Вставка

• Удаление

Page 19: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

SSTdata block 0data block 1

…data block Nindex block 0index block 1

…index block N

keyvaluekey

value

bloom filter

last_keyoffset

last_keyoffset

Page 20: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Кто использует LevelDB

• Google BigTable (родоначальник)

• WebKit: LocalStorage

• Riak: LevelDB

• HyperDex: HyperLevelDB

• …

Page 21: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Ввод-вывод

• Только последовательная запись

• Можем записать одно значение несколько раз в процессе слияний

• Чтение - потенциальный поиск по уровням

Page 22: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Bloom Filter

Page 23: Курс высокие нагрузки и надежность: отрывок

?© Copyright 2014 Andrey Smirnov

Для чего еще может пригодиться bloom filter?

Page 24: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Страничный ввод-вывод

• Страница - основная единица ввода-вывода

• Размер страницы - несколько килобайт

• Оптимизация ввода-вывода за счет более крупных блоков

• Страница содержит данные (или индексы)

Page 25: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Buffer Pool

0 1

11 12

2 3

13 14

4 5

15 16

6 7

17 18

8 9

19 20

10

21

Диск

Память

dirty dirty

Page 26: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Buffer Pool

• Кеш диска (уменьшает чтение)

• Кеш записи (уменьшает запись)

• Свойство локальности/Working set

• Что если отказ?

Page 27: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Write Ahead Log

0 1

8 9

2 3

10 11

4 5

12 13

6 7

14 15

dirty dirty

buffer pool

WAL

Операция записи

Диск

1

2

Page 28: Курс высокие нагрузки и надежность: отрывок

?© Copyright 2014 Andrey Smirnov

Почему в WAL запись идет в первую очередь?

Page 29: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Crash Recovery

0 1

8 9

2 3

10 11

4 5

12 13

6 7

14 15

WAL

Диск

replay

Page 30: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Snapshot

0 1

8 9

2 3

10 11

4 5

12 13

6 7

14 15

buffer pool

WAL

Диск

Snapshot

Page 31: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Buffer Flusher

0 1

8 9

2 3

10 11

4 5

12 13

6 7

14 15

dirty dirty

buffer pool

Диск

buffer flusher

≤50% dirty

Page 32: Курс высокие нагрузки и надежность: отрывок

?© Copyright 2014 Andrey Smirnov

Какие dirty страницы следует сбросить в первую очередь? !А какие не-dirty страницы?

Page 33: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

Примеры использования

• BerkleyDB

Page 34: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

HDD vs. SSD

Page 35: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

HDD

• Seek time (3-15ms)

• Rotational delay (3-4ms)

• Transfer

• 70-200 random IOPS

Page 36: Курс высокие нагрузки и надежность: отрывок

© Copyright 2014 Andrey Smirnov

SSD• Read-Erase-Write

• Blocks, pages

• Over-provisioning

• Write amplification

• > 5000 IOPS