SlideShare a Scribd company logo
Отказоустойчивая
обработка 10 миллионов
OAuth токенов на Tarantool
Mons Anderson
Игорь Латкин
супероптимальность и
производительность
дисковое хранилище - vinyl
json документы
2 / 67
Что ещё…
3 / 67
Get your
data in RAM
Compute
close to data
Enjoy the
performance
4 / 67
О чём мы будем рассказывать?
5 / 67
О чём мы будем рассказывать?
Оглянемся назад: что было 3 года назад?
6 / 67
О чём мы будем рассказывать?
Оглянемся назад: что было 3 года назад?
Какие проблемы были?
7 / 67
О чём мы будем рассказывать?
Оглянемся назад: что было 3 года назад?
Какие проблемы были?
Master ⟷ Master репликация
8 / 67
О чём мы будем рассказывать?
Оглянемся назад: что было 3 года назад?
Какие проблемы были?
Master ⟷ Master репликация
В поисках Ra 'а
9 / 67
О чём мы будем рассказывать?
Оглянемся назад: что было 3 года назад?
Какие проблемы были?
Master ⟷ Master репликация
В поисках Ra 'а
Объединяем Ra и шардинг
10 / 67
О чём мы будем рассказывать?
Оглянемся назад: что было 3 года назад?
Какие проблемы были?
Master ⟷ Master репликация
В поисках Ra 'а
Объединяем Ra и шардинг
Оцениваем результат
11 / 67
Зачем?
Сборщики почты
Вход внешней почтой
Хранение адресных книг
Выдача действующего access_token
12 / 67
Что такое OAuth токен?
{
"token_type" : "bearer",
"access_token" : "XXXXXX",
"refresh_token" : "YYYYYY",
"expires_in" : 3600
}
13 / 67
2013 г.
первая схема
классика (M-S)
Ref Ref
rw
Master Slave
F
rw
F
rw
ro
rw
replication
ro
14 / 67
Что такое OAuth токен?
{
"token_type" : "bearer",
"access_token" : "XXXXXX",
"refresh_token" : "YYYYYY",
"expires_in" : 3600
}
15 / 67
Проблемы?
16 / 67
Проблемы?
25% Outage за 15 минут
50% Outage за 30 минут
100% Outage за 1 час
17 / 67
Проблемы?
25% Outage за 15 минут
50% Outage за 30 минут
100% Outage за 1 час
2015 г. - 100% CPU (много бизнес-логики и индексов)
Вторичная логика влияет на основную задачу
18 / 67
1.6 +
Новый Tarantool
Master-Master
replica on
19 / 67
ⓘ
3 датацентра
3 копии
MM - репликация
20 / 67
Ref
Ref
M
M
M
Ref
M100
Datapro
Dataline
21 / 67
Ref
Ref
M
M
M
Ref
M100
Datapro
Dataline
в 3 раза
больше
запросов
нужен
выбор
лидера
22 / 67
Paxos ?
23 / 67
Paxos ?
24 / 67
Ra !
25 / 67
M
M
M
M100
Datapro
Dataline
net.box
26 / 67
M
M
M
M100
Datapro
Dataline
net.box
require 'net.box'
--[[
tarantool
to tarantool
connector
]]
27 / 67
M
M
M
M100
Datapro
Dataline
Ra
Leader
Follower Follower
реализуем
только
выбор
лидера
28 / 67
Ra Leader Elec on (on lua)
local r = self.pool.call(self.FUNC.request_vote, self.term, self.uuid)
self._vote_count = self:count_votes(r)
if self._vote_count > self._nodes_count / 2 then
log.info("[raft-srv] node %d won elections", self.id)
self:_set_state(self.S.LEADER)
self:_set_leader({ id=self.id, uuid=self.uuid })
self._vote_count = 0
self:stop_election_timer()
self:start_heartbeater()
else
log.info("[raft-srv] node %d lost elections", self.id)
self:_set_state(self.S.IDLE)
self:_set_leader(msgpack.NULL)
self._vote_count = 0
self:start_election_timer()
end
29 / 67
Ref
Ref
M
M
M
Ref
M100
Datapro
Dataline
Leader
Follower Follower
30 / 67
Ref
Ref
M
M
M
Ref
M100
Datapro
Dataline
Leader
Follower Follower
⅓
⅓
⅓
только
лидер
раздаёт
задачи
x 1
запросов
31 / 67
Ref
Ref
M
M
M
Ref
M100
Datapro
Dataline
Leader
Abandoned Follower
Ra
?
случился split
две ноды ok,
одна оторвана
32 / 67
x = 1x = 1
x := 2 x := 3
x = 3 x = 2
x = 2 x = 3
M-M
реплицирует
все изменения
33 / 67
x = 1x = 1
x := 2 x := 3
x = 3 x = 2
x = 2 x = 3
M-M
реплицирует
все изменения
консистентность?
34 / 67
OAuth Token
Refresh-T
Access-T
∞*
1 h
Token
Refresh( Refresh-T ) = Access-T1
Refresh( Refresh-T ) = Access-T2
...
:
:
35 / 67
R+A1
Leader Follower
replicate R+A1
split
R+A2 R+A3
split ends
R+A3 R+A2
R+A4
replicate
R+A4
Abandoned
refresher
работает и
с leader и с
abandoned
36 / 67
Обычно
связанных нод
N/2 + 1
запросов max
1x
Доступность
37 / 67
Обычно
связанных нод
N/2 + 1
запросов max
1x
У нас
связанных нод
1
запросов max
Nx
Доступность
38 / 67
100% CPU
Осталась ещё одна проблема
39 / 67
100% CPU Sharding!
Осталась ещё одна проблема
40 / 67
100% CPU Sharding!
Осталась ещё одна проблема
Кто знает что такое шардинг?
41 / 67
100% CPU Sharding!
Осталась ещё одна проблема
Кто знает что такое шардинг?
Кто делал свой шардинг?
42 / 67
Shard #2
Master 2
Slave 2
f(key) ➝ shard #
Shard #1
Master 1
Slave 1
43 / 67
Client1 f(key) Client2f(key)
Shard #1
Shard #2
Shard #N
44 / 67
Client1 Client2
Shard #1
Shard #2
Shard #N
f(key)
f(key)
f(key)
45 / 67
Shard #1
M
M M M
MM
Leader
Leader
Shard #2
46 / 67
Shard #1
M
M M M
MM
f(key) = sh #1
Leader
Leader
Shard #2
47 / 67
Shard #1
M
M M M
MM
f(key) = sh #2
Leader
Leader
Shard #2
48 / 67
А не много
ли соединений?
49 / 67
Проблема Full mesh:
N2 соединений
N × (N-1)
50 / 67
Shard #1
M
M M M
MM
Leader
Leader
Shard #2
P P
51 / 67
N × const
const = p + n - 1
(n = 3, p = 3)
52 / 67
MM + Ra + Shard + Proxy = Cluster
53 / 67
F F
R R... Rab Rab...
1 1Tokens
Cluster
Address Book
Cluster
54 / 67
Shard #1
M
M M M
MM
Leader
Leader
Shard #2
P P
55 / 67
to refresh no need to refreshexpired
60s
first
order
old age
second
order
4 min
third
order
1 hour
expira on me index
Refresh
56 / 67
no fy
put()
index
lookup or wait
wait
take()
session
stash
disconnect
channel
id status payloadme
pk
57 / 67
queue:put
function put(data)
local t = box.space.queue:auto_increment({
'r', --[[ status ]]
util.time(), --[[ time ]]
data --[[ any payload ]]
})
return t
end
58 / 67
queue:take
function take(timeout)
local start_time = util.time()
local q_ind = box.space.tokens.index.queue
local _,t
while true do
local it = util.iter(q_ind, {'r'}, { iterator = box.index.GE })
_,t = it()
if t and t[F.tokens.status] ~= 't' then
break
end
local left = (start_time + timeout) - util.time()
if left <= 0 then return end
t = q:wait(left)
if t then break end
end
t = q:taken(t)
return t
end
59 / 67
queue:taken
function queue:taken(task)
local sid = box.session.id()
if self._consumers[sid] == nil then
self._consumers[sid] = {}
end
local k = task[self.f_id]
local t = self:set_status(k, 't')
self._consumers[sid][k] = { util.time(), box.session.peer(sid), t }
self._taken[k] = sid
return t
end
60 / 67
queue:on_disconnect
function on_disconnect()
local sid = box.session.id
local now = util.time()
if self._consumers[sid] then
local consumers = self._consumers[sid]
for k,rec in pairs(consumers) do
time, peer, task = unpack(rec)
local v = box.space[self.space].index[self.index_primary]:get({k})
if v and v[self.f_status] == 't' then
v = self:release(v[self.f_id])
end
end
self._consumers[sid] = nil
end
end
61 / 67
Возможно ли
альтернативное решение?
62 / 67
Shard #1
Master 1
Slave 1
Shard #2
Master 2
Slave 2
DB Queue
Q3
Q2
Quorum
Validator
Q1
63 / 67
Итог
Проблема outage решена
Горизонтальное масштабирование
Проблема N2 сведена к N×const
Релизована логика на очереди под бизнес-задачу
64 / 67
Получено очень много опыта при
написании собственной реализации
Ra
65 / 67
Get your
data in RAM
Compute
close to data
Enjoy the
performance
66 / 67
tarantool.orgDocumenta on:
try.tarantool.orgTry it online:
github.com/tarantoolExplore it:
Ques ons?
67 / 67

