LINUX.ORG.RU
ФорумAdmin

Пиковый сбор данных.


1

3

Доброго дня господа.
Ремарка.Редкий случай, когда обращаюсь по непосредственно рабочему вопросу, потому кто не любит такого - прошу сразу учесть это и мирно пройти мимо. Спасибо.

Суть: есть over 3000 машин определённого класса, на которых стоит полноценный дистрибутив линукса. Задача - включить их всех в мониторинг, учитывая то, что путём monitor -> node пойти нельзя, ибо машины за натом, и плюс доступ только поверх впн"а. Итого нужен путь monitor <- node, ибо сами машины могут лить во внешку.
Сразу захотелось решить прямо - и просто инсертить в базу мускула, и там уже парсить данные. Но в силу обстоятельства и механики - оно будет отчитываться одновременно (в пределах нескольких секунд, по всей стране). Синтетический бенчмарк нам показал, что в нашу базу входит ежесекундно только 1000 трэдов. Воспримем это как константу с обстоятельствами, что мы не в силах исправить (ну а сама пачка этих отчётов будет приходить раз в час).
Итого хотелось бы сделать прослойку, что будет собирать отчёты, а потом уже складывать в базу. И вот тут мои знания сугубо дилетантские, и как это сделать по красоте и разумно, что бы еще и не терять сообщения - я не знаю. Тыкнув пальцем в небо - задумался делать это через ssh. Но тут бенчмарков просто нету.
Кто-то сталкивался с подобными задачами, и\или имеет мнение по этому поводу? Заранее благодарен адекватно ответившим.

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

Правда потеряется "мгновенность", зато можно регулировать нагрузку.

Для синхронизации предлагаю простое условие: машина заливает файл за секунды, а скрипт обрабатывает только файлы, изменённые более минуты назад.

Ну или даже проще - 3000 sqlite баз, из которых скрипт забирает свежие данные (вроде там всё нормально с блокировкаи)

ziemin ★★
()

Сразу захотелось решить прямо - и просто инсертить в базу мускула,

ну так необязательно сразу на диск писать, можно сначала в память, как там тот движок MySQL называется соответствущий

а потом сохранять на диске в нормальную таблицу

Harald ★★★★★
()
Ответ на: комментарий от zgen

Активные сессии похожи на то что нужно, но вот это будет работать при условии заведомо ожидаемых нод.
А тут проблема в том, что эти машинки плавающие. И могут появляться в разных местах, только после сообщать кто они, и на базе этого процессор запишет алиас на «кто""где», и отработает, на это время, мониторинг по этому «адресу», после чего, если нужно, забудет о нём.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от ziemin

Ну суть то первого предложения - снова же может упереться (неожиданно при чём) в прерывания самой ОС, к примеру (если я правильно выражаюсь). Такое проявляется только на больших объёмах. потому редко ожидаемо.
Второй, с муслайтом - пока, увы, не вариант.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Harald

ну так необязательно сразу на диск писать, можно сначала в память, как там тот движок MySQL называется соответствующий

Дело больше не в самой базе или ресурсах, а конфигурации сервака, где она живёт. Потому это, к сожалению, не вариант на данный момент. Уже смотрели тоже на подобное.

Spirit_of_Stallman ★★★
() автор топика

zabbix и zabbix прокси может мониторить все, что можно заскриптовать.

petav ★★★★★
()
Ответ на: комментарий от ziemin

Ресурс физический и логический - разное дело.
Серваки у нас дай скотче. Проблема именно в системных процессах, трэдах и прерываниях.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Harald

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

Spirit_of_Stallman ★★★
() автор топика

задумался делать это через ssh

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

Harald ★★★★★
()
Ответ на: комментарий от Harald

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

Вот, важная информация, спасибо. А по-поводу шифрования - в данном случае будут ходить данные, что можно не прятать, потому это не критично.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

И где загрузка? Прогуливаться скриптом раз в 10 сек (к примеру) на 100 отчетов (к примеру).

Можно же регулировать.

А машинки пускай льют следующий файл, если предыдущий не обработан (сиречь не удалён).

ziemin ★★
()
Ответ на: комментарий от Harald

как обычно, софт считающий деньги - редкостно говёного качества? )

