Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в...

56
Обзор перспективных СУБД для highload Юрий Насретдинов

Transcript of Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в...

Page 1: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Обзор перспективных СУБД для highload

Юрий Насретдинов

Page 2: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

План• Обо мне

• Подход к выбору технологий

• Tarantool

• ClickHouse

• CockroachDB

• Заключение

Page 3: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Обо мне• Зовут Юрий, в честь дедушки

• Написал свою СУБД на PHP

• Работал в Badoo ~5 лет в отделе «платформы»

• 10 лет опыта программирования на PHP

• Сейчас разрабатываю на Go

Page 4: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Зачем этот доклад?

• Индустрия IT быстро развивается

• Highload — тем более

• Через 10 лет ваши сегодняшние знания и навыки безнадежно устареют

Page 5: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Подход к выбору технологий

1. Архитектуру

2. Не только сильные, но и слабые места

3. Как «это» мониторить и бэкапить

4. Что делать, когда это всё «упадет»

Перед запуском системы в продакшен вы должны понимать:

Page 6: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Подход к выбору технологий

1. Разработано и протестировано в большой компании

2. Вы знакомы с разработчиками

3. У разработчиков уже есть похожие успешные проекты

4. В документации упоминается внутреннее устройство и оно вам понятно

Хорошими ориентирами являются:

Page 7: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Примеры успешных технологий в прошлом

• MySQL (MyISAM)

• MongoDB (MMAP)

• Memcached

• FreeBSD 4

Page 8: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Примеры успешных технологий в прошлом

• Простота и понятность архитектуры

• Работает сразу, минимум настроек

• Надежность (не «падает» на ровном месте)

• Понятные tradeoffs

Page 9: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Примеры успешных технологий в прошлом

• MySQL (MyISAM)

• MongoDB (MMAP)

• Memcached

• FreeBSD 4

скорость, простота потеря данных

скорость, простота, эффективность

простота, надежность, стабильность

скорость, простота потеря данных

Page 10: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал
Page 11: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: предпосылки

web1 web2 webN• • •

mysql1 mysql2 mysqlN• • •1-1000 1001-2000 X-(X+999)

sign in for [email protected] where to go?

Page 12: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: предпосылки

web1 web2 webN• • •

mysql1 mysql2 mysqlN• • •1-1000 1001-2000 X-(X+999)

sign in for +7 (910) 123-34-45 where to go?

Page 13: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: предпосылкиsign in for [email protected] where to go?

central «authorizer» database

mysql1 mysql2 mysqlN• • •1-1000 1001-2000 X-(X+999)

Page 14: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: предпосылки

Как обновлять?Как реплицировать?

Как рестартовать?Как добавить новые индексы?

Page 15: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Возможные решения• Форк memcached — сложная поддержка, только в памяти

• MySQL — тяжеловесный, но есть HandlerSocket

• Redis — не поддерживает индексы

• Oracle — …

• Zookeeper — нет программируемой логики

Page 16: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool• In-memory

• Быстрый — до 1М RPS на ядро CPU

• Конвейерная архитектура

• Написан и отлажен в mail.ru

• Константин Осипов ранее разрабатывал MySQL

• Хорошая модель персистентности — snapshots + log

Page 17: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: архитектура

client1

client2

clientN

client3

• •

I/O Execution WALthreads:

Page 18: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: snapshots pre1.6.7

Parent Child

shared

private

shared

private CoW

forksnapshot file

Page 19: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: snapshots pre1.6.7

• Fork занимает ~10мс на 1Гб RSS

• Копирование при записи делается блоками по 4 Кб

• Общая память не помечается как CoW

• Небольшая пауза при создании snapshot

Page 20: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: snapshots 1.6.7+

• User-space memory address translation (matras)

Page 21: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: сценарии использования

• Очень много клиентов

• Много мелкого чтения и записи

• Необходимость в централизованном хранилище с индексами

• Желание иметь часть логики в базе

• Пример: сессии пользователей, «authorizer», счетчики посещений