More Related Content

What's hot (20)

PDF
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Ontico
 
PDF
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
PDF
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
 
PDF
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Ontico
 
PPTX
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Mail.ru Group
 
PDF
Where is the space, Postgres?
Alexey Ermakov
 
PPTX
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Ontico
 
PDF
Reform: путь к лучшему ORM
Badoo Development
 
PDF
Расширения для PostgreSQL
Anastasia Lubennikova
 
PDF
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
Yandex
 
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
Anastasia Lubennikova
 
PDF
Михаил Давыдов — JavaScript: Асинхронность
Yandex
 
PDF
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Alexey Lesovsky
 
PPT
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Ontico
 
ODP
Hacking PostgreSQL. Физическое представление данных
Anastasia Lubennikova
 
PDF
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Ontico
 
PDF
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
MoscowDataFest
 
PDF
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
Badoo Development
 
PDF
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Ontico
 
PDF
Как читать и интерпретировать вывод команды EXPLAIN
Alexey Ermakov
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Ontico
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
 
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Ontico
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Mail.ru Group
 
Where is the space, Postgres?
Alexey Ermakov
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Ontico
 
Reform: путь к лучшему ORM
Badoo Development
 
Расширения для PostgreSQL
Anastasia Lubennikova
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
Yandex
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Anastasia Lubennikova
 
