Архитектура Битрикс24 — взгляд изнутри



    12 апреля мы запустили большой новый проект — «Битрикс24»: социальный интранет, SaaS-сервис, объединяющий в себе классические инструменты командной работы (календари, задачи, CRM, работа с документами) и социальные коммуникации («лайки», социальный поиск, мгновенные сообщения и многое другое).

    Первый прототип этого сервиса был запущен еще в феврале прошлого года. На одном сервере, без каких-либо особенных возможностей для масштабирования, без резервирования на уровне датацентра… :) Только концепт.

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

    Очень хотим, чтобы наш опыт оказался полезен для всех разработчиков, которые только планируют запускать или уже эксплуатируют и поддерживают крупные веб-проекты и сервисы.

    * * *

    Итак, первый пост — об архитектуре проекта в целом. Поехали!

    В процессе разработки самой идеи «Битрикс24» мы сформулировали для себя несколько бизнес-задач:

    • С самого начала мы предполагали, что первый тариф на «Битрикс24» будет бесплатным.
    • Это значит, что себестоимость такого бесплатного аккаунта для нас должна быть очень низкой.
    • Наш проект — это бизнес-приложение, и значит нагрузка на него будет очень неравномерной: больше днем, меньше ночью. В идеале — хорошо бы уметь масштабироваться (в обе стороны) и в каждый момент времени использовать ровно столько ресурсов, сколько нужно.
    • При этом — для любого бизнес-приложения крайне важна надежность: постоянная доступность данных и их сохранность.
    • Мы стартовали сразу на нескольких рынках: Россия, США, Германия.


    Эти бизнес-требования в итоге сформировали два больших «фронта» работ: формирование масштабируемой отказоустойчивой (забегая немного вперед — «облачной») платформы разработки и выбор технологической платформы для инфраструктуры проекта.

    Платформа разработки «1С-Битрикс»

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

    Огромным шагом в развитии платформы «1С-Битрикс» стало появление модуля «Веб-кластер» в версии 10.0 весной прошлого года.

    Мы подробно писали о нем на Хабре. Кратко повторю основные возможности:

    • Вертикальный шардинг (вынесение отдельных модулей на отдельные серверы MySQL)
    • Репликация MySQL и балансирование нагрузки между серверами на уровне ядра платформы
    • Распределенный кеш данных (memcached)
    • Непрерывность сессий между веб-серверами (хранение сессий в базе данных)
    • Кластеризация веб-сервера


    В итоге мы получили возможность представить наш проект в виде веб-кластера взаимозаменяемых серверов. Все выглядело очень и очень неплохо: при увеличении посещаемости можно было быстро добавить в кластер новые серверы; в случае выхода из строя одного или нескольких серверов кластера все продолжало работать на оставшихся серверах, система продолжала беспрерывно обслуживать клиентов.



    Но до идеала было еще далеко, оставались «узкие» места:

    • Не был до конца решен вопрос синхронизации файлов на разных веб-серверах. На собственном сайте мы использовали csync2, он очень неплохо себя зарекомендовал. Однако на больших объемах данных мы просто не успевали бы передавать изменения по всем серверам.
    • Выход из строя master-сервера в репликации MySQL означал какие-то ручные или полуавтоматические операции по переводу одного из slave'ов в режим master'а. Это требовало времени, а значит мы не могли гарантировать бесперебойную работу сервиса.
    • slave'ы позволяют распределить нагрузку на базу на чтение, а master все равно остается один. Это значит, что запись остается узким местом в работе базы.
    • Как показал наш собственный печальный опыт, молнии попадают в датаценты и могут их полностью вывести из строя. Значит, нужно резервировать не только отдельные серверы, но и целиком датацентр.


    В платформе «1С-Битрикс» версии 11.0, вышедшей осенью 2011 года, мы решили и эти задачи. Поддержка облачных файловых хранилищ решила проблему синхронизации статического контента, а реализация поддержки master-master репликации в MySQL позволила строить географически распределенные веб-кластеры.

    И мы вплотную подошли ко второй большой задаче…

    Платформа для разворачивания инфраструктуры

    Если честно, выбор был не очень сложным. :)

    «Облако» или не «облако» — такой вопрос даже не стоял. :)

    Собственное или арендуемое оборудование требует достаточно серьезных вложений в инфраструктуру на старте проекта. Масштабировать физические «железки» достаточно сложно (долго и дорого). Администрировать (особенно в разных ДЦ) — неудобно.

    Поэтому — «облако»!

    Какое именно? Мы выбрали Amazon AWS.

    Все наши сайты работают в Амазоне достаточно давно. Нам нравится то, что есть множество уже готовых сервисов, которые можно просто брать и использовать в своем проекте, а не изобретать собственные велосипеды: облачное хранилище S3, Elastic Load Balancing, CloudWatch, AutoScaling и многое другое.

    В очень упрощенном виде вся архитектура «Битрикс24» выглядит примерно так:



    Web – автоматическое масштабирование

    Приложение (веб) масштабируется у нас не вертикально (увеличение мощности сервера), а горизонтально (добавляем новые машины).

    Для этого мы используем связку Elastic Load Balancing + CloudWatch + Auto Scaling. Все клиентские запросы (HTTP и HTTPS) поступают на один или несколько балансировщиков Amazon (ELB). Рост и снижение нагрузки мониторим через CloudWatch. Есть две интересные метрики – состояние нод EC2 (% CPU Utilization) и балансировщика (время latency – в секундах).

    Мы в качестве основной характеристики используем данные о загрузке машин, так как latency может варьироваться не только из-за реальной нагрузки, но и по каким-то иным причинам: сетевые задержки, ошибки в приложении и т.п. В таком случае возможны «ложные» срабатывания, и тогда мы крайне неэффективно будем добавлять новые машины.

    Сейчас в итоге автоматически стартуют новые машины, если средняя утилизация CPU (в терминах Амазона) превышает 60%, и автоматически останавливаются и выводятся из эксплуатации, если средняя нагрузка менее 30%.

    Мы достаточно долго экспериментировали с этими пороговыми значениями и сейчас считаем их оптимальными. Если верхний порог ставить больше (например, 70-80%), то начинается общая деградация системы – пользователям работать некомфортно (долго загружаются страницы). Нижний порог меньше — система балансировки становится не очень эффективной, машины долго могут работать вхолостую.



    Статический контент пользователей сервиса

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

    Именно поэтому при создании каждого нового портала в «Битрикс24» для него создается персональный аккаунт в Амазоне для хранение данных в S3. Тем самым данные каждого портала полностью изолированы друг от друга.

    При этом само хранилище S3 очень надежно. Сам Амазон подробно описывает его устройство (и, в принципе, нет поводов им не верить).

    Данные в S3 реплицируются в несколько точек. При этом – в территориально распределенные точки (разные датацентры).

    Каждое из устройств хранилища мониторится и быстро заменяется в случае тех или иных сбоев.

    Когда вы загружаете новые файлы в хранилище, ответ об успешной загрузке вы получите только тогда, когда файл будет полностью сохранен в нескольких разных точках.

    Обычно данные реплицируются в три и более устройств – для обеспечения отказоустойчивости даже в случае выхода из строя двух из них.

    Иными словами, с надежностью – все хорошо. Тот же Амазон, например, говорит о том, что их архитектура S3 устроена таким образом, что они готовы обеспечить доступность на уровне двух девяток после запятой. А вероятность потери данных – одна миллиардная процента.

    Два датацентра и master-master репликация

    Весь проект сейчас размещается в двух датацентрах. Мы решаем этим сразу две задачи: во-первых, распределяем нагрузку (сейчас российские пользователи работают в одном ДЦ, а американские и европейские — в другом), а во-вторых, резервируем все сервисы — в случае выхода из строя одного из ДЦ, мы просто переключаем траффик на другой.

    Чуть-чуть подробнее — как это все устроено.

    База в каждом ДЦ является мастером относительно слейва во втором ДЦ и одновременно слейвом — относительно мастера.

    Важные настройки в MySQL для реализации этого механизма — auto_increment_increment и
    auto_increment_offset. Они задают смещения значений для полей auto_increment — для того, чтобы избежать дублирования записей. Грубо говоря, в одном мастере — только четные ID, в другом — только нечетные.

    Каждый портал (все зарегистрированные в нем сотрудники), заведенный в «Битрикс24» в каждый конкретный момент времени работает только с одним ДЦ и одной базой. Переключение на другой ДЦ осуществляется только в случае какого-либо сбоя.

    Базы в разных датацентрах синхронны, но при этом независимы друг от друга: потеря связности между датацентрами может составлять часы, данные синхронизируются после восстановления.

    Надежность, надежность, надежность

    Один из важнейших приоритетов в «Битрикс24» – постоянная доступность сервиса и его отказоустойчивость.

    Помните простую схему сервиса? В итоге (все равно упрощенно, но тем не менее :)) она выглядит примерно так:



    В случае аварии на одной или нескольких веб-нодах Load Balancing определяет вышедшие из строя машины и, исходя из заданных параметров группы балансировки (минимально необходимое количество запущенных машин), автоматически восстанавливается нужное количество инстансов.

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

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

    Если это вызывает повышенную нагрузку на машины, то CloudWatch определяет возросшую утилизацию CPU и добавляет нужное количество машин уже в одном датацентре в соответствие с правилами для AutoScaling.

    При этом у нас приостанавливается мастер-мастер репликация. После проведения нужных работ (восстановительных — в случае аварии, или плановых — мы, например, точно по такой же схеме в какой-то момент осуществили переход со стандартного MySQL на Percona Server — при этом без какого-либо downtime'а для пользователей сервиса), включаем базу в работу и восстанавливаем репликацию.

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

    * * *

    Этот первый пост я постарался сделать «легким», обзорным. :) Если бы вместил все то, чем хочется поделиться, в один текст и рассказал обо всем нашем опыте сразу, то получилось бы слишком много букв. :)

    Мне кажется более логичным сделать серию тематических постов. Темы которые, мы уже готовим:

    • Нюансы Амазона: неочевидные лимиты, разные режимы работы балансировщиков, работа с образами AMI
    • Специфика веб-нод: механизмы обновления ПО, Apache/не Apache, безопасность и изоляция пользователей
    • MySQL: почему Percona, особенности master-master, репликация большого объема данных, нюансы работы query cache, шардинг
    • Бэкапы данных и главное — их восстановление
    • Мониторинг тысяч объектов, как не заспамить себя алертами, автоматизируем реакцию на уведомления


    Что наиболее интересно для вас? Можно провести спонтанное голосование и отмечать прямо в комментариях. :)

    Ну и конечно — пробуйте сам «Битрикс24»! Первый тариф — бесплатный. Если его лимитов или функционала не хватит — можно будет перейти на старшие тарифы. :)

    Подключайтесь — и работайте с удовольствием!
    1С-Битрикс
    73.65
    Company
    Share post

    Comments 61

      +2
      Сколько у вас серверов MySQL в одном датацентре? если он один, что будет если он вдруг упадет?
        +1
        На схеме нарисовано по одному серверу, реально же — больше. Несколько в каждом.

        Если сервер падает, траффик переключается на другой ДЦ. В самом худшем случае — пользователи будут 1-2 минуты (время переключения) видеть сообщение об ошибке. Дальше — продолжат работу в другом ДЦ.

        После восстановления — траффик переключается обратно.
          0
          Если несколько в каждом, то почему трафик переключается на другой ДЦ, а не другой MySQL в томже ДЦ?
            0
            В разных MySQL в одном ДЦ — данные разных пользователей (шардинг).
        +13
        Warning: rename(/home/bitrix/bitrix24/site/www.bitrix24.ru/bitrix/cache/css/ru/b24/template_styles.css.tmp,/home/bitrix/bitrix24/site/www.bitrix24.ru/bitrix/cache/css/ru/b24/template_styles.css): No such file or directory in /mnt/pstorage1/bitrix/bitrix24/site/shared/bitrix/modules/main/classes/general/main.php on line 904 Warning: rename(/home/bitrix/bitrix24/site/www.bitrix24.ru/bitrix/cache/css/ru/b24/template_styles.css.tmp.gz,/home/bitrix/bitrix24/site/www.bitrix24.ru/bitrix/cache/css/ru/b24/template_styles.css.gz): No such file or directory in /mnt/pstorage1/bitrix/bitrix24/site/shared/bitrix/modules/main/classes/general/main.php on line 920
          0
          Подскажите, пожалуйста, где Вы такое увидели? :)

          Неаккуратненько как-то. Поправим.
            +10
            www.bitrix24.ru/whatisthis/
            Но уже пропало.
            Тем не менее, сами понимаете, раскрытие путей и т.д.)
          +2
          Спасибо за статью, пока просто пробежался, чуть внимательней прочту позже.
          Перешел сразу на сайт, спустился к слайдеру внизу.
          Ожидал, что нажму вправо и он перелистнет справа налево, но никак не слева направо :)
            +5
            А в качестве базы данных не рассматривался Amazon RDS? Раз уж всё в амазоновском облаке.
              +4
              Рассматривали. Отказались по нескольким причинам.

              Недостаточно гибкая система (нет полноценного root в базе). Для нас оказалось критично.
              Непрозрачно работает.
              Как следствие — риск долгого даунтайма (когда молния попала в европейский ДЦ, многие клиентские RDS долго лежали).
              +2
              А standalone версия не планируется? От внедрения отделяет только этот фактор…
                +1
                Более того — «коробочная» версия первична. :)

                И вот как раз вышла с тем же дизайном, что и в Битрикс24: www.1c-bitrix.ru/about/life/news/430668/
                  +2
                  Это хорошая новость )
                    0
                    А где же там бесплатная версия на 12 человек?
                    Вроде как люди себе качают, ваши сервера не загружают тем, что не приносит прибыли — их за это поощрять надо :)
                  +10
                  Голосую за рассказ о Percona server
                    +2
                    Да, в процессе много любопытного узнали. :)
                    Обязательно расскажем!
                    +3
                    Бесполезно использовать битрикс, так как у них не во всех таблицах есть полноценный первичный ключ.
                    При репликации происходит «duplicate entry» и репликация master-master ложится.
                    Из свежих, недавно (февраль-март) отрепортили проблему с b_captcha
                      +2
                      К слову сказать, поддержка битрикса довольно таки оперативно пофиксила проблему.
                        +7
                        1. В Битрикс24 используется Битрикс (сюрприз! :))
                        2. m-m репликация не ложится.

                        Да, конечно, могут быть какие-то отдельные модули (особенно собственной разработки), в которых те или иные конфликты могут возникать.

                        Но, как вы сами заметили ниже, если речь идет именно про наш (Битрикса) функционал, все проблемы достаточно оперативно фиксятся.
                          +4
                          При репликации происходит «duplicate entry» и репликация master-master ложится.

                          Как не представитель Битрикса, имеющий опыт развёртывания их корпортала в гео-кластер с двумя мастерами, так же могу подтвердить отсутствие в репликации duplicate entry
                            0
                            И если бы это была единственная причина, по которой его не нужно использовать… :-(
                            –1
                            зачем выкупать и плодить столько одинаковых сервисов?
                              0
                              Битрикс24 — собственная разработка.

                              Одинаковых… Покажите, пожалуйста, примеры?
                              +5
                              Из российских только мегаплан, насколько я знаю у него функционал беднее. Битрикс настроен на корпоративный рынок, где важна русская поддержка. А тот же сэйлзфорс, у которого есть российские внедренцы, знаете сколько стоит? Ни разу не конкуренты по ценам.
                              Так что у битрикс24 все шансы, успехов ему и процветания.
                              +3
                              Хорошо статья написана, по рабочи-крестьянски, по-маяковски и с практической точки зрения. Респект за это.

                              Два момента. Первый: мастер-мастер — это вроде как синхронная мультимастер-репликация, когда данные коммитятся сразу либо в 2 места, либо ни в одно. В вашем же случае схема не такая — честно говоря, я не очень понял из статьи, зачем делать чересстрочность, когда можно просто мастеру в первом дц дать слейв во в ором, а мастеру во втором — слейв в первом. (Разве что на машинах экономить.)

                              Второй: вы не рассматривали вариант запустить все это на постгресе, а не на mysql? В постгресе чересстрочности нет, конечно, но репликация в нем (даже та, что сейчас есть) совершенно неубиваемая (в отличие от mysql, с котором еще придется немало намучиться.)
                                +1
                                > когда можно просто мастеру в первом дц дать слейв во в ором, а мастеру во втором — слейв в первом.

                                Правильно ли я понимаю, что подразумеваются разные роли для всех слейвов и мастеров? То есть, 4 сервера, а не 2 (как у нас)?

                                А зачем тогда? Расходов больше, а надежности не добавляет (в случае падения мастера надо слейв переключать в роль мастера, лишние действия).

                                Постгрес — не рассматривали. Две главные причины:

                                1. Делали все на собственной платформе, которая PostgreSQL не поддерживает (практически не востребовано клиентами и партнерами).

                                2. Делали на том, что сами знаем лучше всего. Может быть, архитектурно постгрес и лучше (просто не знаю всех нюансов), но если администрировать его будут люди без квалификации и опыта работы именно с ним — получится заведомо хуже.
                                  0
                                  В постгресе отлично работает M-S репликация, но вот с M-M вопрос.
                                  +13
                                  Люблю Битрикс :)

                                    +4
                                    А почему так тормозит сервис?
                                      +4
                                      Кстати, да — это было и моим первым впечатлением. И вокруг народ тоже это говорил, я краем уха слышал.
                                        +1
                                        Продублирую предыдущий комментарий…

                                        * * *

                                        Расскажите, пожалуйста, что именно тормозит? Для нас это очень важно.

                                        Основной сайт www.bitrix24.ru или какой-то уже заведенный проект *.bitrix24.ru? Если второе — то какие-то отдельные страницы или в целом?
                                          +1
                                          Я имею в виду — заведенный проект, сразу после логина. Ходишь внутри и возникает ощущение, что медленноват отклик (т.е. явно не «летает»). Проект практически пустой. Думаю, это можно измерить, если вы задвдитесь такой целью (причем тормоза могут быть не обязательно на сервере — может быть медленный пинг из дц амазона до москвы, например). Мое первое впечатление было — «они только запустились, пошел пиар, серверы перегружены, они потом это все поправят». Но вот из статьи я узнал, что все работает на амазоне, а значит, проблема-то была не из-за перегруженных серверов и пиара…
                                            0
                                            RTT, кстати, туда из Москвы какой-то космический — у меня получается 240±80 мс, что отдельно не то, чтобы ставит крест на начинании, но, как минимум, доставляет неудобства.
                                              0
                                              До амазоновского дц в Ирландии — кстати, тоже такой большой пинг, не знаете? Вот, например, до Серверлофта (Германия) пинг совсем маленький…
                                            +2
                                            Зарегистрировали бесплатный аккаунт. Поработали часок и плюнули, т.к. работает все отвратительно медленно, пользоваться таким сервисом просто невозможно и бессмысленно.
                                          +2
                                          Расскажите, пожалуйста, что именно тормозит? Для нас это очень важно.

                                          Основной сайт www.bitrix24.ru или какой-то уже заведенный проект *.bitrix24.ru? Если второе — то какие-то отдельные страницы или в целом?
                                            +2
                                            Ребят, вы серьезно это _сами_ не измеряете и просите пользователей на глаз прикидывать где тормозит?

                                            Хотите научим / сделаем вам такую измерялку — или есть какие-то сторонние причины, почему вы это не делаете?
                                              +3
                                              Конечно, измеряем. По всем доменам, по всем хитам.

                                              Но если кто-то говорит «тормозит» — без указания, что именно, проще, наверное, спросить, чем выступать в роли ясновидцев?
                                          0
                                          Есть такое же но Open source?
                                            +2
                                            Смотря что именно Вы подразумеваете под словами Open source.

                                            Если открытый исходный код, то можно скачать с нашего сайта коробочную версию «Корпоративного портала» (демо). Там PHP, и код открыт.

                                            Если подразумевается в том числе и бесплатность — тогда не думаю, что есть полностью такой же функционал. Частями — да, конечно. И таск-менеджеры, и CRM… Но весь комплекс — вряд ли.
                                              –1
                                              Да, имелось ввиду бесплатное. Ибо маленькой компании платить даже 5К рублей в месяц дюже дорого. А хотелось бы иметь больше чем 12 пользователей. Даже возможно с более легким функционалом. То есть именно совместная работа, проекты, подразделения и задачи.
                                                +5
                                                Мне кажется, наше предложение получилось как раз неплохим. До 12 человек — бесплатно. Больше — ну, это, на мой взгляд, уже не такая уж и маленькая компания… :)
                                                  0
                                                  Для моего сайта — как раз то что надо. Для связи управления. Спасибо что сделали, хоть и маленький, бесплатный кусочек :) А по количеству — 20 человек было бы как раз.
                                                    +2
                                                    Где вы видели, чтобы сервисы с подобным функционалом давали бесплатный доступ для 20 человек? :-) 12 и то «прорыв»!

                                                    Пользуюсь одним похожим сервисом, там вообще максимум бесплатной версии — 2 человека в «команде». И таких большинство…
                                                      0
                                                      Я и написал «Спасибо» :)
                                                  +1
                                                  Поставьте у себя в офисе на любом работающем компьютере виртуальную машину с Redmine. Несмотря на брутальный интерфейс, там есть и проекты, и задачи, и этапы, и диаграммы ганта, и веб-просмотрщик связанных репозиториев с отчетами по пользователям, и даже вики. И даже при отключенном интернете. Если не понравится — тогда любой другой, из описанных по ссылке в этом комментарии.
                                                –3
                                                мож это www.drupalgardens.com/?
                                                  0
                                                  В одном из проектов, где требовался GPL код, мы пробовали Open Atrium, но его пришлось сильно допиливать, и по трудозатратам это было гораздо больше стоимости платного решения.
                                                  +3
                                                  Голосую за 1,2,3 темы
                                                    0
                                                    Принято.
                                                    Спасибо за интерес!
                                                    0
                                                    Ребят, на сайте в опере верхний сайдер не работает
                                                      0
                                                      *слайдер
                                                      +3
                                                      Зарегистрировался, зашел.
                                                      Выбираем пункт Мои инструметы -> фотографии.
                                                      Нажимаем «удалить».
                                                      С экрана фотки исчезают, хотя не написано, что удалено.
                                                      После перезагрузки страницы, видим битые картинки.
                                                      image
                                                      При нажатии на любую видим ошибки типа DMIN_FIRST_NAME REG_ADMIN_LAST_NAME и все висит.
                                                      Видимо картинки удалились, а ссылки на них — нет.
                                                        +5
                                                        «лайки» на «сотрудник уволен» доставляют.
                                                          0
                                                          Хотелось бы подробнее услышать про работу амазоновских сервисов и настройку с нуля — за этим действительно будущее, нужно учить настраивать и для своих проектов.

                                                          А за Битрикс24 — респект! Проект классный, а через полгода-год избавится от большей части багов и наберет функционала… ИМХО, лучшее решение в сегменте
                                                            0
                                                            Спасибо! :)
                                                            0
                                                            Вы написали что добавляете инстанс при 60% и удаляете при 30%. А на протяжении какого периода? 5 минут как амазон предлагает? Тоесть если 5 минут нагрузка на процессор 60% тогда новый инстанс? Спасибо!

                                                            Only users with full accounts can post comments. Log in, please.