2009/03/29

7 этапов построения масштабируемых веб-приложений.

это перевод со слайдов отсюда http://www.profyclub.org/articles/290/3341
  1. Семь составляющих веб-приложений
    автор: John Engates
  2. На повестке (регламент встречи):
    • Что мы ждём от веб-приложений
    • Типичный сценарий работ
    • Неплохие примеры
    • Вопросы и ответы

  3. Чего мы ждём от сайтов

    • Масштабируемость
    • Высокая степень эксплуатационной готовности (полезности), высокая отдача
    • Производительность (эффективность работы?)
    • Простота управления
    • Низкая стоимость (обслуживания, в том числе)
    • Изобилие рюшечек Множество приятных неожиданностей
    • И что он будет нам делать бабло, много бабла!

    Это и есть семизначная мантра клиента-директора, думающего о заказе корпоративного сайта

  4. Высокая готовность. Определение:
    Высокая готовность (High Availability HA) - это такой подход к проектированию и реализации, который бы гарантировал известную степень уверенности в их (проектирования и разработки) непрерывности. Так-то!
    Как это выглядит на примерах:
    • ваш сайт всегда работает и доступен
    • юзеры счастливы
    • вы не теряете денег из-за технических простоев
    • (и это не увеличивает затраты на обслуживание сверх необходимого)

    Это была мантра техдира проекта

  5. Что на самом деле называется масштабируемостью
    Масштабируемость (расширяемость) - это ожидаемое свойство системы, которое показывает её возможность к росту доходов в приятной форме, или легко увеличиваться по необходимости
    (Дядька загнул круто. Масштабируемость - это способность системы к расширению и росту. Ну и увеличению доходности, да)

    Чем не выражается масштабируемость:
    • чисто наращиванием мощностей (2МГц -> 3МГц)
    • чем-то вроде операционных систем (Solaris vs Linux)
    • особенностью софтовых технологий (Java - Python - Rails)
    • особенностями платформ (Intel - AMD)
    • оптимизацией кода (10 строк против 1000, утверждает этот дядька, ничего не решает)
    • выбором технологии хранения (SAN vs NAS)

  6. большими красными буквами

    РАСШИРЯЕМОСТЬ И ПРОИЗВОДИТЕЛЬНОСТЬ - НЕ ОДНО И ТОЖЕ

  7. картинки с примерами
    красивые машинки, автомобильные развязки и писсуары





  8. Истина первая:

    Ничто не может множится, если таковым не спроектировано.

  9. Истина вторая:

    Если что-либо было спроектировано частями, может их наращивать без проблем.

  10. Очень интересная "шкала боли" (игра слов с предыдущими пунктами)
  11. Типовые сценарии развития

    Этап 1. Начало
    • Простая архитектура
      - файрвол и балансировщик
      - пара веб-серверов
      - сервер БД
      - внутреннее хранилище

    • Невеликая сложность и проблемность, быстрая разработка, богато фич разного рода и всё быстро
    • Никакой избыточности (втч и в рабочей силе), низкая стоимость работ - прекрасный стартап!

  12. Этап второй, всё тоже самое, но чуть-чуть по-больше
    • Успешное ведение бизнеса - залог хороших отношений с законом
    • Добавим немного файрволов и балансировщиков
    • Добавим чуть больше веб-серверов для производительности
    • Устаканим схему БД и соптимизируем её с помощью DBA (консультанта)
    • Добавим баз
    • Переведём хранилище на SAN или DAS
    • Всё ещё просто, подходит для перспективных приложений

  13. Этап третий - Первые симптомы
    • Публичность
    • Устанавливается Squid или Vanish в режиме обратных прокси, или очень хороший балансировщик - для кеширования статичного контента
    • Добавляем ещё сколько-то веб-серверов (управление контентом уже доставляет немалый головняк)
    • Единственная БД не будет разделена когда-либо (раздельные операции чтения-записи - вся запись ведётся на единственный мастер сервер с несколькими вторичными серверами для чтения)
    • Может возникнуть необходимость чё-нить переписать в приложении

  14. Картинка "Расширяемость применительно к серверам баз данных"
  15. Этап четвёртый - Боли усиливаются
    • Кеширование на memcache
    • Репликация не работает для всего (единственная база для записи - много баз для записи - результат: репликация работает долго)
    • Приходит осознание необходимости разделения баз (конечно же, если ваша БД поддерживает этот механизм)
    • Приходит осознание распределённых хранилищ для контента
    • Необходимо серьёзное преобразование архитектуры приложения и базы (а разрабы могут не обладать подобным скилом)

  16. Этап пятый - Реально головняк!
    • Приходит м-р Паника и остаётся жить.
      Разве мы не могли сделать всё это раньше? (Список этого:
      - Полное переосмысление приложения\бизнес-модели
      - И почему мы не запланировали расширяемость системы на момент принятия решений по архитектуре? )
    • Невозможность делимости как фичи приложения - что ещё мы можем использовать? (Варианты
      - Разделение основанное на географическом принципе, по фамилии, по userID, etc
      - Создание кластеров пользователей (пользовательская кластеризация)
    • Поведение приложения должно быть идентично на каждом пользовательском кластере
    • Использование стурктуры хешей или мастер-сервера БД для определения какого пользователя на какой кластер подключить

  17. Этап шестой - Приход, мал-мала полегчало
    • Расширяемая архитектура приложения и базы
    • Удовлетворительное быстродействие
    • Снова можно добавлять новую функциональность
    • Оптимизация чего-нибудь в коде
    • Продолжаем расти, но теперь вполне управляемо

  18. Этап седьмой - Исход в неизвестность
    • Где нас ещё поджидают узкие места?
      - Обеспечение питанием, площадь размещения
      - Каналы и прочее - насколько велик ваш хостер?
      - Проблемы систем защиты и балансировщиков нагрузки
      - Хранилища данных
      - Люди и проблемы
      - Технологические ограничения расширяемости баз данных - всё ещё хотите хранить данные по схеме ключ-значение?
    • Что там насчёт "все яйца в одну корзину"?
      - один датацентер
      - одна копия данных
      - проблемы репликации данных и балансировки по географичекому принципу

  19. Добрые советы
    • Не изобретайте колесо, скопируйте у кого-нибудь другого
    • Думайте просто
      - Все вещи, сделанные проще некуда - не так уж просты. - А. Эйнштейн
    • Думайте горизонтально... не вертикально... в любых случаях (может, это идиома такая?)
      Насколько затратно? - вместо - Насколько быстро?
    • Используйте подходящее обеспечение и оборудование
    • Решайте проблемы легко и просто
      - Приводите планы в действие
      - Разделяйте различные сервисы
      - Не проводите много изменений за один раз (это называется итеративность)
  20. Ещё немного добрых советов
    • Не тратьте времени на оптимизацию оптимизации ("Преждевременная оптимизация преждевременна" (c)#phpclub@undernet.org)
      - Возьмите вашу [правильно спроектированную] архитектуру, часто подстраивайте решения [под неё], и редко оптимизируйте (или никогда)
    • Проверяйте возможности к расширению подходящими нагрузочными тестами
      - Сделайте это привычной практикой до того, как вы начнёте думать об их необходимости
    • Используйте кеширование до того, как почуствуется необходимость
    • Много памяти и 64-битная платформа помогут вам (Use the Force, Luck! :)
    • Проверяйте новые возможности до того, как выбор между производительностью и масштабируемостью станет проблемой
      - Nice to have vs. have to have. И будет вам щасте:)

  21. Управляйте изменениями помня об доступности сайта
    • Нельзя недооценивать необходимость правильной постановки технологического процесса и документации
    • Избавьтесь от управленцев
      - Разработка - тестирование - выпуск
      - Работайте уместно сохраняя конъюнктуру
    • Используйте системы контроля версий
      - Понятно, да: RCS, CVS, Subversion
    • Отслеживайте выпуски (короче, issue tracking - добрый совет использовать трекинговую систему. имхо помощь в разработке оказывают специализированные системы багтрекинга, а не хлам типа trac - у него другие задачи. Если и использовать систему контроля, то это должен быть комбайн, в котором прозрачно отслеживаются таймлайны, что-то типа eGroupWare. Кстати, этот совет противоречит отказу от менеджмента)
    • Используйте стандарты кодирования
    • Измените схему работ
      - Планирование - тестирование - выполнение
      - Оптимизированная на высокую доступность инфраструктура
Дальше там реклама и спасибы.
1080слов, 7530знаков
blog comments powered by Disqus