Масштабирование баз данных, Tarantool

Владислав Шпилевой

План доклада

  1. Масштабирование
  2. Репликация
  3. Шардинг
  4. Tarantool

Масштабирование

Вертикальное

Горизонтальное

Зачем?

Горизонтальное масштабирование

Репликация

ABC

ABC

ABC

Шардинг

A

B

C

Масштабирование вычислений и отказоустойчивость

Масштабирование вычислений и данных

Репликация и шардинг

A

A

A

B

B

B

C

C

C

Масштабирование вычислений, данных и отказоустойчивость

Репликация

begin

Асинхронная

commit
replicate
begin

Cинхронная

prepare
replicate
commit

Коммит не ждет, пока сработает репликация

Коммит в две фазы. Для успеха нужна репликация на N узлов

  • Быстрее
  • Реплики могут отставать, конфликтовать
  • Надежнее
  • Медленно, сложные протоколы

Репликация

Отставание асинхронных реплик

Медленная сеть

Отставание

Мастер

  • Доотправка недошедших изменений
  • Rejoin

Сложные топологии

  • Поддержка топологий любой сложности

Шардинг

Диапазоны

Хеш

Как выбрать, куда что сохранять?

min

max

Узнал, в какой диапазон попадает ключ - узнал физический узел

Посчитал хеш от ключа - узнал физический узел

  • Идеально
  • Сложно
  • Обычно не нужно
  • Просто и достаточно
  • Проблемный решардинг
  • Труднее быстро выполнять сложные запросы

?

Проблема решардинга

shard\_id(key): key \rightarrow \{shard_1, shard_2, ..., shard_N\}

Меняется N - меняется шард-функция

shard\_id(key1) \neq new\_shard\_id(key)
  • Нужно пересчитать шард-функцию для всех данных
  • Некоторые данные перенесутся на один из старых узлов

Бесполезные переносы

... но это не про Tarantool

Виртуальный шардинг

Данные

Виртуальные узлы

Физические узлы

{tuple}
{tuple}
{tuple}
{tuple}
{tuple}
{tuple}
shard\_id(key) = \{bucket_1, bucket_2, ..., bucket_N\}

#

= const >>

#

Шард-функция неизменна

Шардинг

  • Диапазоны
  • Хеши
  • Виртуальные бакеты

Как по диапазону или бакету понять, где он физически лежит?

1. Запретить решардинг

2. Всегда ходить на все узлы

3. Сделать прокси-маршрутизатор

СУБД + Сервер Приложений в одном

C, Lua, SQL, Python, PHP, Go, Java, C# ...

Обработка запросов

WAL

Сеть

Процесс

Потоки

Персистентное in-memory и дисковое хранение на выбор

Хранимые процедуры на C, Lua, SQL

Кооперативная многозадачность

Многопоточность

Простаивание потока

  • Потери на поддержке когерентности кешей
  • Потери на локах
  • Потери на долгих операциях

Файберы

Event-loop

  • Поток не бездействует никогда
  • Нет локов
  • Одно ядро - нет проблем с когерентностью
Шардинг
Репликация​
In-memory​
Disk​
Персистентность​
SQL​
Хранимые процедуры​
Аудит логи​
Подключение к другим СУБД​
Статическая сборка​
GUI
Безпрецедентная производительность
Tarantool VShard
Синхронная/Асинхронная​
Движок memtx​
Движок vinyl​, LSM-дерево
В обоих движках
Стандарт ANSI
​Lua, C, SQL
Есть
MySQL, Oracle,
Memcached
Для Linux
Управление кластером, данными
Сотни тысяч RPS на один инстанс -
легко