Upload
igor-malinovskiy
View
1.462
Download
8
Embed Size (px)
DESCRIPTION
Success-story о том, как из нестабильного легаси-проекта получить стабильное и масштабируемое решение. В докладе будут рассмотрены следующие вопросы: - c чего начать борьбу с узкими местами; - коротко о New Relic мониторинге; - проблемы распределения нагрузки с Amazon ELB; - почему решения на базе стандартных фреймверков могут не работать; - как и для чего мы используем Redis;
Citation preview
HighLoad.Наследство от дядюшки Ау
Игорь Малиновский@u_glidetinyurl.com/thinkphp8
Давайте знакомиться!
Было:
Стало:
Мертвы
й код Постоянные падения
Множество
дефектов
Нет тестов
Потеря прибыли
Тяжело
поддерживат
ь
Увеличени
е
прибыли
Continuous Delivery
A/B
Тестировани
е
Стабильное и масштабируемое решение
Никто не любит legacy code
+ =
+ + =
?
Понять с чем имеем дело
• Документации нет
• Читать код не
вариант
• У заказчика только
высокоуровневые
знания
функционала
… так с чего начать?!1. Исследуем инфраструктуру
Amazon ELB
Backend
NGINXPHP-FPM
Stat App
NFS Shar
e
Cache
NGINXPHP-FPM
… так с чего начать?!2. Мониторим приложение
http://newrelic.com/
… так с чего начать?!2.1Находим «узкие» места
… так с чего начать?!2.2 Определяем функционал, который реально используется
1st Bottleneck: Heavy Write to MySQL
Amazon ELB
Backend
NGINXPHP-FPM
Stat App
NFS Shar
e
Cache
NGINXPHP-FPM
DEAD CODE ?!
1st Application :
~322 000 lines (88% php)
2nd Application:
~347 000 lines (89% php)
Refactored code1st Application :
~146 000 lines (-65%) (85% php)
2nd Application:
~198 000 lines (-43%) (81% php)
+ NO FEAR :)
Проблемы Amazon Elastic Load Balancing
Amazon ELB
Backend
NGINXPHP-FPM
Stat App
NFS Shar
e
Cache
NGINXPHP-FPM
Проблемы Amazon Elastic Load Balancing
При скачкообразном повышении трафика Amazon ELB начинает масштабироваться
… да здравствует король.
HAProxyЧто хорошего:
1. Гибкая система ACL2. Не боится резких скачков3. Равномерно распределяет трафик
С чем придется смириться:
4. Нет веб-интерфейса для управления «из коробки»5. Достаточно сложная для рядового пользователя
установка и настройка
Время рефакторинга?
Сначала проанализируйте ошибки предыдущей команды
Что мы сделали с Yii
#ДавайДоСвидания
Если серьезно
• Yii был избыточен• Решаем небольшие проблемы большими инструментами• Сложное создание
сущностей• Не решена проблема
удаления
Что получилось
Components
Что получилось
Response time0
100
200
300
400
500
600
700
800
Old versionNew Code
Ускорение x5
Что получилось
Время
10/24/2013 09/24/2013 08/25/2013 07/26/2013 06/26/2013 05/27/2013 04/27/2013 03/28/2013 02/26/2013 01/23/2013 0
5,000,000
10,000,000
15,000,000
20,000,000
25,000,000
30,000,000
35,000,000
40,000,000
45,000,000
PageViews
Мы взяли
проект
СейчасПосещаемость
x20
Что получилось
HAProxy
Backend
NGINX+redislog
PHP-FPM
Stat App
PerconaNGINX
PHP-FPM
Component
s
+ twemproxy
String Hash List Set ZSet
Для чего используем
• Application data
• Statistics data
• Nginx logs (redislog)
Redislog
Request Store logs
Configuration:
• connection options
• key to store data
• operation to store data
• can specify conditions
Redis
Автор слайда: @loginwashere
Redis Gotchas
Memory fragmentation> redis-cli info# Memory
used_memory:613992used_memory_human:599.60Kused_memory_rss:2113536used_memory_peak:1155944used_memory_peak_human:1.10Mused_memory_lua:31744
mem_fragmentation_ratio:3.44mem_allocator:jemalloc-3.0.0
Автор слайда: @loginwashere
Redis Gotchas
PersistenceSAVE is blockingBGSAVE needs free RAM (or swap)
I'm SAVE
I'm BGSAVE
I want to persist redis
Ha-Ha -Ha
Автор слайда: @loginwashere
Redis Gotchas
NO ClusterСейчас в активной разработке
Client-side sharding:- Predis- Twemproxy aka Nutcracker
Redis Gotchas
There is no good old SQLYog for redis
For small datasets
• phpredisadmin
• redis commander
Автор слайда: @loginwashere
Redis Desktop Manager BETA
http://redisdesktop.com/
To be continued…
В следующей серии:- Continuous Delivery.
Рецепты внедрения- A/B Тестирование- TwemProxy