Your SlideShare is downloading. ×
0
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

308

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
308
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×