Статистика распределения доменов по AS, IP, NS, MX и прочим параметрам

    Давным-давно перестал работать 1stat.ru — откровенно говоря, для нас это была трагедия (сейчас вроде он как-то работает).

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



    Первая версия firststat.ru


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

    Вторая версия firststat.ru


    Примерно год назад pavelodintsov прислал интересную статистику по распределению доменов по автономным системам.



    А также ссылку на код, который собирает данную статистику. Сам сбор был оформлен как запуск разных скриптов bash, perl и sqlite. При этом алгоритм был достаточно простой и интересный, в принципе, от Павла, как от талантливого специалиста, ничего другого и не стоило ожидать, правда работал он достаточно медленно и собирал данные только по AS.

    • запрашивался у регистратора список доменов в зонах ru, su и рф
    • по каждому из доменов запрашивалась А запись
    • получали BGP fullview и делали соответсвие сети к AS
    • на основе этих данных собирали статистику по распределению доменов по автономным адресам


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



    Сбор статистики


    Оригинальный проект: https://github.com/pavel-odintsov/ru_open_statistics
    Мой форк, переписанный на Python: https://github.com/AlexeyManikin/domain_statistic

    Для работы необходимы модули Python:
    • MySQLdb
    • dnspython
    • SubnetTree
    • psutil >= 2.2

    Также необходим сервер MySQL и крайне желательно быстрый DNS резолвер, так как основная часть нагрузки приходится на него. Необходимо запросить все записи (A, AAAA, SOA, TXT, MX, SRV, NS) для каждого из 6000000+ доменов. В первое время также собирал информацию с аналогичных проектов для проверки корректности результатов.

    Структуру проекта описывать, полагаю, не имеет смысла, код достаточно простой для понимания.
    update_as_info.py — обновляет данные по AS
    update_domain.py — обновляет данные по доменам
    update_statistic.py — агрегирует статистику в БД

    Структура БД


    Ниже приведу таблицы с полями, которые могут быть полезны при выборке данных:

    as_list: таблица соответствия номера AS и ее описания, страны
    • id — номер AS
    • descriptions — описание
    • country — страна

    domain: таблица, в которой хранится текущее состояние домена, полагаю, большая часть полей понятна из названия
    • domain_name — FQDN
    • registrant — через кого был зарегистрирован домен
    • tld — зона для быстрого поиска
    • register_date — дата регистрации
    • register_date_end — дата окончания регистрации
    • free_date — дата освобождения домена
    • delegated — домен делегирован или нет
    • a1...a4 — A записи домена
    • ns1...ns4 — NS записи домена, именно те, которые отдает DNS
    • mx1...mx4 — MX записи домена
    • txt — TXT запись домена
    • asn1...asn4 — номер AS для соответствующей А записи
    • aaaa1...aaaa4 — AAAA (ipv6) записи домена
    • cname — CNAME записи домена

    domain_history: содержит историю изменений записей в таблице domain, помимо всех полей, которые есть в domain, присутствуют еще поля:
    • domain_id — ссылка на запись в domain
    • date_start — дата, с которой данная информация была актуальной
    • date_end — дата, когда информация перестала быть актульаной

    Представленные ниже таблицы содержат агрегируемую информацию:
    • domain_count_statistic — количество доменов в разных зонах по дням
    • as_count_statistic — количество доменов на AS по дням
    • mx_count_statistic — количество доменов, использующих MX, по дням
    • ns_count_statistic — количество доменов на NS серверах по дням
    • registrant_count_statistic — статистика по регистраторам по дням
    • a_count_statistic — статистика по количеству доменов на одном IP по дням
    • cname_count_statistic — статистика по данным CNAME по дням

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

    Нагрузка на сервер


    Как соучредителю хостинга, после долгих уговоров мне все-таки выделили сервер =) Соответственно, статистику на постоянной основе начал собирать с января 2016, правда иногда забывал включать после перезагрузки.
    Все это дело работает на сервере 2 x Intel® Xeon® CPU E5-2620 0 @ 2.00GHz с 32 Gb RAM.
    Для сбора данных и агрегирования статистики по всем доменам требуется примерно 11 часов. На текущий момент в таблице domain_history содержится 41436250 записей, общий размер БД 23 гигабайта. Количество потоков pdns и параллельных обработчиков выбиралось экспериментальным путем остановился на обработки в 150 потоков.

    Графики нагрузки CPU, LA и потребления памяти приведены ниже:







    Запуск скрипта сбора статистики



    Самый простой вариант запуска через Docker. Устанавливаем Docker и git

        sudo apt-get update
        sudo apt-get install docker.io git

    скачиваем репозиторий

        cd /home
        git clone https://github.com/AlexeyManikin/domain_statistic.git

    собираем образы

        cd domain_statistic/docker
        docker-compose build

    запускаем контейнеры

        docker-compoces up -d


    Доступ к базе


    Если кому интересно, создал копию базы, открыл доступ к БД в режиме ReadOnly, можно зайти поиграться (ограничение в 300 подключений). Если будет хабраэффект — будет тупить =).
    Сервер: manikin.beget.ru
    Порт: 3310
    Пользователь: amanikin_stat
    Пароль: openstatistic
    База: domain_statistic

    Если кто не умеет пользоваться консолью, установил PhpMyAdmin: pma.amanikin.ru

    Интересные SQL, которые нам пригодились:


    #  Количество доменов, которые прописали вместо MX NS-сервера
    mysql> SELECT count(*) FROM domain WHERE mx1 LIKE 'ns1.%';
    +----------+
    | count(*) |
    +----------+
    |     1064 |
    +----------+
    1 row in set (22.05 sec)
    
    # Наоборот
    mysql> SELECT count(*) FROM domain WHERE ns1 LIKE 'mx%';
    +----------+
    | count(*) |
    +----------+
    |      436 |
    +----------+
    1 row in set (0.01 sec)
    
    
    # Количество доменов, которые будут разделегированы, если не будут в ближайшее время оплачены
    mysql> SELECT count(*) FROM domain WHERE register_date_end <= '2016.05.27';
    +----------+
    | count(*) |
    +----------+
    |   231235 |
    +----------+
    1 row in set (27.99 sec)
    
    # На некоторых таблицах делать выборки, используя LIKE, крайне накладно, поэтому при выборках использовали FULLTEXT INDEX.
    # К примеру, выбрать из таблицы domain, где более 6 млн. записей, все домены со словом habrahabr можно так
    mysql> SELECT domain_name FROM domain WHERE MATCH (domain_name) AGAINST ('+habrahabr*' IN BOOLEAN MODE);
    +---------------+
    | domain_name   |
    +---------------+
    | habrahabrs.ru |
    | habrahabr.ru  |
    | habrahabra.ru |
    | habrahabr.su  |
    | habrahabru.ru |
    +---------------+
    5 rows in set (2.18 sec)
    # Для сравнения, аналогичный запрос с использованием LIKE выполняется около минуты. 
    
    # выбираем кол-во доменов, у которых в ns серверах содержится слово beget
    mysql> SELECT count(*) FROM domain USE INDEX(ns_all_ft) WHERE MATCH (ns1,ns2,ns3,ns4) AGAINST('+beget*' IN BOOLEAN MODE)
    +----------+
    | count(*) |
    +----------+
    |   224715 |
    +----------+
    1 row in set (2.18 sec)
    
    # Для выборки только по ru доменам надо добавить условие tld = 'ru'
    

    Или как менялись DNS для домена habrahabr.ru

    Результат выборки
    mysql> select * from domain_history where domain_id = '1717034' \G 
    *************************** 1. row ***************************
                   id: 1717033
            domain_id: 1717034
           date_start: 2015-07-31
             date_end: 2015-09-18
          domain_name: habrahabr.ru
           registrant: registrator-ru
                  tld: ru
        register_date: 2006-04-18 00:00:00
    register_date_end: 2016-04-18 00:00:00
            free_date: 2016-05-19 00:00:00
            delegated: Y
                   a1: 178.248.233.33
                   a2: NULL
                   a3: NULL
                   a4: NULL
                  ns1: ns1.habradns.net.
                  ns2: ns2.habradns.net.
                  ns3: ns3.habradns.net.
                  ns4: NULL
                  mx1: alt1.aspmx.l.google.com.
                  mx2: alt2.aspmx.l.google.com.
                  mx3: aspmx.l.google.com.
                  mx4: aspmx2.googlemail.com.
                  txt: mailru-verification: 78856df53544c6fd v=spf1 include:spf.habramail.net include:aspmx.googlemail.com ~all
                 asn1: 197068
                 asn2: NULL
                 asn3: NULL
                 asn4: NULL
                aaaa1: NULL
                aaaa2: NULL
                aaaa3: NULL
                aaaa4: NULL
                cname: NULL
             nserrors: 
    *************************** 2. row ***************************
                   id: 15762868
            domain_id: 1717034
           date_start: 2015-09-18
             date_end: 2016-04-12
          domain_name: habrahabr.ru
           registrant: registrator-ru
                  tld: ru
        register_date: 2006-04-18 00:00:00
    register_date_end: 2016-04-18 00:00:00
            free_date: 2016-05-19 00:00:00
            delegated: Y
                   a1: 178.248.233.33
                   a2: NULL
                   a3: NULL
                   a4: NULL
                  ns1: ns1.habradns.net.
                  ns2: ns2.habradns.net.
                  ns3: ns3.habradns.net.
                  ns4: NULL
                  mx1: alt1.aspmx.l.google.com.
                  mx2: alt2.aspmx.l.google.com.
                  mx3: aspmx.l.google.com.
                  mx4: aspmx2.googlemail.com.
                  txt: google-site-verification=kdqnhqj_7jlohipxgkwxizyedshff0askqtc2ovh1em mailru-verification: 78856df53544c6fd v=spf1 include:spf.habramail.net include:aspmx.googlemail.com ~all
                 asn1: 197068
                 asn2: NULL
                 asn3: NULL
                 asn4: NULL
                aaaa1: NULL
                aaaa2: NULL
                aaaa3: NULL
                aaaa4: NULL
                cname: NULL
             nserrors: 
    *************************** 3. row ***************************
                   id: 35689334
            domain_id: 1717034
           date_start: 2016-04-12
             date_end: 2099-01-01
          domain_name: habrahabr.ru
           registrant: registrator-ru
                  tld: ru
        register_date: 2006-04-18 00:00:00
    register_date_end: 2017-04-18 00:00:00
            free_date: 2017-05-19 00:00:00
            delegated: Y
                   a1: 178.248.233.33
                   a2: NULL
                   a3: NULL
                   a4: NULL
                  ns1: ns1.habradns.net.
                  ns2: ns2.habradns.net.
                  ns3: ns3.habradns.net.
                  ns4: NULL
                  mx1: alt1.aspmx.l.google.com.
                  mx2: alt2.aspmx.l.google.com.
                  mx3: aspmx.l.google.com.
                  mx4: aspmx2.googlemail.com.
                  txt: google-site-verification=kdqnhqj_7jlohipxgkwxizyedshff0askqtc2ovh1em mailru-verification: 78856df53544c6fd v=spf1 include:spf.habramail.net include:aspmx.googlemail.com ~all
                 asn1: 197068
                 asn2: NULL
                 asn3: NULL
                 asn4: NULL
                aaaa1: NULL
                aaaa2: NULL
                aaaa3: NULL
                aaaa4: NULL
                cname: NULL
             nserrors: 
    3 rows in set (0.04 sec)
    


    Полный SQL дамп в виде архива можно сказать по ссылке (размер 2.2G)

    Аналогичные проекты


    http://1stat.ru/
    http://statonline.ru/
    http://stat.nic.ru/
    https://myip.ms/view/best_hosting/RUS
    и другие…

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

    Ссылки


    Сайт — http://firststat.ru
    Репозиторий — https://github.com/AlexeyManikin/domain_statistic
    Создатели:
    pavelodintsov — создатель идеи и прототипа
    redfenix — реализация на Python, сбор и хранение данных, прототип сайта
    ilin — доработка сайта

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

    Комментарии 14

      +4
      Вот она чудесная сила открытого кода! :) Когда выкладывал даже не думал, что кому-то он пригодится, просто жалко было удалять код проекта, на который потрачено прилично времени.
        +2
        был приятно удивлен пару недель назад обновлению :) давно пора было кроме парсинга NS-ов прикрутить все остальное.

        хотел все лично спасибы отправить, но получается что благодарю тут! Спасибо!
          +2
          Отличный сервис!

          Мы тоже очень расстроены текущим состоянием 1stat. Пожелание — группировать нс сервера провайдеров, автоматически и с возможностью вручную передать список своих серверов (например, у нас — они в непохожих разных доменах).
            0
            Проект открытый — его можно развивать и улучшать. Уже почти прикрутил историю скриншотов, среднее время отклика. Может получится уговорить Григория добивать его сервис проверки на вирусы =)
              0
              btw — как бы баг — по слову dobrohost в списке провайдеров — отдается dobryjhosting, а собственно доброхост я там так и не смог найти.

              При этом — дипхост находится по слову bz8, и показывается как bz8.ru.

              Определенно, нужна табличка соответствия названия провайдера и списка его нс серверов.
                0
                Это не баг, мы не ставили задачу знать всех провайдеров =). Но при этом — хорошая идея, отписался ниже, если поможете сделать такое соответствие — будет здорово.
              +1
              В данный момент есть группировка по провайдерам http://firststat.ru/?type=ns&date_start=2016-5-27&date_end=2016-5-27&sort_f=domain&sort_type=desc&aggregate=1&typep=all, но она берет в рейтинг, тот ns, на котором больше всего доменов на текущий момент, что тоже не очень корректно. В конце пришли к выводу, что более правильный вариант, это проверять все DNS доменов на наличие в них наименования провайдера. То есть если хотя бы один из ns содержит наименование провайдера, то этот домен относится к этому провайдеру. Этот принцип применен в сводной статистике — http://firststat.ru/summary-stat?zone=ru и скоро также выведем статистику по этому принципу в таблице. Если же один провайдер имеет совсем не похожие ns, то они отобразятся как разные провайдеры — единственный способ учитывать такие моменты, корректировать их вручную.
                +1
                > проверять все DNS доменов на наличие в них наименования провайдера

                Это несколько неправильно. Например, у нас есть домены с нс серверами в старом домене knutov.net и в новом после ребрендинга много лет назад dobrohost.ru. И есть еще два домена с нс серверами, относящимися к нашим вдс, совсем в других доменах. С 1stat можно было отправить список нс серверов и потом всё группировалось правильно.

                (был бы проект на перле — я бы дописал нужную функциональность, но увы).
                  0
                  За списком NS серверов нужно следить — это большая проблема. Опять же Вы правильно сказали — домены на других серверах есть не только у Вас, актуализировать информацию для ТОП 20 будет не очень сложно (далее сложнее), но это в любом случае ручная работа. Постоянно придется обновлять. В данном случае более корректно смотреть по количеству доменов на AS.

                  В текущей версии сайта — это вывод агрегированных данных из БД. Если есть желание, в понедельник могу набросать интерфейс для сопоставления NS, MX, сетей, AS c провайдером и предоставить его Вам =)
                    0
                    > смотреть по количеству доменов на AS

                    Вообще неправильная идея. Например, у нас нет своей AS и не появится прежде, чем в ней будет реальная необходимость. И таких — большинство.

                    Идея дать мне интерфейс — хорошая. Время для ручных правок есть )
                      0
                      У маленьких хостингов нет своих сетей, они берут в аренду IP адреса у тех же дата-центров. У более или менее больших — почти всегда есть своя AS.

                      Без своей AS невозможно управлять связанностью, балансировать мощные DDOS, оптимизировать маршруты, создавать CDN, решать проблемы плохих маршрутов. Я уже не говорю о банальном переезде в другой ДЦ. На определенной стадии развития хостингу необходима собственная AS и если посмотреть статистику у всех крупных хостингов есть своя AS. Это один из компонентов качества услуги.

                        0
                        Или они берут целые блоки в аренду у кого-то еще.
                        Или они большие, но сидят в хетзнере, умеют его готовить и им всё ок.

                        Проблема смены ип адреса при переезде — не так чтобы проблема, а иногда и не проблема вовсе.

                        Некоторым хостингам на определенной стадии может потребоваться собственная AS.

                        В общем, с позиции топ20 как оно там у более мелких, наверное, уже не очень хорошо видно, да и просто не интересно, но не надо так категорично.
              +2
              Спасибо, Алексей, достойный сервис. Надеюсь будет жить долго и процветать. У 1stat сложная судьба сложилась.
                0
                Изменились параметры доступа в pma

                PhpMyAdmin: pma.amanikin.ru
                mysqlUser: readonly
                mysqlPasswd: readonly

                Так же добавил статистику по среднему возрасту доменов для AS, IP, NS

                ТОР 20 самых старых AS (по возрасту доменов в зоне .ru)


                ТОР 20 самых молодых AS (по возрасту доменов в зоне .ru)


                Явная корреляция между датой основания компании и возрастом доменов на ней

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое