Платформа «Автокомьюнити»

Задача: сделать такой сайт, чтобы вносить информацию в него мог даже ребенок. И чтобы при этом сайт выдерживал нагрузки до полумиллиона посетителей в сутки. И чтобы много дорогого оборудования для этого покупать не пришлось. И чтобы работал всегда, даже если электричество пропало.

В самом начале пути, когда проект «Автокомьюнити» только начинался, нам было нелегко. Нам нужно было сделать продукт с минимальной стоимостью владения и поддержки, но чтобы он при этом легко и оперативно дорабатывался под наши нужды, работал быстро, и обязательно без проблем масштабировался и резервировался.

«Универсальные» решения в виде CMS, представленных на современном рынке, под эти задачи явно не подходили. Поэтому программно-аппаратную часть, как, впрочем, и оформление, решили делать сами.

autocommunity

В качестве основного языка программирования был выбран PHP — как наиболее популярный и, следовательно, обеспечивающий наибольшее количество доступных разработчиков. Фрагменты кода, отвечающие за места наиболее критичных нагрузок, были выполнены на «Си» в виде отдельных «демонов» и дополняющих модулей для PHP-интерпретатора веб-сервера.

Разумеется, не обошлось без ООП. В связи с тем, что разработка длилась почти год, люди в команде менялись. Однако использование широко известных паттернов проектирования позволило упростить адаптацию новых разработчиков.

Еще на стадии проектирования в продукт были введены возможности реализации нескольких уровней кэширования данных. Нижний уровень работает с объектами данных, полученных из базы данных, храня их, при необходимости, в пуле memcached серверов. Верхний уровень кэширует уже готовые страницы или блоки страниц, что позволяет выдавать посетителю большинство запросов без использования тяжелой скриптовой части.

Большинство данных имеет версионный характер — редактирование объекта создает его новую версию, которая публикуется на сайте только после процесса «актуализации». Это позволяет готовить пакетные изменения на сайте, не допуская появления несвязанных данных.

autocommunity

Серверная архитектура реализует классическое разделение «фронт-енд» — «бек-енд» с легким масштабированием любой части схемы. Все сервера системы могут выполнять любую функцию, в зависимости от запущенных сервисов, однако для оптимизации стоимости системы конфигурация серверов подбиралась исходя из роли в системе.

autocommunity

Жизнеспособность всех серверов, равно как и миграция сервисов при отказе оборудования выполнена на проекте Linux-HA + Pacemaker CRM (cluster resource manager). Входящие запросы обслуживают сервера с nginx («фронт-енд»), нагрузка на которые распределяется через DNS (round-robin). Nginx занимается выдачей статического контента, которым могут являться, в том числе, и кэшированные страницы портала. Помимо этого он же осуществляет балансировку запросов на пулы PHP-интерпретаторов («бек-енд»).

autocommunity

Все данные разделены на две группы по виду хранения — на нодах «фронт-енда» (для быстрой выдачи веб-сервером) и на разделяемой файловой системе (реализуемой посредством подключения дисковой подсистемы по интерфейсу FC). Такое разделение позволяет, с одной стороны, частично снять нагрузку с общих дисков, а с другой стороны — упрощает синхронизацию пользовательских данных между нодами кластера.

Сервер базы данных построен на базе СУБД PostgeSQL, а для резервирования и масштабирования реализует схему «синхронный мастер-мастер», что упрощает работу с данными из программного продукта.

Отдельной частью системы является почтовый сервер, используемый для доставки уведомлений пользователям, полностью готовый для работы в режиме обмена сообщениями (jabber) и предоставления пользователям портала доступа к персональным почтовым ящикам.

К сожалению, в 2010 году развитие проекта, в связи с плачевным состоянием автомобильного бизнеса, пришлось приостановить. На текущий момент, мы планируем возобновить работу над проектом в начале 2011 года. Планов много, но всему своё время.

Трудились

Староста
Андрей Калибабин
Главный инженер
Дмитрий Кельми
Инженеры
Марина Бондарева Ефимов Данил Евгений Захаревич