SlideShare a Scribd company logo
1 of 28
Опыт переезда соцсети с
Livestreet (PHP/MySQL) на
NodeJS/Redis/LUA
Дмитрий Дегтярев
Чего в докладе нет
Highload
Silver bullet
Авторитет Гуру
План доклада
• Что лечим: Область применения, постановка задачи.

• Тестируем лекарство: Синтетические бенчмарки.
• Механика применения: Советы по использованию.
• Обмен опытом, обсуждение
Область применения: онлайн каталоги
• Интернет-магазины, блоги, аукционы, сайты объявлений,
знакомств, соц. сети…
• Основные запросы: чтение списка «товаров» с фасетным
поиском, страница «товара»
• Информация часто меняется – счетчики лайков, цены, наличие,
дата последнего комментария
• Множество блоков «смотрите также», «аксессуары», «еще на эту
тему», «сейчас обсуждают» и т.д.
7dach
Что имеем сейчас: время отдачи
страниц
6000
5000
4000

3000
2000
1000

0

SQL запросов
msec
Постановка задачи
• Сокращение времени генерации страницы
• Избавление от кэшей и необходимости их валидации
• Применение удобных для разработки языков
• Упрощение архитектуры, сокращение кол-ва элементов
Предпосылки к изменению: RAM

Источник: http://www.jcmit.com/mem2013.htm
Предпосылки: Junk-информация
Junk информация:
• Посты, лайки, комменты, описания товаров, рекомендации
товаров, статистика кликов, чат-сообщения, счетчики нового
• Не требует 100% целостности
Транзакционная информация:
• Цены, платежи, заказы
Медиа информация:
• Картинки, видео, аудио
Предпосылки: умные и быстрые
клиенты
• Развитие стандартов HTML5, JavaScript: ECMA-262, edition 5
• Развитие клиентских библиотек: AngularJS, EmberJS, … много
• Развитие клиентского железа: память, процессоры
• Развитие поисковиков: Google _escaped_fragment_
Типичный представитель логики в вебсервере: PHP+MySQL+MemCached
• постоянный маршаллинг данных PHP - MySQL - Memcached
• процессы инициализации фреймворка при каждом вызове
• кэши и механизмы их инвалидации
• нормализованная структура данных и множество операций JOIN
таблиц
• обращения к ФС, в том числе со стороны БД
• часто борьба с транзакциями там, где они не нужны
“Обычная” архитектура
HTML
Браузер

Шаблонизатор

Логика

Фрагменты
HTML

Доступ к
данным

Результаты
запросов, объекты
Кэш

СУБД
Разносим логику
Шаблонизатор

Логика

HandleBars

Браузер

Доступ к
данным

Ember

Ember-data

Варианты реализации:
• Redis + LUA
• Postgres + PL/SQL (умеет делать JSON)
• …другие варианты

JSON

Прокси
NodeJS

JSON

Логика

Кэш

LUA

Redis
Тестируем на данных блога
•
•
•
•

Топик - id, название, дата, анонс, картинка, пара счетчиков, author_id
Автор - id, имя, аватар
3000 топиков, 1200 авторов
Получаем JSON со списком всех топиков и списком уникальных
авторов

• Embedding = SQL JOIN, дублирование данных
• Sideloading = сокращение объема данных, передача только
уникальных объектов
Результаты тестирования
35.00
30.00
25.00
20.00
Один поток

15.00

8 потоков

10.00
5.00
0.00
PHP MySQL

PHP MySQL MemCached

Postgres

Redis Lua
Postgres: работа с JSON
Redis+
LUA
Выводы
• MySQL + Memcached это очень быстро для простых запросов
• JSON функции в Postgres медленные
• Redis не хватает многопоточной версии

Исходные коды тестов:
https://github.com/Mitek99/dblogic-benchmark
Тестируем выборки с суммированием
25
20
15
1 поток
10

8 потоков

5
0

PHP + MySQL
* ZUNIONSTORE + Sorted Set = очень медленно

Redis + Lua
MySQL
Redis + LUA: как устроено
topic1_tags

topic2_tags

topic3_tags

topic4_tags

topic5_tags

ZUNIONSTORE sum_tags 5 topic1_tags topics2_tags topic3_tags topic5_tags AGGREGATE SUM
sum_tags
5 3 3 3 2 1 1

ZRANGE sum_tags 0 -1
Выводы
• MySQL и Postgres сами по себе очень быстрые
• Медленными оказываются «движки» с плагинами
• Логику на Redis+Lua писать можно и даже приятно
• Сразу проектировать Master-Master репликацию уровня
приложения
• Redis можно и нужно оптимизировать
Хранение, индексы, сортировки и
выборки
• WHERE FIELD=VALUE

Создаем тэг “FIELD=VALUE” и ключ типа SET со
множеством ID записей имеющих этот тэг.
Используем SINTERSTORE или SUNIONSTORE

• ORDER BY … LIMIT N

Создаем SORTED SET и используем ZINTERSTORE для
выборки отсортированных элементов, потом
ZRANGE для выбора N первых элементов

• GROUP BY

Создаем SORTED SET и используем ZINTERSTORE для
выборки отсортированных элементов
Возможности библиотеки RNode
• Создание и обновление индексов
• Выборки с ограничениями по тэгам
• Суммирование по тэгам для построения фильтров
• Sideloading связанных объектов
• …Постоянно развивается
• Доступно на GitHub: https://github.com/Mitek99/rnode

More Related Content

What's hot

"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12
"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12
"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12MoscowJS
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetOntico
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...Vyacheslav Nikulin
 
Павел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпалПавел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпалKsenia Rogachenko
 
Особенности тестирования NoSQL приложений
Особенности тестирования NoSQL приложенийОсобенности тестирования NoSQL приложений
Особенности тестирования NoSQL приложенийSQALab
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Alexey Zinoviev
 
Где сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchГде сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchИлья Середа
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Yandex
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитикиИлья Середа
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Yandex
 
72 - Spring. Создание абстрактного уровня. Разбор д/з
72 - Spring. Создание абстрактного уровня. Разбор д/з72 - Spring. Создание абстрактного уровня. Разбор д/з
72 - Spring. Создание абстрактного уровня. Разбор д/зRoman Brovko
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноRoman Dvornov
 
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
Как мы строили аналитическую платформу на несколько миллиардов событии в месяцКак мы строили аналитическую платформу на несколько миллиардов событии в месяц
Как мы строили аналитическую платформу на несколько миллиардов событии в месяцMikhail Tabunov
 
High load++2016.highlights (dropbox+clickhouse)
High load++2016.highlights (dropbox+clickhouse)High load++2016.highlights (dropbox+clickhouse)
High load++2016.highlights (dropbox+clickhouse)Pavel Alexeev
 
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...Ontico
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Roman Dvornov
 
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)Ontico
 
«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013
«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013
«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 20132ГИС Технологии
 
Электронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaЭлектронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaRoman Zykov
 

What's hot (20)

"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12
"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12
"CSScomb.js — вторая жизнь" — Михаил Трошев, Яндекс — доклад на MoscowJS 12
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreet
 
кри 2014 elastic search рациональный подход к созданию собственной системы а...
кри 2014 elastic search  рациональный подход к созданию собственной системы а...кри 2014 elastic search  рациональный подход к созданию собственной системы а...
кри 2014 elastic search рациональный подход к созданию собственной системы а...
 
Павел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпалПавел Прищепа. Бббыстрый бэкенд на базе друпал
Павел Прищепа. Бббыстрый бэкенд на базе друпал
 
Особенности тестирования NoSQL приложений
Особенности тестирования NoSQL приложенийОсобенности тестирования NoSQL приложений
Особенности тестирования NoSQL приложений
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
 
Где сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearchГде сегодня использовать ElasticSearch
Где сегодня использовать ElasticSearch
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
 
Построение системы аналитики
Построение системы аналитикиПостроение системы аналитики
Построение системы аналитики
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
 
72 - Spring. Создание абстрактного уровня. Разбор д/з
72 - Spring. Создание абстрактного уровня. Разбор д/з72 - Spring. Создание абстрактного уровня. Разбор д/з
72 - Spring. Создание абстрактного уровня. Разбор д/з
 
Компонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективноКомпонентный подход: скучно, неинтересно, бесперспективно
Компонентный подход: скучно, неинтересно, бесперспективно
 
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
Как мы строили аналитическую платформу на несколько миллиардов событии в месяцКак мы строили аналитическую платформу на несколько миллиардов событии в месяц
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
 
High load++2016.highlights (dropbox+clickhouse)
High load++2016.highlights (dropbox+clickhouse)High load++2016.highlights (dropbox+clickhouse)
High load++2016.highlights (dropbox+clickhouse)
 
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
Простая и дешёвая бизнес-аналитика на базе Google BigQuery / Алексей Паршуков...
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
 
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
 
«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013
«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013
«Система развёртывания многокомпонентного сервиса» — Алексей Салов, YaC 2013
 
No sql.mongodb scaling
No sql.mongodb scalingNo sql.mongodb scaling
No sql.mongodb scaling
 
Электронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark ScalaЭлектронная коммерция: от Hadoop к Spark Scala
Электронная коммерция: от Hadoop к Spark Scala
 

Viewers also liked

Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)
Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)
Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)chatbotscommunity
 
#1 Global Chatbots Meetup with @my pokerbot
#1 Global Chatbots Meetup with @my pokerbot#1 Global Chatbots Meetup with @my pokerbot
#1 Global Chatbots Meetup with @my pokerbotchatbotscommunity
 
Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)
Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)
Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)chatbotscommunity
 
Chatbots Analytics - Медицина (Анна Науменко)
Chatbots Analytics - Медицина (Анна Науменко)Chatbots Analytics - Медицина (Анна Науменко)
Chatbots Analytics - Медицина (Анна Науменко)chatbotscommunity
 
#1 Global Chatbots Meetup with @WomanSosBot
#1 Global Chatbots Meetup with @WomanSosBot#1 Global Chatbots Meetup with @WomanSosBot
#1 Global Chatbots Meetup with @WomanSosBotchatbotscommunity
 
Join #1 Global Chatbots Hackathon with Webinar.ru
Join #1 Global Chatbots Hackathon with Webinar.ruJoin #1 Global Chatbots Hackathon with Webinar.ru
Join #1 Global Chatbots Hackathon with Webinar.ruchatbotscommunity
 
Chatbots Сommunity 3 Months Dynamics
Chatbots Сommunity 3 Months DynamicsChatbots Сommunity 3 Months Dynamics
Chatbots Сommunity 3 Months Dynamicschatbotscommunity
 

Viewers also liked (7)

Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)
Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)
Chatbots Meetup 16.04.2016 - Чатботы в Битрикс24 (Кисляков Антон)
 
#1 Global Chatbots Meetup with @my pokerbot
#1 Global Chatbots Meetup with @my pokerbot#1 Global Chatbots Meetup with @my pokerbot
#1 Global Chatbots Meetup with @my pokerbot
 
Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)
Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)
Chatbots Meetup 16.04.2016 - Диалоговые движки (Осадченко Григорий)
 
Chatbots Analytics - Медицина (Анна Науменко)
Chatbots Analytics - Медицина (Анна Науменко)Chatbots Analytics - Медицина (Анна Науменко)
Chatbots Analytics - Медицина (Анна Науменко)
 
#1 Global Chatbots Meetup with @WomanSosBot
#1 Global Chatbots Meetup with @WomanSosBot#1 Global Chatbots Meetup with @WomanSosBot
#1 Global Chatbots Meetup with @WomanSosBot
 
Join #1 Global Chatbots Hackathon with Webinar.ru
Join #1 Global Chatbots Hackathon with Webinar.ruJoin #1 Global Chatbots Hackathon with Webinar.ru
Join #1 Global Chatbots Hackathon with Webinar.ru
 
Chatbots Сommunity 3 Months Dynamics
Chatbots Сommunity 3 Months DynamicsChatbots Сommunity 3 Months Dynamics
Chatbots Сommunity 3 Months Dynamics
 

Similar to Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)

Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Ontico
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...Yandex
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС 2ГИС Технологии
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...Ontico
 
NoBigData - потоковая система аналитики clientside производительности, Сергей...
NoBigData - потоковая система аналитики clientside производительности, Сергей...NoBigData - потоковая система аналитики clientside производительности, Сергей...
NoBigData - потоковая система аналитики clientside производительности, Сергей...Ontico
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
Павел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе ДрупалПавел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе ДрупалDrupalSib
 
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Stas Vyschepan
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Ontico
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...it-people
 
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)Ontico
 
CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...
CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...
CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...CodeFest
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...Ontico
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 

Similar to Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian) (20)

Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
FrontTalks: Роман Дворнов (Ostrovok.ru), «Basis.js: почему я не бросил разраб...
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
 
NoBigData - потоковая система аналитики clientside производительности, Сергей...
NoBigData - потоковая система аналитики clientside производительности, Сергей...NoBigData - потоковая система аналитики clientside производительности, Сергей...
NoBigData - потоковая система аналитики clientside производительности, Сергей...
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
Павел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе ДрупалПавел Прищепа. Бббыстрый бэкенд на базе Друпал
Павел Прищепа. Бббыстрый бэкенд на базе Друпал
 
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
Использование SOA для построения сложных веб проектов - Виталий Глибин, PyCon...
 
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
MySQL® и MongoDB® - когда что лучше использовать? / Петр Зайцев (Percona)
 
CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...
CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...
CodeFest 2012. Сапегин А. — Архитектура сайта Alawar.ru с учетом высоких нагр...
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 

Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)

  • 1. Опыт переезда соцсети с Livestreet (PHP/MySQL) на NodeJS/Redis/LUA Дмитрий Дегтярев
  • 2. Чего в докладе нет Highload Silver bullet Авторитет Гуру
  • 3. План доклада • Что лечим: Область применения, постановка задачи. • Тестируем лекарство: Синтетические бенчмарки. • Механика применения: Советы по использованию. • Обмен опытом, обсуждение
  • 4. Область применения: онлайн каталоги • Интернет-магазины, блоги, аукционы, сайты объявлений, знакомств, соц. сети… • Основные запросы: чтение списка «товаров» с фасетным поиском, страница «товара» • Информация часто меняется – счетчики лайков, цены, наличие, дата последнего комментария • Множество блоков «смотрите также», «аксессуары», «еще на эту тему», «сейчас обсуждают» и т.д.
  • 6.
  • 7.
  • 8. Что имеем сейчас: время отдачи страниц 6000 5000 4000 3000 2000 1000 0 SQL запросов msec
  • 9. Постановка задачи • Сокращение времени генерации страницы • Избавление от кэшей и необходимости их валидации • Применение удобных для разработки языков • Упрощение архитектуры, сокращение кол-ва элементов
  • 10. Предпосылки к изменению: RAM Источник: http://www.jcmit.com/mem2013.htm
  • 11. Предпосылки: Junk-информация Junk информация: • Посты, лайки, комменты, описания товаров, рекомендации товаров, статистика кликов, чат-сообщения, счетчики нового • Не требует 100% целостности Транзакционная информация: • Цены, платежи, заказы Медиа информация: • Картинки, видео, аудио
  • 12. Предпосылки: умные и быстрые клиенты • Развитие стандартов HTML5, JavaScript: ECMA-262, edition 5 • Развитие клиентских библиотек: AngularJS, EmberJS, … много • Развитие клиентского железа: память, процессоры • Развитие поисковиков: Google _escaped_fragment_
  • 13. Типичный представитель логики в вебсервере: PHP+MySQL+MemCached • постоянный маршаллинг данных PHP - MySQL - Memcached • процессы инициализации фреймворка при каждом вызове • кэши и механизмы их инвалидации • нормализованная структура данных и множество операций JOIN таблиц • обращения к ФС, в том числе со стороны БД • часто борьба с транзакциями там, где они не нужны
  • 15. Разносим логику Шаблонизатор Логика HandleBars Браузер Доступ к данным Ember Ember-data Варианты реализации: • Redis + LUA • Postgres + PL/SQL (умеет делать JSON) • …другие варианты JSON Прокси NodeJS JSON Логика Кэш LUA Redis
  • 16. Тестируем на данных блога • • • • Топик - id, название, дата, анонс, картинка, пара счетчиков, author_id Автор - id, имя, аватар 3000 топиков, 1200 авторов Получаем JSON со списком всех топиков и списком уникальных авторов • Embedding = SQL JOIN, дублирование данных • Sideloading = сокращение объема данных, передача только уникальных объектов
  • 17. Результаты тестирования 35.00 30.00 25.00 20.00 Один поток 15.00 8 потоков 10.00 5.00 0.00 PHP MySQL PHP MySQL MemCached Postgres Redis Lua
  • 20. Выводы • MySQL + Memcached это очень быстро для простых запросов • JSON функции в Postgres медленные • Redis не хватает многопоточной версии Исходные коды тестов: https://github.com/Mitek99/dblogic-benchmark
  • 21. Тестируем выборки с суммированием 25 20 15 1 поток 10 8 потоков 5 0 PHP + MySQL * ZUNIONSTORE + Sorted Set = очень медленно Redis + Lua
  • 22. MySQL
  • 23. Redis + LUA: как устроено topic1_tags topic2_tags topic3_tags topic4_tags topic5_tags ZUNIONSTORE sum_tags 5 topic1_tags topics2_tags topic3_tags topic5_tags AGGREGATE SUM sum_tags 5 3 3 3 2 1 1 ZRANGE sum_tags 0 -1
  • 24.
  • 25. Выводы • MySQL и Postgres сами по себе очень быстрые • Медленными оказываются «движки» с плагинами • Логику на Redis+Lua писать можно и даже приятно • Сразу проектировать Master-Master репликацию уровня приложения • Redis можно и нужно оптимизировать
  • 26.
  • 27. Хранение, индексы, сортировки и выборки • WHERE FIELD=VALUE Создаем тэг “FIELD=VALUE” и ключ типа SET со множеством ID записей имеющих этот тэг. Используем SINTERSTORE или SUNIONSTORE • ORDER BY … LIMIT N Создаем SORTED SET и используем ZINTERSTORE для выборки отсортированных элементов, потом ZRANGE для выбора N первых элементов • GROUP BY Создаем SORTED SET и используем ZINTERSTORE для выборки отсортированных элементов
  • 28. Возможности библиотеки RNode • Создание и обновление индексов • Выборки с ограничениями по тэгам • Суммирование по тэгам для построения фильтров • Sideloading связанных объектов • …Постоянно развивается • Доступно на GitHub: https://github.com/Mitek99/rnode