Несколько тысяч в секунду… Это простите что мы такое измерять собрались? Поток квантов в запросе к WordPress? Я даже по другому спрошу — а что у нас на среднестатистическом сервере такой поток измерений выдать-то может, какой сенсор?
Облака, белогривые лошадки…
> Несколько тысяч виртуальных машин…
Ну так это кем надо быть, чтобы всё в один rrd пихать. Что вы там в этой каше после этого увидеть хотите. Или я неверно что-то понял? Это с одной стороны. С другой стороны — это простите по какому таймеру вы 1000-чи раз их опрашивать успеваете? Шедулер с ума не сходит? Ну и с третьей стороны… Очевидно, что при большом потоке данных надо какие-то телодвижения делать, чо уж тут. А в общем случае вполне себе база и вполне себе задачи выполняет, поддёвка афтора и давление авторитетом не уместно.
> А проблему мы решили
Какую проблему? Которую сами себе придумали?
> ~300% CPU, 6Gb памяти, около 100 IOPS
— Карты!
— 17!
— Что 17?!
— А что карты?
> Причём программист грозится задуматься об оптимизации
В какой rrd? У нас для этого специализированная СУБД написана.
А машины мы не опрашиваем по таймеру, мы их аккаунтим (за все эти ресурсы деньги в реальном времени списываем), а статистика — это такой побочный выхлоп сервиса аккаунтинга.
Проблему выдумывали не мы, а наши клиенты, которые хотели видеть rrd статистику по своим машинам. Вести 30-40 тысяч RRD совсем не хотелось. Пришлось придумать красивое решение. Я, кстати, о нём писал: habrahabr.ru/company/selectel/blog/122987/
> В какой rrd? У нас для этого специализированная СУБД написана.
Так вы пытались тысячи значений в rrd писать или нет? Определитесь уже.
> А машины мы не опрашиваем по таймеру, мы их аккаунтим… побочный выхлоп сервиса аккаунтинга.
И где тогда тысячи значений в секунду? Что-то я не осознал.
> Пришлось придумать красивое решение. Я, кстати, о нём писал
Не, ну чтобы данные централизировать придётся попрыгать да. Но это достаточно редкий случай. Я понимаю, конечно, что был повод понтануться в каментах. И что-то вы не договариваете, или в той статье вы пытались решить проблему аппроксимации на уровне запихивания данных в СУБД. Я вообще не понимаю, зачем собирать их с такой дискретностью, если вы потом всё равно со временными метками очень фривольно себя ведёте.
Вы просто rrdtool готовить не умеете.
У меня на сервере (hw.machine: i386 hw.model: Pentium III/Pentium III Xeon/Celeron hw.ncpu: 4) 10000 rrd обновляются двенадцатью потоками за 2 секунды. Что я делаю не так?
Можно ещё, конечно, было взглянуть в сторону rrdcached мне просто не подходит в силу того, что после обновления надо проверять значения, а это значит, что база данных всё равно перед проверкой будет сброшена на диск.
Ещё, в статье порадовало
Почему же мы не выбрали RRD? Ответ прост и печален: RRD не поддерживает bulk insertion — вы не можете за одну операцию сохранить несколько значений. Это означает, что вам придётся делать тысячи раздельных транзакций, каждая из которых больно бъёт по диску.
Хм… Я правильно понимаю, что вы использовали Graphite, вляпались в python GIL и решили что самое простое будет замусорить это всё страшной системой на erlang? Что-то от указанной в ссылке статьи попахивает странными увёртками от создателя whisper и питоном оттуда же.
>использовали Graphite
>вляпались в python GIL
>страшной системой на erlang
3 ошибки в одной фразе. Большое спасибо за ваше экспертное мнение, оно очень важно для нас. Оставайтесь на линии.
Для collectd кажется есть специальный кэш, который эту проблему решает и он не каждый пакет скидывает на диск. Да, есть риск потери пачки данных, но так это и решение не для атомной АС.
Одно не понятно, зачем лезть в пост про collectd/rrd со своими облаками?
Это как если бы залезть на форум автолюбителей со словами
«Чуваки, чтоб вы знали. Я подкачиваю шины на Формуле-1, и знайте, ваши запчасти там совсем не годятся.»
А в целом, пост ясный и понятный — краткое описание одного из вариантов решений небольшой задачки. Подобная информация реально экономит кучу времени тем, у кого появляется потребность в чем-то схожем.
А зачем данные collectd пересылать по UDP?.. Заработать себе проблем на пустом месте?
4.4.2 кстати действительно старая версия… и не просто старая, а старая как говно мамонта…
1. Завязка на точку, собирающую данные. Точка легла — данных просто нет.
2. Завязка на сеть. Шнур для работ выдернули на 5 минут — 5 минут данных нет. Например, произошла из-за выдера шнура проблема. И сиди гадай потом — из-за этого она произошла, или был другой источник.
Собственно все эти графики реально нужны раз в полгода. Но иногда в самое невовремя.
Согласен, но тут нигде речи не идет о том, что это все супер-мега надежно.
А на счет «графики нужны раз в полгода» — это не всегда так.
Например, у нас был случай — выкатили новую версию сервиса, через неделю по графикам увидели, что течет память. Тут же понятно когда началась утечка. Посмотрели по дате коммит, быстро нашли в чем косяк.
Даже если бы на час что-то выключали, то на надельном графике пробел был бы ну может в одну точку.
Зачем всё это? Не проше ли написать свой плагин? Зарегестрировать его в collectd как читателя и все данные, которые он собрал будет передавать дефолтный плагин network в colectd?
А по поводу веб обвязки, к collectd есть хорошая морда — collection3.
Например, у нас сервисы не только на python, но и на .NET. Не нужно никаких «читателей». Сервисы сами присылают данные.
Вообще pull-модель, когда кто-то ходит и опрашивает сервисы имеет явные недостатки (о которых я написал в самом начале) перед таким inline решением:
— приходится перенастраивать «читателя» при переносе сервисов или развертывании новых
— это более тяжеловесная модель и менее масштабируемая (см. обзор архитектуры)
Собираем свои счетчики через collectd протокол