High load. Наследство от дядюшки Ау

32
HighLoad. Наследство от дядюшки Ау Игорь Малиновский @u_glide tinyurl.com/thinkphp8

description

Success-story о том, как из нестабильного легаси-проекта получить стабильное и масштабируемое решение. В докладе будут рассмотрены следующие вопросы: - c чего начать борьбу с узкими местами; - коротко о New Relic мониторинге; - проблемы распределения нагрузки с Amazon ELB; - почему решения на базе стандартных фреймверков могут не работать; - как и для чего мы используем Redis;

Transcript of High load. Наследство от дядюшки Ау

Page 1: High load. Наследство от дядюшки Ау

HighLoad.Наследство от дядюшки Ау

Игорь Малиновский@u_glidetinyurl.com/thinkphp8

Page 2: High load. Наследство от дядюшки Ау

Давайте знакомиться!

Page 3: High load. Наследство от дядюшки Ау

Было:

Стало:

Мертвы

й код Постоянные падения

Множество

дефектов

Нет тестов

Потеря прибыли

Тяжело

поддерживат

ь

Увеличени

е

прибыли

Continuous Delivery

A/B

Тестировани

е

Стабильное и масштабируемое решение

Page 4: High load. Наследство от дядюшки Ау

Никто не любит legacy code

+ =

+ + =

?

Page 5: High load. Наследство от дядюшки Ау

Понять с чем имеем дело

• Документации нет

• Читать код не

вариант

• У заказчика только

высокоуровневые

знания

функционала

Page 6: High load. Наследство от дядюшки Ау

… так с чего начать?!1. Исследуем инфраструктуру

Amazon ELB

Backend

NGINXPHP-FPM

Stat App

NFS Shar

e

Cache

NGINXPHP-FPM

Page 7: High load. Наследство от дядюшки Ау

… так с чего начать?!2. Мониторим приложение

http://newrelic.com/

Page 8: High load. Наследство от дядюшки Ау

… так с чего начать?!2.1Находим «узкие» места

Page 9: High load. Наследство от дядюшки Ау

… так с чего начать?!2.2 Определяем функционал, который реально используется

Page 10: High load. Наследство от дядюшки Ау

1st Bottleneck: Heavy Write to MySQL

Amazon ELB

Backend

NGINXPHP-FPM

Stat App

NFS Shar

e

Cache

NGINXPHP-FPM

Page 11: High load. Наследство от дядюшки Ау

DEAD CODE ?!

1st Application :

~322 000 lines (88% php)

2nd Application:

~347 000 lines (89% php)

Page 12: High load. Наследство от дядюшки Ау

Refactored code1st Application :

~146 000 lines (-65%) (85% php)

2nd Application:

~198 000 lines (-43%) (81% php)

+ NO FEAR :)

Page 13: High load. Наследство от дядюшки Ау

Проблемы Amazon Elastic Load Balancing

Amazon ELB

Backend

NGINXPHP-FPM

Stat App

NFS Shar

e

Cache

NGINXPHP-FPM

Page 14: High load. Наследство от дядюшки Ау

Проблемы Amazon Elastic Load Balancing

При скачкообразном повышении трафика Amazon ELB начинает масштабироваться

Page 15: High load. Наследство от дядюшки Ау

… да здравствует король.

HAProxyЧто хорошего:

1. Гибкая система ACL2. Не боится резких скачков3. Равномерно распределяет трафик

С чем придется смириться:

4. Нет веб-интерфейса для управления «из коробки»5. Достаточно сложная для рядового пользователя

установка и настройка

Page 16: High load. Наследство от дядюшки Ау

Время рефакторинга?

Сначала проанализируйте ошибки предыдущей команды

Page 17: High load. Наследство от дядюшки Ау

Что мы сделали с Yii

#ДавайДоСвидания

Page 18: High load. Наследство от дядюшки Ау

Если серьезно

• Yii был избыточен• Решаем небольшие проблемы большими инструментами• Сложное создание

сущностей• Не решена проблема

удаления

Page 19: High load. Наследство от дядюшки Ау

Что получилось

Components

Page 20: High load. Наследство от дядюшки Ау

Что получилось

Response time0

100

200

300

400

500

600

700

800

Old versionNew Code

Ускорение x5

Page 21: High load. Наследство от дядюшки Ау

Что получилось

Время

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

Page 22: High load. Наследство от дядюшки Ау

Что получилось

HAProxy

Backend

NGINX+redislog

PHP-FPM

Stat App

PerconaNGINX

PHP-FPM

Component

s

+ twemproxy

Page 23: High load. Наследство от дядюшки Ау

Redis за 10 минут

= 30стр.

http://redis.io/

Page 24: High load. Наследство от дядюшки Ау

String Hash List Set ZSet

Page 25: High load. Наследство от дядюшки Ау

Для чего используем

• Application data

• Statistics data

• Nginx logs (redislog)

Page 26: High load. Наследство от дядюшки Ау

Redislog

Request Store logs

Configuration:

• connection options

• key to store data

• operation to store data

• can specify conditions

Redis

Автор слайда: @loginwashere

Page 27: High load. Наследство от дядюшки Ау

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

Page 28: High load. Наследство от дядюшки Ау

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

Page 29: High load. Наследство от дядюшки Ау

Redis Gotchas

NO ClusterСейчас в активной разработке

Client-side sharding:- Predis- Twemproxy aka Nutcracker

Page 30: High load. Наследство от дядюшки Ау

Redis Gotchas

There is no good old SQLYog for redis

For small datasets

• phpredisadmin

• redis commander

Автор слайда: @loginwashere

Page 31: High load. Наследство от дядюшки Ау

Redis Desktop Manager BETA

http://redisdesktop.com/

Page 32: High load. Наследство от дядюшки Ау

To be continued…

В следующей серии:- Continuous Delivery.

Рецепты внедрения- A/B Тестирование- TwemProxy