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

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

План на 2019

Шардинг сейчас

Tarantool VShard

Buckets

Replicaset

Data       →       Bucket              Storage

User defined map

Internal map

VShard

Авто-балансировка

Сборка мусора

Восстановление

Маршрутизация

Tarantool

Ядро ОС

VShard

С, ASM

С, C++, Lua

Lua

Производительность VShard

  • 2 репликасета по 2 тарантула
  • 2 роутера
  • Lua-клиент
  • Пакеты по 5-15 записей по 20 байт штука

~ 300 000 RPS

Ложки дегтя - модульность

Отсутствует глобальный каталог метаданных

"Двойная" авторизация

Публичность метаданных шардинга

DDL, конфигурация, справочные данные

_bucket, счетчики ссылок, таблицы маршрутизации

client1
client2
rights(client1) ⊆ rights(client2)

Получение избыточных прав

Ложки дегтя - Lua

Сборщик мусора - долго, ненадежно

Динамическая типизация - избыточно

Интерпретируемый язык - медленно

Бочки меда - преимущества интеграции

Увеличение производительности сервера

Перепись на С, ускорение х1.5 - 2

Ускорение проксирования запросов

Нет распаковки/запаковки, ускорение пропорционально размеру запросов

Бесплатный прокси на localhost

Запрос через прокси к самому себе обрабатывается так же, как без прокси

Кластерная репликация

Распространение схемы данных, справочных данных, конфигурации, глобальный SQL

Инкапсуляция метаданных

Нельзя испортить _bucket, ссылки, таблицы маршрутизации, они скрыты

Прозрачная авторизация

Запросы от прокси неотличимы от клиентских

Итого ожидается ускорение х4 - 5

Этапы интеграции

Хранилище

Маршрутизатор

  1. Репликация на кластер
  2. Поддержка bucket_id
  3. Алгоритмы шардинга
     
  4. Параллельная балансировка
  5. Статистика по бакетам
  1. Маршрутизация
  2. Разведка топологии

     
  3. Балансировка запросов
  4. Поддержка DML, DQL без обертки в CALL

Интеграция

Расширение

Трек 1, Репликация на кластер [1]

Локальная группа - replica-local и временные спейсы, Lua-таблицы

Группа репликасета - не шардируемые спейсы

Группа кластера - метаданные шардируемых спейсов

box.schema.create_space(‘test’, {is_global = true})

gh-3982: Репликация на кластер

Трек 1, Репликация на кластер [2]

Поддержка больших кластеров:

  • gh-3983: Увеличение размера векторных часов
  • gh-3984: Удаление фулмеша
N \\ S_t \\ S \\ S_t = 2(N-1)\\ S = S_tN = 2N(N-1)

- размер кластера

- количество соединений на узел

- количество соединений в кластере

N = 3, S = 12\\ N = 50, S = 4900

- количество соединений растет экспоненциально

Трек 2, Поддержка bucket_id [1]

gh-3985: Системные поля

SQLite

sqlite> create table test(a integer);
sqlite> insert into test values (10), (20);
sqlite> select * from test;
10
20
sqlite> select rowid from test;
1
2

Поле rowid - системное, и не видно без явного указания

PostgreSQL

pgsql> create table test (a integer);
pgsql> create index fidx on test((0 - a));
pgsql> insert into test values (10), (20);
pgsql> select * from test;
10
20

Значения индекса не показываются, но хранятся и используются

Tarantool VShard

