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

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

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

Оригинальный проект: https://github.com/pavel-odintsov/ru_open_statistics
Мой форк, переписанный на Python: https://github.com/AlexeyManikin/domain_statistic
Для работы необходимы модули Python:
Также необходим сервер MySQL и крайне желательно быстрый DNS резолвер, так как основная часть нагрузки приходится на него. Необходимо запросить все записи (A, AAAA, SOA, TXT, MX, SRV, NS) для каждого из 6000000+ доменов. В первое время также собирал информацию с аналогичных проектов для проверки корректности результатов.
Структуру проекта описывать, полагаю, не имеет смысла, код достаточно простой для понимания.
update_as_info.py — обновляет данные по AS
update_domain.py — обновляет данные по доменам
update_statistic.py — агрегирует статистику в БД
Ниже приведу таблицы с полями, которые могут быть полезны при выборке данных:
as_list: таблица соответствия номера AS и ее описания, страны
domain: таблица, в которой хранится текущее состояние домена, полагаю, большая часть полей понятна из названия
domain_history: содержит историю изменений записей в таблице domain, помимо всех полей, которые ес��ь в domain, присутствуют еще поля:
Представленные ниже таблицы содержат агрегируемую информацию:
Всю статистику можно выбрать из таблиц 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
скачиваем репозиторий
собираем образы
запускаем контейнеры
Если кому интересно, создал копию базы, открыл доступ к БД в режиме ReadOnly, можно зайт�� поиграться (ограничение в 300 подключений). Если будет хабраэффект — будет тупить =).
Сервер: manikin.beget.ru
Порт: 3310
Пользователь: amanikin_stat
Пароль: openstatistic
База: domain_statistic
Если кто не умеет пользоваться консолью, установил PhpMyAdmin: pma.amanikin.ru
Или как менялись DNS для домена habrahabr.ru
Полный 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 — доработка сайта
Будем рады пожеланиям по улучшению. Если кому нужен доступ к базе для ваших приложений — пишите, откроем.
Рабочий день обычно начинался с чашечки кофе и приятного просмотра значений прироста доменов. Конечно же, такие метрики не показывают ни успешность компании, ни ее капитализацию, ни тип клиентов, которые размещаются у компании. Но, несмотря на это, косвенно можно оценить динамику роста или деградации компании — если количество доменов на 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 — доработка сайта
Будем рады пожеланиям по улучшению. Если кому нужен доступ к базе для ваших приложений — пишите, откроем.