Upload
sergey-petrunya
View
561
Download
2
Embed Size (px)
Citation preview
MyRocks: Табличный Движок для MySQLАлексей МайковСергей Петруня
• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности
• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности
*MySQL is a registered trademark of Oracle Corporation
MyRocks
Размер базы (GB) (Linkbench)
InnoDB RocksDB
1172
574
Megabytes/s written (Linkbench)
InnoDB RocksDB
150
70
Размер базы (GB) (Prod)
(zlib level1 compression)
InnoDB RockDB
1089
525.4
Terabytes written (Prod)
InnoDB 2x RocksDB0
4
8
12
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)
< 15ms
< 25ms
< 50ms
< 75ms
< 100ms
< 150ms
< 250ms
< 500ms
< 750ms
< 1000ms
< 1500ms
< 2500ms0
50000
100000
150000
200000
250000
300000
Kilo
-Que
ries
RocksDB x2
InnoDB
CPU Idle (Prod)
Time
InnoDB
2x RocksDB
100%
0%
80%
50-60%
• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности
Ограниченность InnoDB• B*-treе• Страничное хранение
– Изменение = запись страницы
– Сжатие тоже постраничное
amplification =Размер на дискеРазмер данных
• Read amplification – устраивает• Write amplification – проблема• Size amplification – проблема.
11020
135
101217
2025
12
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
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 → Sorted String Table #2• ...
SST . . .
Чтение данных в LSM
MemTable Чтение
Log SST SST . . .
• Чтение = слияние данных • Read amplification ↑↑
SST
Compaction – слияние SST
SST SST . . .Цели• Уменьшение числа
SST-файловскорость чтения ↑
• Удаление старых версий записей размер ↓
SST
SST
Метод• Слияние сортированных файлов
– Пишем последовательно– Пишем плотно– Хорошее сжатие.
Как делать compaction• Избегать крайностей
– Редко: слишком много SST– Часто: большой write amplification
• Работать эффективно– Сливать файлы похожих размеров– Сливать файлы с разными
версиями одной записи• Есть много алгоритмов
– Size-tiered– Leveled
– Date-tiered– FIFO
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
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 операций
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
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
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
Leveled compaction - выводы• read amp. <=
#L0+5
• Новые изменения сливаются друг с другом
• write amp. <= 5*level_fanout +1
• size amp. ~ 1.11
• И мигрируют в старые уровни.
Log-Structured Merge – выводы • Уменьшает write
amplificationменьше операций записи
• Уменьшает size amplificationразмер БД на диске меньше
• Увеличивает read amplificationчитаем из нескольких SST.
LevelDB – реализация LSM+ Встраиваемая библиотека на С+
++ Key/value store на LSM+ Level-ed compaction+ Open Source+ Разработана в Google для
Chrome– Не для серверных нагрузок.
• Форкнули LevelDB• Добавили
– Multi-threaded Compaction– Multi-threaded MemTable flush– Throttling, если compaction не
успевает– Prefix bloom filter для range scans– Column Families– И т д.
http://rocksdb.org
• 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
• Данные хранятся в RocksDB• Конфигурация и диагностика
RocksDB через MySQL.
MyRocks готов к тестам• SQL-семантика• Транзакционный
– REPEATABLE READ– READ COMMITTED
• Поддержка всех типов данных• Поддержка индексов
– PRIMARY/UNIQUE/Secondary– Поиск по всем видам условий– Статистика для оптимизатора
• Можно пробовать приложения
• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности
Как попробовать• https
://github.com/facebook/mysql-5.6/• В будущем - в MariaDB (?)• Присылайте вопросы, баги,
отзывы, идеи, патчи• Обсуждение
– https://github.com/facebook/mysql-5.6/issues/
– http://facebook.com/groups/rocksdb-dev
Настройки 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
Настройки 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
• Мотивация• Тех. Показатели• Устройство• Как попробовать• Особенности
Особенности SQL на LSM
• myrockshotbackup• Сканирование в
обратную сторону.• Bloom filters для range
scans• Tombstones после
массового DELETE
myrockshotbackup
• Local server:
set rocksdb_create_checkpoint= '/data/mysql/backup'
myrockshotbackup | ssh "tar zxf-"
• Remote: myrockshotbackup –-move_back
• Create checkpoint
Сканирование в обратную сторону
• Проблема– Большой размер блока– Компрессия– Читать с конца нельзя
• Решение: 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'
Bloom filters для range scans• Читаем из многих источников• tbl.key=c1• Во многих SST
ключа с1 нет• Bloom Filter в
каждой SST.
MemTable Чтение
SST SST SST
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 на
префикс:
Tombstones после DELETE• DELETE создает tombstones
delete from messages where date='2015-11-01'
select * from messages where date>='2015-11-01'
• Решение– Детектировать это при записи в
SST– Немедленно назначать
compaction.
• При чтении их пропускают
В MyRocks нет всех фич• Ограничения
– PRIMARY KEY обязателен– ‘index only’ не для всех типов данных– ALTER TABLE медленный– Размер транзакции ограничен– Нет crash-safe master
(пользуемся semi-sync)• Это временно
– Дайте нам знать, что нужно в первую очередь.
Выводы• Табличный движок MyRocks основан на
RocksDB• Приносит LSM серверного уровня в MySQL• Решает проблемы write-heavy загрузки
– Меньше места на диске– Меньше операций записи (износ SSD) – «В 2 раза меньше InnoDB по тому и другому,
без замедления чтения»• Состояние
– Интенсивная разработка (не все сценарии покрыты)
– Но пробовать уже можно– Open Source: приглашаем к сотрудничеству.
Ссылки• 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
MyRocks
+ MySQL
+ MySQL = MyRocks