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

  • 774 views
Uploaded on

HighLoad++ 2013

HighLoad++ 2013

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
774
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
12
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 SQL запросов 2000 msec 1000 0 Livestreet Livestreet Magento Magento Custom Custom nocache nocache PHP PHP nocache
  • 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 поток 8 потоков 10 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