В нашем блоге мы неоднократно рассказывали о построении инфраструктуры провайдера облачных сервисов и о том, как облегчаем пользователям взаимодействие с ней.

Сегодня мы расскажем о том, как на основе различных продуктов реализовывали в системе функцию управления DNS.

В предыдущих сериях


В чем проблема


Одной из наиболее востребованных услуг при развертывании сайтов является управление DNS, поэтому эта функция должна быть простой и удобной.

До недавнего времени в системе 1cloud не было возможности непосредственного редактирования записей — пользователи должны были написать заявку в службу поддержки, которая затем исполнялась инженерами. Минусы такого подхода очевидны — весь процесс сложнее и занимает больше времени, кроме того результат достигается не сразу, а лишь когда заявка будет выполнена.

При этом для пользователей, которые не разбираются в ИТ, процесс управления DNS-записями является довольно сложным делом, и не все знают, какие данные нужно предоставить для создания записи (их уточнение опять же сказывается на увеличении времени обработки заявки).

Реализация или почему не BIND


BIND создавался в качестве референсной имплементация протокола DNS. Это значит, что несмотря на всю свою популярность, по сути этот продукт с самого начала не предназначался для крупных операторов, предлагающих различные интернет-сервисы — в случае если необходимо добавление большого количества DNS-зон или реализация программного управления ими для множества пользователей, BIND может не всегда хорошо справляться с нагрузкой.

В результате, чтобы BIND нормально работал, его нужно «допиливать» под нужды конкретной организации, что далеко не всегда является хорошим вариантом по целому ряду причин (возможные ошибки, сложность поддержки и т.д.).

Популярность BIND делает его частой жертвой хакеров, что не может радовать операторов услуг, ведь если DNS-сервис подвергнется успешной атаке, то это может повлечь за собой нарушение SLA и оставить пятно на репутации.

Соответственно, столкнувшись с необходимостью организовать управление DNS, провайдеры услуг часто начинают рассматривать альтернативы BIND. Мы также изучили несколько продуктов (например, PowerDNS, Knot, NSD) и обнаружили, что ни в одном из них нет всех необходимых нам возможностей и они, так же как и BIND требуют доработок в области управления. Еще одним выявленным минусом доступных open source-решений оказалась их уязвимость к Chinese Water Turtle атакам, когда идет лавина запросов, которые не могут быть обслужены из основного кеша и уходят в бэкенд.

Стало очевидно, что необходимо посмотреть в сторону коммерческого ПО из этой области. Мы остановили свой выбор на продукте ANS Carrier-Grade DNS Appliance (он пока не является коммерчески доступным, но мы можем поделиться контактами представителей этой компании). Нас, в частности, привлекли следующие его плюсы:

  • Эта система нацелена как раз на операторов IaaS, PaaS, SaaS, операторов дата-центров и хостинговые компании.
  • Из первого пункта вытекает более высокая производительность (используется специальная версионная база данных) и простота масштабирования инфраструктуры, диагностики и управления.
  • Изменения в конфигурации зон и изменение ресурсных записей не приводит к перерыву в обслуживании.
  • Поддержка очень большого количества зон и ресурсных записей в них
  • Статистика запросов к каждой зоне.
  • Журналирование всех DNS запросов без пенальти по производительности, с удобным поиском по журналу.
  • Наличие шаблонов конфигураций и данных зон.
  • Поддержка со стороны разработчиков.

У данного продукта также есть API (Python, Java), что вообще тоже является плюсом, однако в нашем случае все оказалось чуть сложнее — нам нужен был открытый интерфейс на C#. Пришлось своими силами портировать проприетарный протокол, а затем «обернуть» получившуюся реализацию в REST API.

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

  1. В итоге мы сравнили реализации продукта на Java и .Net и выявили следующие различия в них:
  2. Кодирование с помощью AES и подсчеты хэш-сум в .Net реализовано удобнее и интуитивно понятней. Не нужно городить громоздких конструкций с кучей обновлений Сipher.
  3. Байтовые операции в .Net заполняют строку слева-направо, что приводит к некоторой мешанине и необходимости «обертывать» эти операции.
  4. В Java есть контейнер Map — очень гибкая вещь, которая может быть как хэш-таблицей так и списком и деревом.

Как это работает


