50
MyRocks: Табличный Движок для MySQL Алексей Майков Сергей Петруня

MyRocks: табличный движок для MySQL на основе RocksDB

Embed Size (px)

Citation preview

Page 1: MyRocks: табличный движок для MySQL на основе RocksDB

MyRocks: Табличный Движок для MySQLАлексей МайковСергей Петруня

Page 2: MyRocks: табличный движок для MySQL на основе RocksDB

• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности

Page 3: MyRocks: табличный движок для MySQL на основе RocksDB

• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности

Page 4: MyRocks: табличный движок для MySQL на основе RocksDB

*MySQL is a registered trademark of Oracle Corporation

Page 5: MyRocks: табличный движок для MySQL на основе RocksDB

MyRocks

Page 6: MyRocks: табличный движок для MySQL на основе RocksDB

Размер базы (GB) (Linkbench)

InnoDB RocksDB

1172

574

Page 7: MyRocks: табличный движок для MySQL на основе RocksDB

Megabytes/s written (Linkbench)

InnoDB RocksDB

150

70

Page 8: MyRocks: табличный движок для MySQL на основе RocksDB

Размер базы (GB) (Prod)

(zlib level1 compression)

InnoDB RockDB

1089

525.4

Page 9: MyRocks: табличный движок для MySQL на основе RocksDB

Terabytes written (Prod)

InnoDB 2x RocksDB0

4

8

12

Flash GC

Binlog / Relay log

Storage engine

Page 10: MyRocks: табличный движок для MySQL на основе RocksDB

Flash read rates (Prod)• RocksDB > InnoDB * 1.5• Flash справляется!

Time

RocksDB (2x)

InnoDB

=> 37 Tb

=> 12 Tb

Page 11: MyRocks: табличный движок для MySQL на основе RocksDB

Cumulative Response Times (Prod)

< 15ms

< 25ms

< 50ms

< 75ms

< 100ms

< 150ms

< 250ms

< 500ms

< 750ms

< 1000ms

< 1500ms

< 2500ms0

50000

100000

150000

200000

250000

300000

Kilo

-Que

ries

RocksDB x2

InnoDB

Page 12: MyRocks: табличный движок для MySQL на основе RocksDB

CPU Idle (Prod)

Time

InnoDB

2x RocksDB

100%

0%

80%

50-60%

Page 13: MyRocks: табличный движок для MySQL на основе RocksDB

• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности

Page 14: MyRocks: табличный движок для MySQL на основе RocksDB

Ограниченность InnoDB• B*-treе• Страничное хранение

– Изменение = запись страницы

– Сжатие тоже постраничное

amplification =Размер на дискеРазмер данных

• Read amplification – устраивает• Write amplification – проблема• Size amplification – проблема.

11020

135

101217

2025

12

Page 15: MyRocks: табличный движок для MySQL на основе RocksDB

Log-Structured Merge (LSM)

MemTableЗапись

Log SST

• Пишем в MemTable+Log• MemTable → Sorted String Table

MemTable

Page 16: MyRocks: табличный движок для MySQL на основе RocksDB

Log-Structured Merge (LSM)

MemTableЗапись

Log SST

• Пишем в MemTable+Log• MemTable → Sorted String Table

– Линейная запись– Плотно, с компрессией.

MemTable

Page 17: MyRocks: табличный движок для MySQL на основе RocksDB

Log-Structured Merge (LSM)

MemTableЗапись

Log SST

• Пишем в MemTable+Log• MemTable → Sorted String Table

MemTable

Page 18: MyRocks: табличный движок для MySQL на основе RocksDB

Log-Structured Merge (LSM)

MemTableЗапись

Log SST

• Пишем в MemTable+Log• MemTable → Sorted String Table• MemTable #2 → Sorted String Table #2• ...

SST . . .

Page 19: MyRocks: табличный движок для MySQL на основе RocksDB

Чтение данных в LSM

MemTable Чтение

Log SST SST . . .

• Чтение = слияние данных • Read amplification ↑↑

SST

Page 20: MyRocks: табличный движок для MySQL на основе RocksDB

Compaction – слияние SST

SST SST . . .Цели• Уменьшение числа

SST-файловскорость чтения ↑

• Удаление старых версий записей размер ↓

SST

SST

Метод• Слияние сортированных файлов

– Пишем последовательно– Пишем плотно– Хорошее сжатие.

Page 21: MyRocks: табличный движок для MySQL на основе RocksDB

Как делать compaction• Избегать крайностей

– Редко: слишком много SST– Часто: большой write amplification

• Работать эффективно– Сливать файлы похожих размеров– Сливать файлы с разными

версиями одной записи• Есть много алгоритмов

– Size-tiered– Leveled

– Date-tiered– FIFO

Page 22: MyRocks: табличный движок для MySQL на основе RocksDB

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

Page 23: MyRocks: табличный движок для MySQL на основе RocksDB

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

MemTableread(key)

5 + #L0 операций

Page 24: MyRocks: табличный движок для MySQL на основе RocksDB

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

Page 25: MyRocks: табличный движок для MySQL на основе RocksDB

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

Page 26: MyRocks: табличный движок для MySQL на основе RocksDB

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

Page 27: MyRocks: табличный движок для MySQL на основе RocksDB

Leveled compaction - выводы• read amp. <=

#L0+5

• Новые изменения сливаются друг с другом

• write amp. <= 5*level_fanout +1

• size amp. ~ 1.11

• И мигрируют в старые уровни.

Page 28: MyRocks: табличный движок для MySQL на основе RocksDB

Log-Structured Merge – выводы • Уменьшает write

amplificationменьше операций записи

• Уменьшает size amplificationразмер БД на диске меньше

• Увеличивает read amplificationчитаем из нескольких SST.

Page 29: MyRocks: табличный движок для MySQL на основе RocksDB

LevelDB – реализация LSM+ Встраиваемая библиотека на С+

++ Key/value store на LSM+ Level-ed compaction+ Open Source+ Разработана в Google для

Chrome– Не для серверных нагрузок.

Page 30: MyRocks: табличный движок для MySQL на основе RocksDB

• Форкнули LevelDB• Добавили

– Multi-threaded Compaction– Multi-threaded MemTable flush– Throttling, если compaction не

успевает– Prefix bloom filter для range scans– Column Families– И т д.

http://rocksdb.org

Page 31: MyRocks: табличный движок для MySQL на основе RocksDB

• Facebook• LinkedIn• Yahoo• CockroachDB• DNANexus• …

Применение

Page 32: MyRocks: табличный движок для MySQL на основе RocksDB

Ограничения RocksDB• Это key/value store

– Put(key, value), Delete(key)– Write(WriteBatch)

• Нет– Отдельных таблиц– Типов данных– Вторичных индексов– ...

Page 33: MyRocks: табличный движок для MySQL на основе RocksDB

create table tbl ( pk int primary key, ...) engine=RocksDB;

MySQL* + MyRocks=

• Табличный движок для MySQL

• Данные хранятся в RocksDB• Конфигурация и диагностика

RocksDB через MySQL.

Page 34: MyRocks: табличный движок для MySQL на основе RocksDB

MyRocks готов к тестам• SQL-семантика• Транзакционный

– REPEATABLE READ– READ COMMITTED

• Поддержка всех типов данных• Поддержка индексов

– PRIMARY/UNIQUE/Secondary– Поиск по всем видам условий– Статистика для оптимизатора

• Можно пробовать приложения

Page 35: MyRocks: табличный движок для MySQL на основе RocksDB

• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности

Page 36: MyRocks: табличный движок для MySQL на основе RocksDB

Как попробовать• https

://github.com/facebook/mysql-5.6/• В будущем - в MariaDB (?)• Присылайте вопросы, баги,

отзывы, идеи, патчи• Обсуждение

– https://github.com/facebook/mysql-5.6/issues/

– http://facebook.com/groups/rocksdb-dev

Page 37: MyRocks: табличный движок для MySQL на основе RocksDB

Настройки 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

Page 38: MyRocks: табличный движок для MySQL на основе RocksDB

Настройки MyRocks

set global rocksdb_default_cf_options ='write_buffer_size=12m;target_file_size_base=1m;max_bytes_for_level_multiplier=10'

• Настройка default column family

• Другие column families

• > 84 rocksdb_* переменных

set global rocksdb_override_cf_options

Page 39: MyRocks: табличный движок для MySQL на основе RocksDB

• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности

Page 40: MyRocks: табличный движок для MySQL на основе RocksDB

Особенности SQL на LSM

• myrockshotbackup• Сканирование в

обратную сторону.• Bloom filters для range

scans• Tombstones после

массового DELETE

Page 41: MyRocks: табличный движок для MySQL на основе RocksDB

myrockshotbackup

• Local server:

set rocksdb_create_checkpoint= '/data/mysql/backup'

myrockshotbackup | ssh "tar zxf-"

• Remote: myrockshotbackup –-move_back

• Create checkpoint

Page 42: MyRocks: табличный движок для MySQL на основе RocksDB

Сканирование в обратную сторону

• Проблема– Большой размер блока– Компрессия– Читать с конца нельзя

• Решение: Column Family c хранением данных в обратном порядке

select * from user_messages where user_id=1234order by date desc limit 10

create table user_messages ( ... KEY key1(user_id,date) comment 'rev:cf_name'

Page 43: MyRocks: табличный движок для MySQL на основе RocksDB

Bloom filters для range scans• Читаем из многих источников• tbl.key=c1• Во многих SST

ключа с1 нет• Bloom Filter в

каждой SST.

MemTable Чтение

SST SST SST

Page 44: MyRocks: табличный движок для MySQL на основе RocksDB

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 на

префикс:

Page 45: MyRocks: табличный движок для MySQL на основе RocksDB

Tombstones после DELETE• DELETE создает tombstones

delete from messages where date='2015-11-01'

select * from messages where date>='2015-11-01'

• Решение– Детектировать это при записи в

SST– Немедленно назначать

compaction.

• При чтении их пропускают

Page 46: MyRocks: табличный движок для MySQL на основе RocksDB

В MyRocks нет всех фич• Ограничения

– PRIMARY KEY обязателен– ‘index only’ не для всех типов данных– ALTER TABLE медленный– Размер транзакции ограничен– Нет crash-safe master

(пользуемся semi-sync)• Это временно

– Дайте нам знать, что нужно в первую очередь.

Page 47: MyRocks: табличный движок для MySQL на основе RocksDB

Выводы• Табличный движок MyRocks основан на

RocksDB• Приносит LSM серверного уровня в MySQL• Решает проблемы write-heavy загрузки

– Меньше места на диске– Меньше операций записи (износ SSD) – «В 2 раза меньше InnoDB по тому и другому,

без замедления чтения»• Состояние

– Интенсивная разработка (не все сценарии покрыты)

– Но пробовать уже можно– Open Source: приглашаем к сотрудничеству.

Page 49: MyRocks: табличный движок для MySQL на основе RocksDB

MyRocks

+ MySQL

Page 50: MyRocks: табличный движок для MySQL на основе RocksDB

+ MySQL = MyRocks