Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
MyRocks:
Табличный
Движок для
MySQL
Алексей Майков
Сергей Петруня
• Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
• Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
*MySQL is a registered trademark of Oracle Corporation
MyRocks
Размер базы (GB) (Linkbench)
1172
574
InnoDB RocksDB
Megabytes/s written (Linkbench)
150
70
InnoDB RocksDB
Размер базы (GB) (Prod)
(zlib level1
compression)
1089
525.4
InnoDB RockDB
Terabytes written (Prod)
0
4
8
12
InnoDB 2x RocksDB
Flash GC
Binlog / Relay log
Storage engine
Flash read rates (Prod)
• RocksDB > InnoDB * 1.5
• Flash справляется!
Time
RocksDB (2x)
InnoDB
=> 37 Tb
=> 12 Tb
Cumulative Response Times (Prod)
0
50
100
150
200
250
300
< 15ms < 75ms < 250ms < 1000ms
Kilo-Queries
RocksDB x2
InnoDB
CPU Idle (Prod)
Time
InnoDB
2x RocksDB
100%
0%
80%
50-60%
• Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
Ограниченность InnoDB
• B*-treе
• Страничное хранение
– Изменение = запись
страницы
– Сжатие тоже постраничное
amplificati...
Log-Structured Merge (LSM)
MemTableЗапись
Log SST
• Пишем в MemTable+Log
• MemTable → Sorted String Table
MemTable
Log-Structured Merge (LSM)
MemTableЗапись
Log SST
• Пишем в MemTable+Log
• MemTable → Sorted String Table
– Линейная запис...
Log-Structured Merge (LSM)
MemTableЗапись
Log SST
• Пишем в MemTable+Log
• MemTable → Sorted String Table
MemTable
Log-Structured Merge (LSM)
MemTableЗапись
Log SST
• Пишем в MemTable+Log
• MemTable → Sorted String Table
• MemTable #2 → ...
Чтение данных в LSM
MemTable Чтение
Log SST SST
. . .
• Чтение = слияние данных
• Read amplification ↑↑ 
SST
Compaction – слияние SST
SST SST . . .Цели
• Уменьшение числа
SST-файлов
скорость чтения ↑
• Удаление старых версий
записе...
Как делать compaction
• Избегать крайностей
– Редко: слишком много SST
– Часто: большой write amplification
• Работать эфф...
a-b c-g f-k l-q za-b a-b
Leveled compaction
a-c a-f
. . . . . . . . . . . .
b-gL0
L1 a-e f-i j-n o-z
L2 h-k o-r s-w
L5
Mem...
a-ba-b c-g f-k l-q za-b
Leveled compaction
a-c a-f
. . . . . . . . . . . .
b-gL0
L1 a-e f-i j-n o-z
L2 h-k o-r s-w
L5
MemT...
a-b c-g f-k l-q za-b a-b
Leveled compaction
a-c a-f
. . . . . . . . . . . .
b-gL0
L1 a-e f-i j-n o-z
L2 h-k o-r s-w
L5
Mem...
a-b c-g f-k l-q za-b a-b
Leveled compaction
a-c a-f
. . . . . . . . . . . .
b-gL0
L1 a-e f-i j-n o-z
L2 h-k o-r s-w
L5
Mem...
a-b c-g f-k l-q za-b a-b
Leveled compaction
a-c a-f
. . . . . . . . . . . .
b-gL0
L1 a-e f-i j-n o-z
L2 h-k o-r s-w
L5
Mem...
Leveled compaction - выводы
• read amp. <= #L0+5
• Новые изменения сливаются
друг с другом
• write amp. <= 5*level_fanout ...
Log-Structured Merge – выводы
• Уменьшает write amplification
меньше операций записи
• Уменьшает size amplification
размер...
LevelDB – реализация LSM
+ Встраиваемая библиотека на С++
+ Key/value store на LSM
+ Level-ed compaction
+ Open Source
+ Р...
• Форкнули LevelDB
• Добавили
– Multi-threaded Compaction
– Multi-threaded MemTable flush
– Throttling, если compaction не...
• Facebook
• LinkedIn
• Yahoo
• CockroachDB
• DNANexus
• …
Применение
Ограничения RocksDB
• Это key/value store
– Put(key, value), Delete(key)
– Write(WriteBatch)
• Нет
– Отдельных таблиц
– Ти...
create table tbl (
pk int primary key,
...
) engine=RocksDB;
MySQL* + MyRocks=
• Табличный движок для MySQL
• Данные храня...
MyRocks готов к тестам
• SQL-семантика
• Транзакционный
– REPEATABLE READ
– READ COMMITTED
• Поддержка всех типов данных
•...
• Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
Как попробовать
• https://github.com/facebook/mysql-5.6/
• В будущем - в MariaDB (?)
• Присылайте вопросы, баги,
отзывы, и...
Настройки LSM
MemTable
Level 0
Level 1
Level 2
Level 3
File File
File File File
File File File File
File File File File Fi...
Настройки MyRocks
set global rocksdb_default_cf_options
='write_buffer_size=12m;target_file_siz
e_base=1m;max_bytes_for_le...
• Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
Особенности SQL на LSM
• myrockshotbackup
• Сканирование в обратную
сторону.
• Bloom filters для range
scans
• Tombstones ...
myrockshotbackup
• Local server:
set rocksdb_create_checkpoint=
'/data/mysql/backup'
myrockshotbackup | ssh "tar zxf-"
• R...
Сканирование в обратную сторону
• Проблема
– Большой размер блока
– Компрессия
– Читать с конца нельзя
• Решение: Column F...
Bloom filters для range scans
• Читаем из многих источников
• tbl.key=c1
• Во многих SST
ключа с1 нет
• Bloom Filter в
каж...
Bloom filters для range scans
MemTable Чтение
SST SST SST
INDEX ON t1(col1, col2, …)
index_nr col1 col2 …
• tbl.key>10 AND...
Tombstones после DELETE
• DELETE создает tombstones
delete from messages
where date='2015-11-01'
select * from messages
wh...
В MyRocks нет всех фич
• Ограничения
– PRIMARY KEY обязателен
– ‘index only’ не для всех типов данных
– ALTER TABLE медлен...
Выводы
• Табличный движок MyRocks основан на
RocksDB
• Приносит LSM серверного уровня в MySQL
• Решает проблемы write-heav...
Ссылки
• RocksDB Storage Engine for MySQL and MongoDB,
Igor Canadi
https://www.percona.com/live/europe-amsterdam-
2015/ses...
MyRocks
+
MySQL
+ MySQL = MyRocks
Upcoming SlideShare
Loading in …5
×

MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петруня (MariaDB Corporation Ab)

1,264 views

Published on

Facebook использует MySQL в качестве основного хранилища данных. MySQL работает на десятках тысяч серверов в нескольких ЦОДах. В качестве дисков используются Flash-накопители. Они дают большую производительность, но дорогой ценой — MySQL хранит данные на диске в структуре B-tree, которая использует flash-диск неоптимальным образом. В масштабах Facebook'a цена вопроса измеряется миллионами долларов.

Для оптимального использования Flash-дисков в Facebook была разработана библиотека RocksDB. Она основана на LSM-деревьях и оптимизирована для работы в условиях высокой загрузки. Чтобы использовать ее из MySQL, [совместно с MariaDB] был разработан табличный движок — MyRocks.
Данный доклад посвящен RocksDB и MyRocks. Мы расскажем о принципах их работы и преимуществах, как их настраивать, и какие возможны подводные камни.

Авторы доклада — ведущие разработчики MyRocks от Facebook и MariaDB.

RocksDB и MyRocks доступны на GitHub для свободного использования, участие в разработке также приветствуется.

Published in: Engineering
  • Be the first to comment

MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петруня (MariaDB Corporation Ab)

  1. 1. MyRocks: Табличный Движок для MySQL Алексей Майков Сергей Петруня
  2. 2. • Мотивация • Тех. Показатели • Устройство • Как попробовать • Особенности
  3. 3. • Мотивация • Тех. Показатели • Устройство • Как попробовать • Особенности
  4. 4. *MySQL is a registered trademark of Oracle Corporation
  5. 5. MyRocks
  6. 6. Размер базы (GB) (Linkbench) 1172 574 InnoDB RocksDB
  7. 7. Megabytes/s written (Linkbench) 150 70 InnoDB RocksDB
  8. 8. Размер базы (GB) (Prod) (zlib level1 compression) 1089 525.4 InnoDB RockDB
  9. 9. Terabytes written (Prod) 0 4 8 12 InnoDB 2x RocksDB Flash GC Binlog / Relay log Storage engine
  10. 10. Flash read rates (Prod) • RocksDB > InnoDB * 1.5 • Flash справляется! Time RocksDB (2x) InnoDB => 37 Tb => 12 Tb
  11. 11. Cumulative Response Times (Prod) 0 50 100 150 200 250 300 < 15ms < 75ms < 250ms < 1000ms Kilo-Queries RocksDB x2 InnoDB
  12. 12. CPU Idle (Prod) Time InnoDB 2x RocksDB 100% 0% 80% 50-60%
  13. 13. • Мотивация • Тех. Показатели • Устройство • Как попробовать • Особенности
  14. 14. Ограниченность InnoDB • B*-treе • Страничное хранение – Изменение = запись страницы – Сжатие тоже постраничное amplification = Размер на диске Размер данных • Read amplification – устраивает • Write amplification – проблема • Size amplification – проблема. 1 10 20 1 3 5 10 12 17 20 25 12
  15. 15. Log-Structured Merge (LSM) MemTableЗапись Log SST • Пишем в MemTable+Log • MemTable → Sorted String Table MemTable
  16. 16. Log-Structured Merge (LSM) MemTableЗапись Log SST • Пишем в MemTable+Log • MemTable → Sorted String Table – Линейная запись – Плотно, с компрессией. MemTable
  17. 17. Log-Structured Merge (LSM) MemTableЗапись Log SST • Пишем в MemTable+Log • MemTable → Sorted String Table MemTable
  18. 18. Log-Structured Merge (LSM) MemTableЗапись Log SST • Пишем в MemTable+Log • MemTable → Sorted String Table • MemTable #2 → Sorted String Table #2 • ... SST . . .
  19. 19. Чтение данных в LSM MemTable Чтение Log SST SST . . . • Чтение = слияние данных • Read amplification ↑↑  SST
  20. 20. Compaction – слияние SST SST SST . . .Цели • Уменьшение числа SST-файлов скорость чтения ↑ • Удаление старых версий записей размер ↓ SST SST Метод • Слияние сортированных файлов – Пишем последовательно – Пишем плотно – Хорошее сжатие.
  21. 21. Как делать compaction • Избегать крайностей – Редко: слишком много SST – Часто: большой write amplification • Работать эффективно – Сливать файлы похожих размеров – Сливать файлы с разными версиями одной записи • Есть много алгоритмов – Size-tiered – Leveled – Date-tiered – FIFO
  22. 22. a-b c-g f-k l-q za-b a-b Leveled compaction a-c a-f . . . . . . . . . . . . b-gL0 L1 a-e f-i j-n o-z L2 h-k o-r s-w L5 MemTable x-z N*5 mb 50 mb 500 mba-c e-g l-n g-h n-q t-u x-yd-e j-ka-b
  23. 23. a-ba-b c-g f-k l-q za-b Leveled compaction a-c a-f . . . . . . . . . . . . b-gL0 L1 a-e f-i j-n o-z L2 h-k o-r s-w L5 MemTable x-z N*5 mb 50 mb 500 mba-c e-g l-n g-h n-q t-u x-yd-e j-ka-b MemTable read(key) 5 + #L0 операций
  24. 24. a-b c-g f-k l-q za-b a-b Leveled compaction a-c a-f . . . . . . . . . . . . b-gL0 L1 a-e f-i j-n o-z L2 h-k o-r s-w L5 MemTable x-z N*5 mb 50 mb 500 mba-c e-g l-n g-h n-q t-u x-yd-e j-ka-b
  25. 25. a-b c-g f-k l-q za-b a-b Leveled compaction a-c a-f . . . . . . . . . . . . b-gL0 L1 a-e f-i j-n o-z L2 h-k o-r s-w L5 MemTable x-z N*5 mb 50 mb 500 mba-c e-g l-n g-h n-q t-u x-yd-e j-ka-b
  26. 26. a-b c-g f-k l-q za-b a-b Leveled compaction a-c a-f . . . . . . . . . . . . b-gL0 L1 a-e f-i j-n o-z L2 h-k o-r s-w L5 MemTable x-z N*5 mb 50 mb 500 mba-c e-g l-n g-h n-q t-u x-yd-e j-ka-b
  27. 27. Leveled compaction - выводы • read amp. <= #L0+5 • Новые изменения сливаются друг с другом • write amp. <= 5*level_fanout +1 • size amp. ~ 1.11 • И мигрируют в старые уровни.
  28. 28. Log-Structured Merge – выводы • Уменьшает write amplification меньше операций записи • Уменьшает size amplification размер БД на диске меньше • Увеличивает read amplification читаем из нескольких SST.
  29. 29. LevelDB – реализация LSM + Встраиваемая библиотека на С++ + Key/value store на LSM + Level-ed compaction + Open Source + Разработана в Google для Chrome – Не для серверных нагрузок.
  30. 30. • Форкнули LevelDB • Добавили – Multi-threaded Compaction – Multi-threaded MemTable flush – Throttling, если compaction не успевает – Prefix bloom filter для range scans – Column Families – И т д. http://rocksdb.org
  31. 31. • Facebook • LinkedIn • Yahoo • CockroachDB • DNANexus • … Применение
  32. 32. Ограничения RocksDB • Это key/value store – Put(key, value), Delete(key) – Write(WriteBatch) • Нет – Отдельных таблиц – Типов данных – Вторичных индексов – ...
  33. 33. create table tbl ( pk int primary key, ... ) engine=RocksDB; MySQL* + MyRocks= • Табличный движок для MySQL • Данные хранятся в RocksDB • Конфигурация и диагностика RocksDB через MySQL.
  34. 34. MyRocks готов к тестам • SQL-семантика • Транзакционный – REPEATABLE READ – READ COMMITTED • Поддержка всех типов данных • Поддержка индексов – PRIMARY/UNIQUE/Secondary – Поиск по всем видам условий – Статистика для оптимизатора • Можно пробовать приложения
  35. 35. • Мотивация • Тех. Показатели • Устройство • Как попробовать • Особенности
  36. 36. Как попробовать • https://github.com/facebook/mysql-5.6/ • В будущем - в MariaDB (?) • Присылайте вопросы, баги, отзывы, идеи, патчи • Обсуждение – https://github.com/facebook/mysql- 5.6/issues/ – http://facebook.com/groups/rocksdb-dev
  37. 37. Настройки LSM MemTable Level 0 Level 1 Level 2 Level 3 File File File File File File File File File File File File File File LOG (WAL) Compaction Flush show engine rocksdb status; https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide
  38. 38. Настройки MyRocks set global rocksdb_default_cf_options ='write_buffer_size=12m;target_file_siz e_base=1m;max_bytes_for_level_multiplie r=10' • Настройка default column family • Другие column families • > 84 rocksdb_* переменных set global rocksdb_override_cf_options
  39. 39. • Мотивация • Тех. Показатели • Устройство • Как попробовать • Особенности
  40. 40. Особенности SQL на LSM • myrockshotbackup • Сканирование в обратную сторону. • Bloom filters для range scans • Tombstones после массового DELETE
  41. 41. myrockshotbackup • Local server: set rocksdb_create_checkpoint= '/data/mysql/backup' myrockshotbackup | ssh "tar zxf-" • Remote: myrockshotbackup –-move_back • Create checkpoint
  42. 42. Сканирование в обратную сторону • Проблема – Большой размер блока – Компрессия – Читать с конца нельзя • Решение: Column Family c хранением данных в обратном порядке select * from user_messages where user_id=1234 order by date desc limit 10 create table user_messages ( ... KEY key1(user_id,date) comment 'rev:cf_name'
  43. 43. Bloom filters для range scans • Читаем из многих источников • tbl.key=c1 • Во многих SST ключа с1 нет • Bloom Filter в каждой SST. MemTable Чтение SST SST SST
  44. 44. Bloom filters для range scans MemTable Чтение SST SST SST INDEX ON t1(col1, col2, …) index_nr col1 col2 … • tbl.key>10 AND tbl.key<20 • Надо проверять все SST • И Bloom Filter не применим  • Bloom filter на префикс:
  45. 45. Tombstones после DELETE • DELETE создает tombstones delete from messages where date='2015-11-01' select * from messages where date>='2015-11-01' • Решение – Детектировать это при записи в SST – Немедленно назначать compaction. • При чтении их пропускают
  46. 46. В MyRocks нет всех фич • Ограничения – PRIMARY KEY обязателен – ‘index only’ не для всех типов данных – ALTER TABLE медленный – Размер транзакции ограничен – Нет crash-safe master (пользуемся semi-sync) • Это временно – Дайте нам знать, что нужно в первую очередь.
  47. 47. Выводы • Табличный движок MyRocks основан на RocksDB • Приносит LSM серверного уровня в MySQL • Решает проблемы write-heavy загрузки – Меньше места на диске – Меньше операций записи (износ SSD) – «В 2 раза меньше InnoDB по тому и другому, без замедления чтения» • Состояние – Интенсивная разработка (не все сценарии покрыты) – Но пробовать уже можно – Open Source: приглашаем к сотрудничеству.
  48. 48. Ссылки • RocksDB Storage Engine for MySQL and MongoDB, Igor Canadi https://www.percona.com/live/europe-amsterdam- 2015/sessions/rocksdb-storage-engine-mysql-and- mongodb • MySQL on RocksDB (MyRocks), Herman Lee https://www.percona.com/live/europe-amsterdam- 2015/sessions/mysql-rocksdb-myrocks
  49. 49. MyRocks + MySQL
  50. 50. + MySQL = MyRocks

×