Тут не только считают. И да, некоторые вещи сделаны так - что волосы дыбом. Что можем - переделываем по красоте, но есть моменты которые тупо нельзя побороть в силу туголобых ответственных и «интерпрайзности».

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от ziemin

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

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

Пре и постобработка - это плевать

Пусть ошибки обрабатывают ноды - отвалилась из-за перегрузки: sleep $(($RANDOM/1000))

ziemin ★★
()

Итого нужен путь monitor <- node

Фиговый вариант, у вас случаем не бот-сеть? :)

Синтетический бенчмарк нам показал, что в нашу базу входит ежесекундно только 1000 трэдов.

Одновременно 1000 коннектов ты хочешь сказать? См. ниже, в случае последовательной обработки будет один коннект, одна открытая сессия с одним/двумя подготовленными транзакциями. При этом комит в БД можно делать через 100/1000, а не как у вас (как я понял) один коннект/тред - одна транзакция - один коммит. Выйгрыш будет от снижения транзакций, но не фантастический.

Вообще 1000 записей в БД это не так много. Хотя, ты не указал объемы: кол-во таблиц, кол-во параметров, сколько процедур выполняется за раз или просто insert/update.

Тыкнув пальцем в небо - задумался делать это через ssh.

Просядет как канал, так и cpu, если сервак с мониторингом один. Поэтому грамотный вариант это сбор статистики и сжатие. При этом лучше вместо ssh использовать scp, т.е. по началу кидать просто файлы. Можно организовать через rsync.

gh0stwizard ★★★★★
()
Ответ на: комментарий от Spirit_of_Stallman

а сколько байт в одной порции данных, посылаемой с одного компьютера?

В идеале наименее ресурсозатратным будет отсылать один UDP пакет с каждого компа, принимающий сервер это всё моментально переварит

ибо машины за натом, и плюс доступ только поверх впн"а

а где и как обрабатываются входящие VPN соединения? Узкое место вполне может быть тут

Harald ★★★★★
()
Ответ на: комментарий от gh0stwizard

Просядет как канал, так и cpu, если сервак с мониторингом один. Поэтому грамотный вариант это сбор статистики и сжатие. При этом лучше вместо ssh использовать scp

в чем разница? Протокол один и тот же

Подозреваю, что если 3000 машин одновременно ломанутся на этот сервер, он превратится в тыкву, а клиенты отвалятся по таймауту раньше, чем смогут залогиниться )

Harald ★★★★★
()
Ответ на: комментарий от gh0stwizard

Фиговый вариант, у вас случаем не бот-сеть? :)

Нет, но могу сделать одним апдейтом :)

Одновременно 1000 коннектов ты хочешь сказать?

Да, на больше даёт отказ.

Вообще 1000 записей в БД это не так много

Да в том то и дело, большие проекты тянут от 100000, после уже начинаю думать про, к примеру, гибрид *sql и nosql баз.
А тут проблема в самой среде, где она живёт. Может и стоит поднять альтернативу и проверить. Что-то я не задумался о такой очевидности...

При этом лучше вместо ssh использовать scp, т.е. по началу кидать просто файлы. Можно организовать через rsync

Да, вариант как и у товарища ziemin'a. Но я боюсь решать без бенчмарков, хотя бы. Нужно будет быстро наваять хоть наколенный.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

но вот это будет работать при условии заведомо ожидаемых нод.

Откуда я знаю, возьмите да проверьте.

zgen ★★★★★
()
Ответ на: комментарий от Harald

а где и как обрабатываются входящие VPN соединения?

Циски с впн-серваками.

В идеале наименее ресурсозатратным будет отсылать один UDP пакет с каждого компа, принимающий сервер это всё моментально переварит

UDP подразумевает возможность потерять - а это чревато, в моём случае.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Harald

в чем разница? Протокол один и тот же

А ведь не сказано, что будет выполнятся по ssh. Можно и шел-скрипты пускать, тогда cpu будет съедено на выполнение их (3000 одновременных процессов). При scp протокол tcp сделает свое дело - будут какие-то задержки на заливку, но не более.

Подозреваю, что если 3000 машин одновременно ломанутся на этот сервер, он превратится в тыкву, а клиенты отвалятся по таймауту раньше, чем смогут залогиниться )

