Шпилевой Владислав
План на 2019
Buckets
Replicaset
Data → Bucket → Storage
User defined map
Internal map
Авто-балансировка
Сборка мусора
Восстановление
Маршрутизация
Tarantool
Ядро ОС
VShard
С, ASM
С, C++, Lua
Lua
~ 300 000 RPS
Отсутствует глобальный каталог метаданных
"Двойная" авторизация
Публичность метаданных шардинга
DDL, конфигурация, справочные данные
_bucket, счетчики ссылок, таблицы маршрутизации
client1
client2
rights(client1) ⊆ rights(client2)
Получение избыточных прав
Сборщик мусора - долго, ненадежно
Динамическая типизация - избыточно
Интерпретируемый язык - медленно
Увеличение производительности сервера
Перепись на С, ускорение х1.5 - 2
Ускорение проксирования запросов
Нет распаковки/запаковки, ускорение пропорционально размеру запросов
Бесплатный прокси на localhost
Запрос через прокси к самому себе обрабатывается так же, как без прокси
Кластерная репликация
Распространение схемы данных, справочных данных, конфигурации, глобальный SQL
Инкапсуляция метаданных
Нельзя испортить _bucket, ссылки, таблицы маршрутизации, они скрыты
Прозрачная авторизация
Запросы от прокси неотличимы от клиентских
Итого ожидается ускорение х4 - 5
Хранилище
Маршрутизатор
Интеграция
Расширение
Локальная группа - replica-local и временные спейсы, Lua-таблицы
Группа репликасета - не шардируемые спейсы
Группа кластера - метаданные шардируемых спейсов
box.schema.create_space(‘test’, {is_global = true})
gh-3982: Репликация на кластер
- размер кластера
- количество соединений на узел
- количество соединений в кластере
- количество соединений растет экспоненциально
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 - системное поле, но хранится, как обычное
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}
gh-3988: Реализация отправки бакетов
vshard.storage.bucket_send - базовый компонент bucket-шардинга
Read
Write
Сеть
Read
Write
Read
Write
Авто-балансировка
Восстановление
box.cfg{
shard_count = 30000,
shard_replicaset_weight = 100,
shard_max_receiving = 10,
shard_disbalance_threshold = 0.01,
}
[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})
gh-3982: Репликация на кластер
gh-3983: Увеличение размера векторных часов
gh-3984: Удаление фулмеша
gh-3985: Системные поля
gh-3986: Создание спейса _bucket
gh-3987: Системный индекс по bucket_id
gh-3988: Реализация отправки бакетов
gh-3992: Авто-балансировка
gh-3991: Восстановление
gh-3994: Ассоциация запроса с bucket_id
gh-3995: Автозаполнение таблицы маршрутизации
vshard/gh-168: Балансировка запросов
vshard/gh-161: Параллельная отправка бакетов
Ускорение ребалансировки в worker_count раз
worker_count файберов
vshard/gh-126: Статистика бакетов
Баланс бакетов ≠ баланс данных
Статистика покажет реальные размеры бакетов
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)
Сейчас:
Будет:
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
69% - 78/113
Стабильный релиз в марте
SQL
Готовность к продакшену
Подготовка синхронной репликации
Прочее:
Релиз в марте
box.space
Space explorer
AD аутентификация
Прочие улучшения