format = {{id, 'integer'}, {'bucket_id', 'unsigned'}}
s = box.schema.create_space('test', {format = format}
s:create_index('pk')
s:create_index('bucket_id', {parts = {{'bucket_id'}}}

Bucket_id - системное поле, но хранится, как обычное

Трек 2, Поддержка bucket_id [2]

  • gh-3986: Создание спейса _bucket
  • gh-3987: Системный индекс по bucket_id
opts = {format = {{id, 'integer'}, is_sharded = true}}
s = box.schema.create_space('test', opts)
s:create_index('pk')

s:replace({1}, {shard_id = 100})

Сейчас:

Будет:

  • Нет совместимости
  • Легко ошибиться
  • Инкапсуляция совместимость
  • Всего одна опция
opts = {format = {{id, 'integer'},
                  {'bucket_id', 'unsigned'}}}
s = box.schema.create_space('test', opts)
s:create_index('pk')
s:create_index('bucket_id', {parts = {{'bucket_id'}}}

s:replace{1, 100}

Трек 2, Поддержка bucket_id [3]

gh-3988: Реализация отправки бакетов

vshard.storage.bucket_send - базовый компонент bucket-шардинга

Read

Write

Сеть

Read

Write

Read

Write

Трек 3, Алгоритмы шардинга

Авто-балансировка

gh-3992

Сборка мусора

gh-3989 gh-3990

Восстановление

gh-3991

box.cfg{
    shard_count = 30000,
    shard_replicaset_weight = 100,
    shard_max_receiving = 10,
    shard_disbalance_threshold = 0.01,
}

Трек 4, Маршрутизация

  • gh-2625, gh-3993: Реализация кластерного прокси
  • gh-3994: Ассоциация запроса с bucket_id
  • gh-3995: Автозаполнение таблицы маршрутизации

[1, N/2]

(N/2, N]

proxy = require('proxy')
proxy.cfg({
    listen = 'aaa.aaa.aaa.aaa:pppp',
    cluster = {
        'xxx.xxx.xxx.xxx:pppp',
        'yyy.yyy.yyy.yyy:pppp',
        ...
    }
})

proxy.call('my_func', {args})

shard_id = 100
proxy.scall(shard_id, 'my_func', {args})

uuid = '...'
proxy.ucall(uuid, 'my_func', {args})
  • Не нужно задавать логин и пароль
  • Маршрутизация по UUID, bucket_id

Карта задач

gh-3982: Репликация на кластер

gh-3983: Увеличение размера векторных часов

gh-3984: Удаление фулмеша

gh-3985: Системные поля

gh-3986: Создание спейса _bucket

gh-3987: Системный индекс по bucket_id

gh-3988: Реализация отправки бакетов

gh-3992: Авто-балансировка

gh-3989 gh-3990: Сборка мусора

gh-3991: Восстановление

gh-2625, gh-3993: Реализация кластерного прокси

gh-3994: Ассоциация запроса с bucket_id

gh-3995: Автозаполнение таблицы маршрутизации

Планы [1]

vshard/gh-168: Балансировка запросов

  • Round-robin read-only по всем инстансам
  • Round-robin read-write по мастерам

Планы [2]

vshard/gh-161: Параллельная отправка бакетов

Ускорение ребалансировки в worker_count раз

worker_count файберов

Планы [3]

vshard/gh-126: Статистика бакетов

Баланс бакетов ≠ баланс данных

Статистика покажет реальные размеры бакетов

Планы [4]

vshard/gh-150: DML, DQL API

Прямое исполнение DML и DQL запросов в разы быстрее, чем заворачивание в CALL - нет Lua

Сеть

Сеть

TX поток, С

IProto поток

TX поток, Lua

Ускорение x1.5 - 2

proxy.call('box.space.test:select', key)
proxy.space.test:select(key)

Сейчас:

Будет:

Прогресс [1]. Синхронная репликация

gh-2798: Транзакционная репликация

gh-1025: Пакетная отправка записей в сокет

gh-3794: Репликация из памяти

gh-3801: Кворумный коммит

gh-3802: Двухфазный ACK - "полусинхронная репликация"

gh-3803: Восстановление транзакции с не-лидера

gh-2625: Прокси модуль для репликасета

gh-3234: Модуль мониторинга доступности узлов

gh-1146: RAFT протокол консенсуса

gh-3055: Протокол смены лидера

gh-3294: Снижение избыточности фулмеш репликации

gh-3568: Упорядочивание транзакций с разных источников

gh-3805: Динамическое отображение UUID на server id

Прогресс [2]. Tarantool 2.1.2

69% - 78/113

Стабильный релиз в марте

SQL

Готовность к продакшену

Подготовка синхронной репликации

  • Хинтованные индексы
  • Индексы по JSON путям
  • Развитие box.ctl.on_<event>()
  • Ограничение размера WAL

Прочее:

Прогресс [3]. Tarantool Enterprise 1.10.x

Релиз в марте

box.space

Space explorer

AD аутентификация

  • Коннекторы
  • Операционирование
  • Мониторинг

Прочие улучшения

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

By Vladislav Shpilevoy

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

  • 1,550