Нет. Считаем, что канал выдержит, вопрос встанет иначе: нагрузка io, нагрузка cpu. Сбрасываем вес io wait в надежде, что спасет дисковый кэш в несколько гигов. Остается cpu, но даже при больших нагрузках таймаутов не будет, пока не будет реальных блокировок, скажем те же дисковые операции или нереальные мегарасчеты в несколько потоков.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

scp как будто не поверх ssh работает

Нет. Считаем, что канал выдержит, вопрос встанет иначе: нагрузка io, нагрузка cpu.

в первую очередь всё упрётся в CPU, т.к. там много криптографических вычислений, Диффи-Хеллман и всё такое. Ну и плюс задержка из-за кучи запросов-ответов, которые по протоколу полагаются

Harald ★★★★★
()
Ответ на: комментарий от Spirit_of_Stallman

Городить велосипед для мониторинга - плохо. Если «велосипед» является неизбежностью в данных условиях, это в 95% значит что условия тоже являются велосипедом.

Поэтому надо стараться привести инфраструктуру к такому виду, чтобы она была manageable, тем более - когда речь о 3k машин.
Будут траблы в своем велосипеде - замучаетесь исправлять, да и инструменты вменяемого управления тоже придется «изобретать».

Что касается нагрузки - то на 3k машин может быть до 3k серверов мониторинга - масштабирование идеальное. Так что тут не вижу проблемы абсолютно.

zgen ★★★★★
()

Слишком много теории. Либо шапку топа в студию с сервера мониторинга/сервера БД, либо тебе никто не поможет и будет куча теории.

Шапка включает в себя load average, кол-во процессов, кол-во ОЗУ/свапа и статистика по нагрузке user/io/idle/etc. Т.е дефолт. В пиковой нагрузке. Также неплохо написать сколько ядер на серверах.

gh0stwizard ★★★★★
()
Ответ на: комментарий от Spirit_of_Stallman

UDP подразумевает возможность потерять - а это чревато, в моём случае.

ну если поверх голой сети, то да. А если внутри впн-а, то тут можно экспериментально проверить, бывают ли потери в принципе. Какой именно VPN используется?

Самая правильная схема, на мой взгляд: пишется софтинка, которая слушает сокет и ждёт подключений. Каждый подключившийся клиент сразу сливает свои данные (можно предварительно сжатые и зашифрованные) и отрубается, без всяких приветствий и протоколов. Данные запоминаются в памяти. Когда отрубится последний 3000-ый клиент, данные инсертятся в базу

Harald ★★★★★
()
Ответ на: комментарий от gh0stwizard

Да, крутили. Не помогло. Уповаем на центосопроблемы.
В общем уже выделил на завтра себе железку - сделаю тестовый сервак и погоняю всё как следует. Ибо 1000 для мускула - меня просто смущает даже.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Harald

scp как будто не поверх ssh работает

Я не хочу спорить, т.к. спор ни о чем. Одно дело пускать скриптики, другое - копировать файлы по 100кб.

Ну и плюс задержка из-за кучи запросов-ответов, которые по протоколу полагаются

В момент «задержек» ОС запоминает состояние процесса и переключается на другой. Почти любая операция по сети/сокетам это переключение контекста. Т.о 3000 процессов будут работать одновременно без особых задержек. Хватит теории, возьми да посмотри.

gh0stwizard ★★★★★
()
Ответ на: комментарий от zgen

Поэтому надо стараться привести инфраструктуру к такому виду

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

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от gh0stwizard

Я не хочу спорить, т.к. спор ни о чем. Одно дело пускать скриптики, другое - копировать файлы по 100кб.

какая разница? Установить ssh сеанс и залогиниться займет одинаковое время, независимо от того, файлик мы дальше будем копировать или буковки в консоли печатать

В момент «задержек» ОС запоминает состояние процесса и переключается на другой. Почти любая операция по сети/сокетам это переключение контекста. Т.о 3000 процессов будут работать одновременно без особых задержек. Хватит теории, возьми да посмотри.

не просто3000 процессов, а 3000 процессов, жрущих CPU на 100% :)

Harald ★★★★★
()
Последнее исправление: Harald (всего исправлений: 1)
Ответ на: комментарий от Spirit_of_Stallman

Тут такое не прокатит, увы.

Ростелеком какой-то ;)