Михаил Давыдов — JavaScript: Асинхронность
Yandex
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Alexey Lesovsky
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Ontico
 
Hacking PostgreSQL. Физическое представление данных
Anastasia Lubennikova
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Ontico
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
MoscowDataFest
 
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
Badoo Development
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Ontico
 
Как читать и интерпретировать вывод команды EXPLAIN
Alexey Ermakov
 

Viewers also liked (20)

PDF
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Ontico
 
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
Ontico
 
PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
PPTX
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Ontico
 
PPTX
Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Ma...
Ontico
 
PPTX
Как выбрать In-memory NoSQL базу данных с умом. Тестируем производительность ...
Ontico
 
PDF
Peeking into the Black Hole Called PL/PGSQL - the New PL Profiler / Jan Wieck...
Ontico
 
PDF
Archival Disc на смену Blu-ray: построение архивного хранилища на оптических ...
Ontico
 
PPTX
PostgreSQL @Alibaba Cloud / Xianming Dou (Alibaba Cloud)
Ontico
 
PDF
События, шины и интеграция данных в непростом мире микросервисов / Валентин Г...
Ontico
 
PDF
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Ontico
 
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
PDF
Барнаул15
Михаил Тюрин
 
PDF
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Ontico
 
PPTX
Мониторинг всех слоев web проекта / Сивко Николай (hh.ru)
Ontico
 
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
PPTX
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Ontico
 
PPTX
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Ontico
 
PDF
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Ontico
 
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Ontico
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Ontico
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
Мастер-класс "Микросервисы: удобно, надежно, серебрянопульно" / Евгений Павло...
Ontico
 
Как смигрировать 50Пб в 32 без даунтайма? / Альберт Галимов, Андрей Сумин (Ma...
Ontico
 
Как выбрать In-memory NoSQL базу данных с умом. Тестируем производительность ...
Ontico
 
Peeking into the Black Hole Called PL/PGSQL - the New PL Profiler / Jan Wieck...
Ontico
 
Archival Disc на смену Blu-ray: построение архивного хранилища на оптических ...
Ontico
 
PostgreSQL @Alibaba Cloud / Xianming Dou (Alibaba Cloud)
Ontico
 
События, шины и интеграция данных в непростом мире микросервисов / Валентин Г...
Ontico
 
Как HeadHunter удалось безопасно нарушить RFC 793 (TCP) и обойти сетевые лову...
Ontico
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
Барнаул15
Михаил Тюрин
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Ontico
 
Мониторинг всех слоев web проекта / Сивко Николай (hh.ru)
Ontico
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Ontico
 
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Ontico
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Ontico
 
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
Ad

Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепелица, Игорь Латкин (Mail.ru)