Дмитрий Дегтярев, "Хабикаса"

1,756 views
1,665 views

Published on

HighLoad++ 2013

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

  • Be the first to like this

No Downloads
Views
Total views
1,756
On SlideShare
0
From Embeds
0
Number of Embeds
1,116
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Дмитрий Дегтярев, "Хабикаса"

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

×