Page 22: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: когда не использовать

• Если нужны: SQL, автоматический шардинг и failover, Raft / Paxos, длинные транзакции

• Мало клиентов и требование минимальной latency

• Рабочий набор не влезает в память

• Аналитика (см. далее)

Page 23: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал
Page 24: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: предпосылки

• Эффективная и линейно масштабируемая

• В реалтайме

• Бесплатная и open-source

• ^ выберите любые два

Аналитика для веб-сайтов и приложений:

Page 25: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Возможные решения

• MySQL (MyISAM) — быстрая запись, медленное чтение

• Vertica, Exasol — платно

• Hadoop — не realtime, сложно настраивать и поддерживать

Аналитика для веб-сайтов и приложений:

Page 26: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Возможные решения

• MySQL (MyISAM) — быстрая запись, медленное чтение

• Vertica, Exasol — платно

• Hadoop — не realtime, сложно настраивать и поддерживать

Аналитика для веб-сайтов и приложений:

выбор Яндекса

Page 27: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse• Распределенная СУБД для аналитики

• Колоночное хранение

• Оптимизирована для HDD

• Исключительно быстрая

• Протестирована в продакшене Яндекса

Page 28: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: внутреннее устройство

FlightDate Month Carrier Origin Dest

• • •

Div5TailNumYear

Partition 2017-06

Page 29: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: «засечки»

FlightDateYear<2017,05-01><2017,05-03><2017,05-05><2017,05-10><2017,05-15><2017,05-21><2017,05-24><2017,05-28><2017,05-30>

SELECT count() FROM flights WHERE year = 2017 AND FlightDate BETWEEN ’05-11’ AND ’05-16’

Primary Key

Page 30: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: MergeTreeFlightDate Month Carrier Origin Dest Div5TailNumYear

Temp Partition 2017-06 #1

Temp Partition 2017-06 #2 }FlightDate Month Carrier Origin Dest

• • •

Div5TailNumYear

FlightDate Month Carrier Origin Dest

• • •

Div5TailNumYear

Temp Partition 2017-06 #3

• • •

Page 31: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: возможности• SQL, ограниченные JOIN’ы

• Репликация и работа в кластере (требуется ZooKeeper)

• 17* алгоритмов выполнения GROUP BY

• MATERIALIZED VIEWS, GLOBAL JOINs

• Выборки с сэмплированием* наверняка их уже больше

Page 32: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: ограничения

• Только INSERT, нет UPDATE или DELETE

• JOIN’ы только для таблиц, которые влезают в память

• Полуручное управление кластером

• Нет полноценных транзакций, только атомарный INSERT

Page 33: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: сценарии использования

• Задачи realtime аналитики

