Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
-
Upload
dmitry-degtyarev -
Category
Technology
-
view
260 -
download
2
description
Transcript of Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
![Page 1: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/1.jpg)
Опыт переезда соцсети с Livestreet
(PHP/MySQL) на NodeJS/Redis/LUA
Дмитрий Дегтярев
![Page 2: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/2.jpg)
Чего в докладе нет
Highload
Silver bullet
Авторитет Гуру
![Page 3: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/3.jpg)
План доклада
• Что лечим: Область применения, постановка задачи.
• Тестируем лекарство: Синтетические бенчмарки.
• Механика применения: Советы по использованию.
• Обмен опытом, обсуждение
![Page 4: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/4.jpg)
Область применения: онлайн каталоги• Интернет-магазины, блоги, аукционы, сайты объявлений,
знакомств, соц. сети…• Основные запросы: чтение списка «товаров» с фасетным
поиском, страница «товара»• Информация часто меняется – счетчики лайков, цены, наличие,
дата последнего комментария• Множество блоков «смотрите также», «аксессуары», «еще на эту
тему», «сейчас обсуждают» и т.д.
![Page 5: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/5.jpg)
7dach
![Page 6: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/6.jpg)
![Page 7: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/7.jpg)
![Page 8: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/8.jpg)
Что имеем сейчас: время отдачи страниц
Livestr
eet
Livestr
eet noca
che
Mag
ento
Mag
ento noca
che
Custom PHP
Custom PHP noca
che
0
1000
2000
3000
4000
5000
6000
SQL запросовmsec
![Page 9: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/9.jpg)
Постановка задачи
• Сокращение времени генерации страницы• Избавление от кэшей и необходимости их валидации• Применение удобных для разработки языков• Упрощение архитектуры, сокращение кол-ва элементов
![Page 10: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/10.jpg)
Предпосылки к изменению: RAM
Источник: http://www.jcmit.com/mem2013.htm
![Page 11: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/11.jpg)
Предпосылки: Junk-информацияJunk информация:• Посты, лайки, комменты, описания товаров, рекомендации
товаров, статистика кликов, чат-сообщения, счетчики нового• Не требует 100% целостности
Транзакционная информация:• Цены, платежи, заказы
Медиа информация: • Картинки, видео, аудио
![Page 12: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/12.jpg)
Предпосылки: умные и быстрые клиенты• Развитие стандартов HTML5, JavaScript: ECMA-262, edition 5• Развитие клиентских библиотек: AngularJS, EmberJS, … много• Развитие клиентского железа: память, процессоры• Развитие поисковиков: Google _escaped_fragment_
![Page 13: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/13.jpg)
Типичный представитель логики в веб-сервере: PHP+MySQL+MemCached
• постоянный маршаллинг данных PHP - MySQL - Memcached • процессы инициализации фреймворка при каждом вызове • кэши и механизмы их инвалидации • нормализованная структура данных и множество операций JOIN
таблиц • обращения к ФС, в том числе со стороны БД• часто борьба с транзакциями там, где они не нужны
![Page 14: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/14.jpg)
“Обычная” архитектура
СУБД
Кэш
Доступ к даннымЛогикаШаблонизаторБраузер
Результатызапросов, объекты
Фрагменты HTML
HTML
![Page 15: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/15.jpg)
Разносим логику
Варианты реализации:• Redis + LUA• Postgres + PL/SQL (умеет делать JSON)• …другие варианты
КэшДоступ к даннымЛогикаШаблонизаторБраузер
JSONJSONЛогикаПрокси
HandleBars Ember Ember-data NodeJS LUA Redis
![Page 16: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/16.jpg)
Тестируем на данных блога• Топик - id, название, дата, анонс, картинка, пара счетчиков, author_id • Автор - id, имя, аватар• 3000 топиков, 1200 авторов• Получаем JSON со списком всех топиков и списком уникальных авторов
• Embedding = SQL JOIN, дублирование данных• Sideloading = сокращение объема данных, передача только уникальных
объектов
![Page 17: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/17.jpg)
Результаты тестирования
PHP MySQL PHP MySQL MemCached
Postgres Redis Lua0.00
5.00
10.00
15.00
20.00
25.00
30.00
35.00
Один поток8 потоков
![Page 18: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/18.jpg)
Postgres: работа с JSON
![Page 19: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/19.jpg)
Redis+LUA
![Page 20: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/20.jpg)
Выводы
• MySQL + Memcached это очень быстро для простых запросов• JSON функции в Postgres медленные• Redis не хватает многопоточной версии
Исходные коды тестов: https://github.com/Mitek99/dblogic-benchmark
![Page 21: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/21.jpg)
Тестируем выборки с суммированием
PHP + MySQL Redis + Lua0
5
10
15
20
25
1 поток8 потоков
* ZUNIONSTORE + Sorted Set = очень медленно
![Page 22: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/22.jpg)
MySQL
![Page 23: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/23.jpg)
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: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/24.jpg)
![Page 25: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/25.jpg)
Выводы
• MySQL и Postgres сами по себе очень быстрые• Медленными оказываются «движки» с плагинами• Логику на Redis+Lua писать можно и даже приятно• Сразу проектировать Master-Master репликацию уровня
приложения• Redis можно и нужно оптимизировать
![Page 26: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/26.jpg)
![Page 27: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/27.jpg)
Хранение, индексы, сортировки и выборки• 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: Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)](https://reader036.fdocuments.us/reader036/viewer/2022062615/548c9c70b47959e7368b465e/html5/thumbnails/28.jpg)
Возможности библиотеки RNode
• Создание и обновление индексов• Выборки с ограничениями по тэгам• Суммирование по тэгам для построения фильтров• Sideloading связанных объектов• …Постоянно развивается• Доступно на GitHub: https://github.com/Mitek99/rnode