Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?

748 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
748
On SlideShare
0
From Embeds
0
Number of Embeds
98
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?

  1. 1. Tarantool: как обработать 81.5^10 запросов в сутки? Константин Осипов, Mail.Ru
  2. 2. ПланОсновные проблемы масштабирования СУБДTarantool: решение из области shared nothingData patternsScalability patternsОбзор планов
  3. 3. СУБД: современный ландшафт
  4. 4. 2 проблемы РСУБД- горизонтальное масштабирование- rigid schemaNoSQL – мир энтузиастов:- новые модели данных- новые языки доступа к данным- новые модели консистентности данных- новые алгоритмы хранения данных- много, много методов масштабирования
  5. 5. Современный ландшафт БДОсновные проблемы масштабирования СУБДTarantool: решение из области MPIData patternsScalability patternsОбзор планов
  6. 6. Модель данныхПространства(spaces)Кортежи(tuples)Поля(fields)Индексы(indexes)
  7. 7. Модель данных (2)Соответствие терминов: Типы данных: Типы индексов:Tarantool РСУБД NUM HASHSpace Table NUM64 TREEField Column STRING
  8. 8. Модель данных (3)Индексы: простые, составные, уникальные, неуникальныеОперации: INSERT/SELECT/UPDATE/DELETE/REPLACEПоддерживается простой SQL
  9. 9. PHP интерфейс$tnt = new Tarantool($host, $port, $admPort);# $host – хост (def: localhost);# $port – порт (def: 33013);# $admPort – административный порт (def: 33015)
  10. 10. PHP: INSERT, UPDATEdefine(‘SNO’,0); // номер space$key = 12345$tuple = array($key,‘spb’,’Hello Word’);# если данные существуют, они замещаются$res = $tnt->insert(SNO, $tuple);$res = $tnt->delete(SNO, $key, [$flag]);$data = array(1 => ’msk’, 2 => ‘Hello Hi++!’);$res = $tnt->update(SNO, $key, $data);# $key – всегда первичный ключ# $data – асс. массив № поля => нов. значение
  11. 11. PHP интерфейс: SELECT$count = $tnt->select(SNO, $index, $key,[$limit,$offset]);# $key – ключ, возможен массив;# $index – номер индекса, по которому# осуществляется выборка;# default $limit = 0хFFFFFFFF, $offset = 0;# Возвращает количество найденных кортежей# Выборка данных осуществляется методом$tuple = $tnt->getTuple();
  12. 12. ПроизводительностьIntel I5 , 4G RAM, 7200 RPM SATA10 потоков, 200-300 байт кортежRedis: 120k writes, 270k readsTarantool: 100k writes, 260k reads
  13. 13. Auto-increment patternField 0 Field 1 = Phone Field2 = Name(PK)1 212-85-01 John Dow2 212-85-02 Clint Smith3 967-53-09 Cheryl Wood4 Новая строка
  14. 14. Auto-increment: PHPdefine(S_USER, 1); // номер space USERdefine(INC_NO,1); // номер ключа счетчикаdefine(COUNTER,1); // номер поля счетчика$key = $tnt->inc(SNO, INC_NO, COUNTER, [1, true]);$tnt->insert(NS_USER, $key, $data);
  15. 15. Auto-increment: Luafunction box.auto_increment(spaceno, ...) max_tuple = box.space[spaceno].index[0].idx:max() if max_tuple ~= nil then max = box.unpack(i, max_tuple[0]) else max = -1 end return box.insert(spaceno, max + 1, ...)end$tnt->call(SNO, “box.auto_increment”, $data);
  16. 16. Pattern FIFO: PHP primary key ... index.phpbegin pointer clients.phpend pointer contacts.php
  17. 17. Pattern FIFO: PHPFIFO POP:define(END_PTR, 5); // номер ключа End Pointer$key = $tnt->inc(NS, END_PTR, FD_COUNTER, -1, true);$data = $tnt->delete(NS_USER, $key, true);FIFO PUSH:define(BEG_PTR, 4); // номер ключа Beg Pointer$key = $tnt->inc(NS, BEG_PTR, FD_COUNTER, 1, true);$tnt->insert(NS_USER, $data);
  18. 18. Pattern FIFO: Luafunction fifo_push(name, val) fifo = find_or_create_fifo(name) top = box.unpack(i, fifo[1]) bottom = box.unpack(i, fifo[2]) if top == fifomax+2 then -- % size top = 3 … end return box.update(0, name, =p=p=p, 1, top, 2, bottom, top, val)end
  19. 19. Pattern Memcache• есть возможность создавать свои микро-потоки:• box.fiber.create(), box.fiber.yield()• создаёте хранимую процедуру, запускаете её• получаете custom expire process• используется для хранения сессий в mail.ru: 4 машины, по 2 Tarantool/Box на каждой, 2 мастера, и 2 реплики 40-60k requests/second, CPU usage < 20%
  20. 20. Pattern: справочникField 0, Primary Field1 = date Field2 = CityINDEX=0 INDEX=1rizaeyka@mail.ru 2011-05-09 SPBslavsyper@mail.ru 2011-09-09 MSKoxic10@mail.ru 2011-10-01 SPB
  21. 21. Масштабирование 0 ...10М Shard 1Application Tarantool Proxy 10...20М Shard 2 20+ М Shard 3
  22. 22. Что такое Tarantool Proxy• Многопоточный демон• Отправляет запросы на разные сервера• Определение сервера с помощью конфигурационногофайла или плагина
  23. 23. READ/WRITE scaling Shard 1 0 ...10МTarantool Proxy 10...20М Shard 2 SELECT WHERE key=k1,k2INSERT, UPDATE, Shard 3DELETE, SELECT 20+ М 0 ...10М Shard 1WHERE key=PK Tarantool Proxy 10...20М Shard 2 20+ М Shard 3
  24. 24. ПланыПоддержка транзакцийМастер-мастер репликацияКластер менеджерTarantool Proxy: load balancing
  25. 25. Спасибо! kostja.osipov@gmail.com http://tarantool.orghttp://habrahabr.ru/blogs/nosql/

×