но мир не идеален, и некоторые вещи можно исправить только после

Согласен. Но стараться не умножать проблемы можно начинать уже сейчас.

zgen ★★★★★
()
Ответ на: комментарий от Harald

какая разница?

Ладно, соглашусь, но только с тем, что ssh прожорлив по cpu сильнее остальных вариантов, например, просто сериализации текстовых данных (soap, xml, json и т.п)

Итого приходим к варианту сброса данных на чистых сокетах. Вопроса два: хранение данных и нужна ли защищенность данных (получим ssl, что не лучше ssh по сути).

Легкие решения: zabbix, apache/nginx + fastcgi + soap/json/bson/xml, либо corba (т.е. без этапа сериализации данных).

ТС, чем zabbix не угодил?

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

Итого приходим к варианту сброса данных на чистых сокетах. Вопроса два: хранение данных и нужна ли защищенность данных (получим ssl, что не лучше ssh по сути).

SSL тоже не нужен, данные шифруем предварительно и отправляем одним куском. Например, используя gnupg или openssl

Только ТС пока не озвучил количество байт от одного компа, поместятся ли все 3000 отчётов одновременно в RAM сервера

Harald ★★★★★
()
Последнее исправление: Harald (всего исправлений: 1)

При интенсивном поступлении событий из множества источников принято делать пакетный (butch) инсерт. Для этого события буферизируют, а затем несколько воркер-тредов (пул) - фиксируют записи пачками в БД.

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

Из готовых решений рекомендую Graylog2. http://server.dzone.com/articles/graylog2-optimization-high-log

zensey
()
Последнее исправление: zensey (всего исправлений: 1)
Ответ на: комментарий от Spirit_of_Stallman

Две копейки: если за NAT, то можно посмотреть в сторону всяких zabbix proxy. Ну это так. Малоли пригодно будет.

DALDON ★★★★★
()
Ответ на: комментарий от gh0stwizard

ТС, чем zabbix не угодил?

Мой поверхностный опыт работы с ним говорит что он не умеет узнавать новые хосты, по «нежданным» запросам, и забывать старые, если так нужно по каким-то условиям. Точнее это можно реализовать сторонними скриптами, но тогда, в моём случае, если будут обработчики - особо и заббикс уже не нужен, тем более что хранимая информация будет только псевдоактуальной, т.е. как и говорил, забор один раз в час.
Но я не отрицаю что могу просто чего-то не знать и не понимать, посему сделал заметку что в этом вопросе - дилетант.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Harald

Только ТС пока не озвучил количество байт от одного компа, поместятся ли все 3000 отчётов одновременно в RAM сервера

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

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от zensey

При интенсивном поступлении событий из множества источников принято делать пакетный (butch) инсерт. Для этого события буферизируют, а затем несколько воркер-тредов (пул) - фиксируют записи пачками в БД.

Это то что я и пытаюсь найти, тот самый харвестер, который пачками вложит всё в базу.

Из готовых решений рекомендую Graylog2

Спасибо, сейчас посмотрим что за зверь.

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от DALDON

Две копейки: если за NAT, то можно посмотреть в сторону всяких zabbix proxy. Ну это так. Малоли пригодно будет.

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

Spirit_of_Stallman ★★★
() автор топика
Последнее исправление: Spirit_of_Stallman (всего исправлений: 1)
Ответ на: комментарий от Spirit_of_Stallman

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

Для отправки идеальным будет агент, во второй версии запилили много нового, к примеру https://www.zabbix.com/documentation/2.0/manual/discovery/auto_registration.

То есть сценарий такой:
1. Хост выходит на связь с заббиксом, пересылает свой идентификатор и данные мониторинга
2. Если идентификатор новый - создаётся новая запись о хосте в заббикс
3. Если идентификатор уже существует - данные будут сохранены в привязке к старой записи о хосте
4. Записи о хостах заббикс не удаляются, и по ним всегда можно посмотреть историю

P.S. Будет одна проблема - обеспечить уникальность имени, которым будет представляться агент. Поскольку это имя определяется на стороне агента. То есть как минимум предотвратить дублирование.
P.P.S. Нужно будет продумать обеспечение надёжной идентификации «своих» клиентов

dmitryalexeeff
()
Последнее исправление: dmitryalexeeff (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.