В итоге схема работы выглядит следующим образом: клиент в панели управления 1cloud вносит нужные изменения, что инициирует создание задачи. Она поступает к специальному обработчику, а затем через REST API отправляется серверу управления DNS, где уже и осуществляются итоговые действия:



Также мы поработали над упрощением взаимодействия пользователя с интерфейсом на самом первом этапе. Чтобы создать зону, ему нужно вбить домен и IP-адрес, после чего автоматически будет создана зона с записями SOA, NS (на серверы ns01.1cloud.ru и ns02.1cloud.ru) и A:



Далее можно создать для зоны любую новую запись, заполнив несложную форму:



Заключение


Запуск новой системы управления DNS состоялся совсем недавно, и у нас есть определенные планы по ее доработке в будущем.

Также у нас есть еще много планов по оптимизации инфраструктуры и повышению удобства ее использования. Среди них, например, автоматизация задач по установке и восстановлению данных из бэкапов, внедрение модели оплаты только за потребленные ресурсы (pay as you go) и развертывание системы автомасштабирования инфраструктуры при достижении пиковой нагрузки на текущие серверы пользователей.

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

Комментарии (10)


  1. ildarz
    25.06.2015 12:55

    Мы остановили свой выбор на продукте ANS Carrier-Grade DNS Appliance (он пока не является коммерчески доступным, но мы можем поделиться контактами представителей этой компании). Нас, в частности, привлекли следующие его плюсы:


    А вам его отдали с исходниками, или для вас это черный ящик с API?


    1. 1cloud Автор
      25.06.2015 13:30

      Это коммерческий продукт и распространяется он без исходников. Так что да, для нас это черный ящик с интерфейсами в виде API и консоли.


  1. Xelonic
    25.06.2015 15:09
    -2

    Сами себе придумали проблему и решили.
    Как же бедные хостеры до этого жили и управляли доменами своих клиентов? Все уже давным давно решено.
    Первый раз слышу чтоб кто то вообще добавлял днс записи через заявки по телефону, на дворе уже давно не девяностые.


    1. 1cloud Автор
      25.06.2015 15:26

      При чем тут девяностые вообще? Мы не используем готовую панель управления хостингом, а развиваем свою (тому есть множество причин). У нас до сегодняшнего дня не было функциональности автоматизированного управления DNS, мы реализовали данную возможность на инструменте, который заточен под высокую нагрузку и рассказали об этом хабросообществу, посчитав это интересной темой. Так что ваш комментарий не совсем здесь в тему.


      1. Xelonic
        26.06.2015 03:55

        Вам конечно виднее
        Я бы на вашем месте не стал кричать про то что у других давным давно есть.
        Для меня эта статья характеризует вас как очень отсталого хостера к тому же изобретающего велосипеды.


        1. 1cloud Автор
          26.06.2015 09:52

          Не хочется доказывать, что вы что-то недопоняли. Почитайте другие наши статьи по развитию продукта (ссылки в начале поста), сразу станет все ясно про отсталось и велосипеды.


    1. foxmuldercp
      25.06.2015 20:52
      +1

      Я знаю парочку хостингов, где в 2015 году используют BIND с конфигами файловыми.
      На своем проекте у меня PowerDNS + PostgreSQL. API у PDns «та еще конфетка», но всяко лучше, чем ручками гонять из скриптов sql запросы, переподписывать зоны и пинать PDns на перечитку бекенда.

      Если мало что надо менять для себя можно еще djbdns использовать, очень шустрая штуковина


      1. clickfreak
        26.06.2015 18:46

        Powerdns не надо пинать на «перечитку» если используется динамический бэкенд (postgresql в их числе). Разработчики недавно в своём блоге расписали как они с бэкендами работают:
        http://blog.powerdns.com/2015/06/23/what-is-a-powerdns-backend-and-how-do-i-make-it-send-an-nxdomain/


        1. foxmuldercp
          26.06.2015 20:15

          Может и не надо, в последних то версиях. но:
          а) API проще и быстрее, и «оно дальше само». curl + json, время выполнения из шелла или с web'а копеешное;

          б) чтобы передернуть зону из постгреса надо или косячить скриптовый костыль который будет обновлять табличку записей, обновлять табличку зоны (про инкремент серийника помним?) переподписывать зону на DNSSEC, и (у меня без этого хоть убейся не работало) говорить PDNS'у перечитать бекенд.
          Время выполнения в шелле недопустимо большое.


  1. rukhem
    26.06.2015 04:44
    -1

    PowerDNS