• Time-series (https://github.com/yandex/graphouse)

• Хранение сырых событий — показы, клики, etc.

• Логи

• Результаты тестов

Page 34: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse: когда не использовать

• OLTP-задачи

• Работа с деньгами

• Хранение только агрегатов

• Map / Reduce задачи

• Полнотекстовый поиск

Page 35: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал
Page 36: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: предпосылки

web1 web2 webN• • •

mysql1 mysql2 mysqlN• • •1-1000 1001-2000 X-(X+999)

sign in for [email protected] where to go?

Page 37: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool: предпосылки

web1 web2 webN• • •

mysql1 mysql2 mysqlN• • •1-1000 1001-2000 X-(X+999)

sign in for +7 (910) 123-34-45 where to go?

Page 38: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: предпосылки

CREATE TABLE users ( id INT, email VARCHAR(200), phone VARCHAR(30), ..., PRIMARY KEY (id), UNIQUE INDEX (email), UNIQUE INDEX (phone) )

Page 39: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: предпосылки

SELECT * FROM users WHERE email = ‘[email protected]

SELECT * FROM users WHERE phone = ‘+7 (910) 123-34-45’

Page 40: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Возможные решения

• Google Cloud Spanner

• Authorizer + ручной шардинг

• MongoDB, Cassandra — не поддерживают распределенные уникальные индексы

• Cвой вариант?

Page 41: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB• Изначально — распределенный Key-Value Storage

• Production Ready (шутка) — 10 Мая вышла версия 1.0

• SQL, JOINs

• Транзакции, ACID

• Уникальные индексы

• Автоматический шардинг и балансировка нагрузки

Page 42: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB• Создан авторами Google Spanner

• Есть community и enterprise версии

• Написан на Go

• Использует (Multi)Raft и RocksDB

• Прошел тестирование Jepsen

• Используется в Baidu на продакшене

Page 43: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: SQL to KVCREATE TABLE test ( key INT PRIMARY KEY, floatVal FLOAT, stringVal STRING )

INSERT INTO test VALUES (10, 4.5, "hello")

key value

/test/10/floatVal 4.5

/test/10/stringVal "hello"

https://www.cockroachlabs.com/blog/sql-in-cockroachdb-mapping-table-data-to-key-value-

storage/

Page 44: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: SQL to KV

CREATE INDEX foo ON test (stringVal)

key value

/test/primary/10 Ø

/test/primary/10/floatVal 4.5

/test/primary/10/stringVal "hello"

/test/foo/"hello"/10 Ø

https://www.cockroachlabs.com/blog/sql-in-cockroachdb-mapping-table-data-to-key-value-

storage/

Page 45: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: внутреннее устройство

a - j

k - n

o - t

a - j

k - n

u - z

u - z

o - t

k - n

a - j

u - z

o - t

roach1 roach2 roach3 roach4

{64 Мб

Page 46: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: внутреннее устройство

a - j

k - n

o - q | r - t

a - j

k - n

u - z

u - z

o - q | r - t

k - n

a - j

u - z

o - q | r - t

roach1 roach2 roach3 roach4

Page 47: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: внутреннее устройство

a - j

k - n

o - q

r - t

a - j

k - n

u - z

u - z

o - q

k - n

r - t

a - j

u - z

o - q

r - t

roach1 roach2 roach3 roach4

Page 48: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: внутреннее устройство

a - j

k - n

o - q

r - t

a - j

k - n

u - z

u - z

o - q

k - n

r - t

a - j

u - z

o - q

r - t

roach1 roach2 roach3 roach4

Page 49: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: распределенные транзакции

• Есть системная таблица со списком транзакций

• К каждому затронутому в транзакции ключу добавляется рядом ключ с номером транзакции, в которой он изменялся

• При чтении такого ключа нужно посмотреть в списке транзакций — закоммичена она или нет

• При успешном коммите значения заменяются на конечные

• Сборщик мусора чистит неудавшиеся транзакции

Page 50: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: сценарии использования

• Хранение пользовательских данных в кластере вместо MySQL / PostgreSQL / MongoDB

Page 51: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB: когда не использовать

• Требуется низкая latency

• Требуется высокий QPS

• Не нужна строгая консистентность

• Не нужны распределенные транзакции

• Нужны сложные хранимки, JOIN’ы, представления, триггеры

Page 52: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Tarantool (memtx)• extreme RPS

• eventual consistency

• single-core

• in-memory

• manual sharding

Page 53: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

ClickHouse• auto parallelize

• HDD-optimized

• extreme throughput (scan 10^9 rows/sec per node)

• in-memory, limited joins

• no transactions, update/delete/replace

• semi-automatic cluster management

Page 54: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

CockroachDB• linear auto scaling

• ACID, distributed transactions

• supports standard SQL

• 1.0 just released

• limited joins

• poor performance (~ ? RPS per node)

Page 55: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Заключение

• Теперь вы узнали про 3 новые базы данных и про то, где их применять

• Думайте своей головой перед тем, как применять их в продакшене

Page 56: Юрий Насретдинов · 2017-06-13 · Обо мне • Зовут Юрий, в честь дедушки • Написал свою СУБД на PHP • Работал

Вопросы

Юрий Насретдинов

[email protected]