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

28
Опыт переезда соцсети с Livestreet (PHP/MySQL) на NodeJS/Redis/LUA Дмитрий Дегтярев

Upload: ontico

Post on 24-Jun-2015

1.066 views

Category:

Documents


3 download

DESCRIPTION

HighLoad++ 2013

TRANSCRIPT

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

Опыт переезда соцсети с Livestreet (PHP/MySQL) на

NodeJS/Redis/LUA

Дмитрий Дегтярев

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

Чего в докладе нет

Highload

Silver bullet

Авторитет Гуру

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

План доклада

• Что лечим: Область применения, постановка задачи.

• Тестируем лекарство: Синтетические бенчмарки.

• Механика применения: Советы по использованию.

• Обмен опытом, обсуждение

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

Область применения: онлайн каталоги

• Интернет-магазины, блоги, аукционы, сайты объявлений, знакомств, соц. сети…

• Основные запросы: чтение списка «товаров» с фасетным поиском, страница «товара»

• Информация часто меняется – счетчики лайков, цены, наличие, дата последнего комментария

• Множество блоков «смотрите также», «аксессуары», «еще на эту тему», «сейчас обсуждают» и т.д.

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

7dach

Page 6: Дмитрий Дегтярев, "Хабикаса"
Page 7: Дмитрий Дегтярев, "Хабикаса"
Page 8: Дмитрий Дегтярев, "Хабикаса"

Что имеем сейчас: время отдачи страниц

0

1000

2000

3000

4000

5000

6000

Livestreet Livestreet nocache

Magento Magento nocache

Custom PHP

Custom PHP

nocache

SQL запросов

msec

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

Постановка задачи

• Сокращение времени генерации страницы

• Избавление от кэшей и необходимости их валидации

• Применение удобных для разработки языков

• Упрощение архитектуры, сокращение кол-ва элементов

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

Предпосылки к изменению: RAM

Источник: http://www.jcmit.com/mem2013.htm

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

Предпосылки: Junk-информация

Junk информация:

• Посты, лайки, комменты, описания товаров, рекомендации товаров, статистика кликов, чат-сообщения, счетчики нового

• Не требует 100% целостности

Транзакционная информация:

• Цены, платежи, заказы

Медиа информация:

• Картинки, видео, аудио

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

Предпосылки: умные и быстрые клиенты • Развитие стандартов HTML5, JavaScript: ECMA-262, edition 5

• Развитие клиентских библиотек: AngularJS, EmberJS, … много

• Развитие клиентского железа: память, процессоры

• Развитие поисковиков: Google _escaped_fragment_

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

Типичный представитель логики в веб-сервере: PHP+MySQL+MemCached

• постоянный маршаллинг данных PHP - MySQL - Memcached

• процессы инициализации фреймворка при каждом вызове

• кэши и механизмы их инвалидации

• нормализованная структура данных и множество операций JOIN таблиц

• обращения к ФС, в том числе со стороны БД

• часто борьба с транзакциями там, где они не нужны

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

“Обычная” архитектура

СУБД

Кэш

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

Логика Шаблонизатор Браузер

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

Фрагменты HTML

HTML

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

Разносим логику

Варианты реализации:

• Redis + LUA

• Postgres + PL/SQL (умеет делать JSON)

• …другие варианты

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

Логика Шаблонизатор Браузер JSON JSON

Логика Прокси

HandleBars Ember Ember-data NodeJS LUA Redis

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

Тестируем на данных блога • Топик - id, название, дата, анонс, картинка, пара счетчиков, author_id

• Автор - id, имя, аватар

• 3000 топиков, 1200 авторов

• Получаем JSON со списком всех топиков и списком уникальных авторов

• Embedding = SQL JOIN, дублирование данных

• Sideloading = сокращение объема данных, передача только уникальных объектов

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

Результаты тестирования

0,00

5,00

10,00

15,00

20,00

25,00

30,00

35,00

PHP MySQL PHP MySQL MemCached

Postgres Redis Lua

Один поток

8 потоков

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

Postgres: работа с JSON

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

Redis+ LUA

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

Выводы

• MySQL + Memcached это очень быстро для простых запросов

• JSON функции в Postgres медленные

• Redis не хватает многопоточной версии

Исходные коды тестов:

https://github.com/Mitek99/dblogic-benchmark

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

Тестируем выборки с суммированием

0

5

10

15

20

25

PHP + MySQL Redis + Lua

1 поток

8 потоков

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

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

MySQL

Page 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

5 3 3 3 2 1 1

sum_tags

ZRANGE sum_tags 0 -1

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

Выводы

• MySQL и Postgres сами по себе очень быстрые

• Медленными оказываются «движки» с плагинами

• Логику на Redis+Lua писать можно и даже приятно

• Сразу проектировать Master-Master репликацию уровня приложения

• Redis можно и нужно оптимизировать

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

Хранение, индексы, сортировки и выборки • WHERE FIELD=VALUE

• ORDER BY … LIMIT N

• GROUP BY

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

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

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

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

Возможности библиотеки RNode

• Создание и обновление индексов

• Выборки с ограничениями по тэгам

• Суммирование по тэгам для построения фильтров

• Sideloading связанных объектов

• …Постоянно развивается

• Доступно на GitHub: https://github.com/Mitek99/rnode