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 для свободного использования, участие в разработке также приветствуется.
19. Чтение данных в LSM
MemTable Чтение
Log SST SST
. . .
• Чтение = слияние данных
• Read amplification ↑↑
SST
20. Compaction – слияние SST
SST SST . . .Цели
• Уменьшение числа
SST-файлов
скорость чтения ↑
• Удаление старых версий
записей размер ↓
SST
SST
Метод
• Слияние сортированных файлов
– Пишем последовательно
– Пишем плотно
– Хорошее сжатие.
21. Как делать compaction
• Избегать крайностей
– Редко: слишком много SST
– Часто: большой write amplification
• Работать эффективно
– Сливать файлы похожих размеров
– Сливать файлы с разными версиями
одной записи
• Есть много алгоритмов
– Size-tiered
– Leveled
– Date-tiered
– FIFO
27. Leveled compaction - выводы
• read amp. <= #L0+5
• Новые изменения сливаются
друг с другом
• write amp. <= 5*level_fanout +1
• size amp. ~ 1.11
• И мигрируют в старые уровни.
28. Log-Structured Merge – выводы
• Уменьшает write amplification
меньше операций записи
• Уменьшает size amplification
размер БД на диске меньше
• Увеличивает read amplification
читаем из нескольких SST.
29. LevelDB – реализация LSM
+ Встраиваемая библиотека на С++
+ Key/value store на LSM
+ Level-ed compaction
+ Open Source
+ Разработана в Google для Chrome
– Не для серверных нагрузок.
30. • Форкнули LevelDB
• Добавили
– Multi-threaded Compaction
– Multi-threaded MemTable flush
– Throttling, если compaction не
успевает
– Prefix bloom filter для range scans
– Column Families
– И т д.
http://rocksdb.org
32. Ограничения RocksDB
• Это key/value store
– Put(key, value), Delete(key)
– Write(WriteBatch)
• Нет
– Отдельных таблиц
– Типов данных
– Вторичных индексов
– ...
33. create table tbl (
pk int primary key,
...
) engine=RocksDB;
MySQL* + MyRocks=
• Табличный движок для MySQL
• Данные хранятся в RocksDB
• Конфигурация и диагностика
RocksDB через MySQL.
34. MyRocks готов к тестам
• SQL-семантика
• Транзакционный
– REPEATABLE READ
– READ COMMITTED
• Поддержка всех типов данных
• Поддержка индексов
– PRIMARY/UNIQUE/Secondary
– Поиск по всем видам условий
– Статистика для оптимизатора
• Можно пробовать приложения
35. • Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
36. Как попробовать
• https://github.com/facebook/mysql-5.6/
• В будущем - в MariaDB (?)
• Присылайте вопросы, баги,
отзывы, идеи, патчи
• Обсуждение
– https://github.com/facebook/mysql-
5.6/issues/
– http://facebook.com/groups/rocksdb-dev
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. • Мотивация
• Тех. Показатели
• Устройство
• Как попробовать
• Особенности
40. Особенности SQL на LSM
• myrockshotbackup
• Сканирование в обратную
сторону.
• Bloom filters для range
scans
• Tombstones после массового
DELETE
41. myrockshotbackup
• Local server:
set rocksdb_create_checkpoint=
'/data/mysql/backup'
myrockshotbackup | ssh "tar zxf-"
• Remote:
myrockshotbackup –-move_back
• Create checkpoint
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. Bloom filters для range scans
• Читаем из многих источников
• tbl.key=c1
• Во многих SST
ключа с1 нет
• Bloom Filter в
каждой SST.
MemTable Чтение
SST SST SST
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. Tombstones после DELETE
• DELETE создает tombstones
delete from messages
where date='2015-11-01'
select * from messages
where date>='2015-11-01'
• Решение
– Детектировать это при записи в SST
– Немедленно назначать compaction.
• При чтении их пропускают
46. В MyRocks нет всех фич
• Ограничения
– PRIMARY KEY обязателен
– ‘index only’ не для всех типов данных
– ALTER TABLE медленный
– Размер транзакции ограничен
– Нет crash-safe master
(пользуемся semi-sync)
• Это временно
– Дайте нам знать, что нужно в первую
очередь.
47. Выводы
• Табличный движок MyRocks основан на
RocksDB
• Приносит LSM серверного уровня в MySQL
• Решает проблемы write-heavy загрузки
– Меньше места на диске
– Меньше операций записи (износ SSD)
– «В 2 раза меньше InnoDB по тому и другому, без
замедления чтения»
• Состояние
– Интенсивная разработка (не все сценарии
покрыты)
– Но пробовать уже можно
– Open Source: приглашаем к сотрудничеству.
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
Spinning disks – проблема – ограничение числи операций чтения
Flash – отлично решает эту проблема . За те же деньги 80x.
В чем проигрывает – на TLC flash – 5x less, MLC - 25x less.
MLC – 10,000 write cycles
TLC – 1,000 write cycles
(zlib level1 compression)
Important for extending flash duration
Two equal instances of RocksDB
Slow query log to capture query times
Blue for InnoDB, Orange for MyRocks. Running at full storage capacity and using all available memory for buffer/cache pools.
InnoDB around 80% cpu idle.
2xRocksDB around 50% to 60%
Можно настроить практически все!
Размер мемсторе, количество таблиц, размер 0-ого уровня. Размер 1-ого уровня, размер каждого уровня, компрессиию на каждом уровне, размер файлов или количество файлов, количество нитей комрессии,
Если менять код – алгоритмы мемсторе, формат данных на диске, интерфейсы с ОС (pfile, mmap, HDFS, etc…), тип кеша
Рекомендуемые настройки – дефолтные настройки плохие
Цель настроек.
Компакция идет всегда. Нужно чтобы не было затыков.
Скорость компакции – компромис между read and write amplification
5-6 уровней, разница между уровнями 10-x
Включить компрессию на высоких уровнях, но не включать на низких
Использовать одну нить для флаш и столько нитей для compaction, сколько CPU