powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Распределние нагрузки на БД с постоянным обновлением
19 сообщений из 19, страница 1 из 1
Распределние нагрузки на БД с постоянным обновлением
    #36165709
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток. Иcпользуется сервер PostgreSQL 8.3 в качестве БД для хранения полученной мониторинговой информации. То есть записи в нескольких таблицах обновляются постоянно, практически независимо от времени суток, минимальное число транзакций 10-15 в секунду, померяно запросом
SELECT SUM(xact_commit+xact_rollback) as trans from pg_stat_database where datname = '...'
и отслежена разница значений в различные промежутки времени. В течение суток нагрузка по обновлению так же меняется, пиково до 50-60 транзакций в секунду, в среднем 30-35.
Объем основной таблицы в чистом виде пока около 30 млн строк (естественно, растет довольно быстро). Для анализа мониторинговой информации используются различные запросы, основная цель которых - обработка данных мониторинга за некий временной период(вполне большой, например, месяц) и выдача статистистических данных типа суммы ,среднего и пр.
Как сделать так, чтоб при выполнении этих запросов снизить уже сейчас сильные тормоза?
Варианты с использованием индексов, VACCUM уже пробовали, помогает, но слабо. Нужно изменить структуры выполнения запросов.

Естественным образом родилась идея считать промежуточные отчеты в периоды низкой загрузки БД ночью (например, за час или сутки) и хранить отдельно, используя при генерации окончательных отчетов. Но тут встали вопросы:
1) С какой периодичностью делать промежуточные отчеты (минута, час, сутки, неделя)?
2) Делать ли это в несколько слоев? То есть собирать промежуточные отчеты за меньшие промежутки времени, потом за большие, а потом уже их использовать в окончательных запросах?

Есть так же вариант считать некоторые элементы статистики на лету (типа суммы, количества записей). Но это не универсальное решение, потому характер статистики будет менятся со временем

Хотелось бы узнать, правильной ли дорогой идем и делал ли кто так раньше. Если делали по другому, то поведайте, как именно
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36165940
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделать две базы:
1. OLTP, максимально упрощенная, без лишних связей и взаимодействий между таблицами, просто тупо пишем в нее
2. OLAP, реплицируем в нее данные в менее нагруженное время. Данные могут быть избыточны для ускорения скорости работы запросов. Запросы только на чтение.
С уважением, Naf
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36166020
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nafсделать две базы:
1. OLTP, максимально упрощенная, без лишних связей и взаимодействий между таблицами, просто тупо пишем в нее
2. OLAP, реплицируем в нее данные в менее нагруженное время. Данные могут быть избыточны для ускорения скорости работы запросов. Запросы только на чтение.
С уважением, Naf

Спасибо за совет.
Была подобная мысль. Только не для разных БД, а для разных схем в пределах БД (особенность используемой СУБД, но по сути тоже самое). Пока отложили ее реализацию, идея не понравилась тем, что база будет разрастаться просто так вдвое, если выполнять полную репликацию. Можно совместить Вашу идею с нашей, то есть выполнять репликацию уже с промежуточными отчетами
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36166559
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakama... а для разных схем в пределах БД...
вы не говорили что за железо... возможно поможет -
ИМХО для схем разные тэйбелспэйсы на разных винтах, по возможности индексы на отдельном винте...
реплицировать полностью, как предложил Naf... дореплицировать новое можно каждые 10 минут... там наверно на пару секунд будет всплеск на графике загрузки процессора )
методом тыка можно подобрать наиболее "безболезненный" период для вашего сервера

на основных данных можно с индексами не заморачиваться

с копии же можете уже свои отчёты генерить...
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36166684
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кифирчик,

К сожалению, решение бюджетное на одном диске ATA/SATA, поэтому приходится компенсировать отсутсвие RAID и/или SCSI программными изворотами. В конкретном контексте (идет постоянный INSERT в таблицу, откуда идут выборки) увеличение кэша практически не поможет :(
Отношение hit / read (http://postgresmen.ru/articles/view/48) для базы очень маленькое (около 55-60), поэтому самым узким местом у нас являестя диск
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36166784
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> решение бюджетное на одном диске ATA/SATA

Вы не на том экономите. Вы полагаете стоимость данных (или сервиса) эквивалентной стоимости hdd. Зачем заниматься разработкой того, что стоит 50 баксов? Простейший массив, вдвое увеличивающий скорость доступа к дисковой, обойдется дешевле килобакса.
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36166856
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот для бюджетного решения, самый простой спосооб расширить I/O, это разместить таблицы на разных винтах (в данном случае ИМХО лучше без рэйда, объём винтов будет избыточный, друг на друга можно бэкапить)....
а лучше 3 винта, отдельный под индексы или под операционку... саташный винт стоит 1100р
вы хоть как программно извратитесь, но либо при репликации, либо при получении отчёта будут тормоза... будут сперва утюжиться индексы, потом данные агрегатироваться...

правильно подмечено, вы не на том экономите
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36167147
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нормальных только два варианта

А) как уже сказали, две базы, в одну пишем, по втрой гоняем отчеты. Две машины, две базы, slony для репликации.

Б) не писать в базу 30-60 раз в секунду, т.e. база дла только для OLAP. Группируйте эти записи, потом заливайте в базу много записей раз в Х минут. Простейший вариант: пишем данные CSV фаилик, потом раз в Х минут делаем COPY в базу.

выбор варианта зависит от ситуации. Если вы стоите/поддерживаете систему "для себя", т.е. система для внутреннего использования, то вариант А предпочтительней т.к. покупка второго сервера и настройка репликации [намного ] дешевле времени разработчиков на переделку и тестирование новой системы по варианту Б.

если система делается на продажу или это система которая приносит основной доход организации, то тогда надо переделать систему по варианту Б.
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36167677
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konstantin~выбор варианта зависит от ситуации. Если вы стоите/поддерживаете систему "для себя", т.е. система для внутреннего использования, то вариант А предпочтительней т.к. покупка второго сервера и настройка репликации [намного ] дешевле времени разработчиков на переделку и тестирование новой системы по варианту Б.

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

Существующий вариант интересный. Некоторые системы уже стоят на внешних объектах и изменить их "железный состав" нельзя, некоторые еще на стадии разработки и согласования, соот-но, их состав поменять можно. То, что крайне желательно использовать многодисковые структуры - это понятно (теперь:( ), сейчас вопрос состоит в минимизации суммарных затрат денег и времени на внедрение внедрение более-менее эффективного решения, которое можно использовать как на развертываемых системах, так и на существующих.
Использование OLAP под PostgreSQL (http://www.sql.ru/forum/actualthread.aspx?tid=345406) под большим сомнением, предложенная по ссылке документация писана иероглифами Может, кто знает другие средства?
Может, не очень ясно была поставлена задача - в отчетах нужна информация как архивная, так и оперативная, то есть с точностью до последнего обновления таблицы телеметрии. Если использовать схему с разделением, то все равно потребуется выполнять выборку к таблице с оперативной информацией.

На Ваш взгляд, какова будет эффективность использования подобной схемы:
1) Вынести на один диск малоизменяющуюся часть базы и операционку (диск speed_l), на второй - таблицу телеметрии и индексов по ней (диск speed_h)
2) По мере заполнения таблицы телеметрии (раз час, например, период подобрать опытным можно путем), переносить данные на диск speed_l и там уже считать статистику напрямую. А перенесенные данные с диска speed_h удалять, выполняя vacuum для поддержания высокой эффективности вставки и поиска.
3) Уже для перенесенных данных на диске speed_l выполнять подсчет промежуточной статистики и хранить ее в отдельной таблице (делать это в моменты наименьшей загрузки). Хотя тут уже спорно, может и не выполнять промежуточных подсчетов.
4) При запросе отчетов брать данные из промежуточных подсчетов, а затем, если в отчете требуется оперативная информация, лезть на диск speed_h за ней
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36168004
Zorrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На данный момент решаю похожую задачу по хранению телеметрии.
Пока тестирую следующую архитектуру(включая програмную часть):
1. База телеметрии - 2 таблицы. 1 - Индексы(самописные) 2 - Сама телеметрия. Связей нет.
2. Все приходящие данные при помощи опять же самописного балансировщика нагрузки раскидываются по сервисам-нодам на разных компах при помощи MSMQ и WCF.
3. В каждом ноде есть свой кэш, организованный при помощи MS Enterprise Library Cache Block.
4. Для хранения кэша используется жестак. Как только по устройству получено 1000 записей -
они пишутся в базу одним куском и для них создается индекс(тестовый вариант, пока так
оставили на время).
5. Запросы от клиентов обрабатывает отдельный сервис - который в свою очередь посылает
запросы нодам, агрегирует полученную информацию и отдает клиенту.

Но у нас требование что-бы сервер работал с любой бд. И соответственно приходится работать через NH. Но перфоманс на запись более чем приличный после оптимизации. А распределение нодов позволяет очень хорошо масштабировать сервер.
Для всех задач обработки используется CCR от Robotics Studio =D

Кол-во транзакций похожее как в пике так и в среднем.
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36168213
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zorrik,

Как я понял, основной упор сделан на распараллеливании записией по нескольким БД, находящихся на разных машинах и кэшировании запросов обновлений? Причем признаком объединения записей в обин блок кэша служит код устройства, приславшего данные?

Если так, то да, для очень масштабных решений это скорее всего подойдет. Хотя интересно - а собирали ли Вы статистическую информацию на такой архитектуре? И как будет выполнятся запрос, если данные потребуются не по устройству-источнику сообщений, а по объекту, на котором могут быть установлены разные устройства или будет идти миграция устройств со временем по объектам? Ведь прийдется шарить по разным базам на разных машинах. У Вас есть отдельный механизм, который это регулирует?
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36168478
Zorrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем так - используются не несколько устройств на объекте, а несколько датчиков - которые предоставляют информацию через 1 устройство.
Агрегация идет по uid устройства. Уид всегда уникален для каждого устройства.
Что бы небыло проблем с перекидыванием и если вдруг случится так что на 1 объекте будет 2 устройства - используются внутренние uidы устройств в сервере. Особых проблем пока не возникало на эту тему.
На данный момент как раз и собираю. Пока что все устраивает.
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36168550
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zorrik,

Просто я так понял, что информацию Вы раскидываете по разным машинам, объединяя их по устрйоствам? скажем, данные с первых 100 устройств на 1 машине, со следующих 100 на 2й и тд?
И отдельно храните информацию по установкам устройств на объекты. Так вот, интересно, если устройства будут мигрировать по объектам (монтаж/демонтаж) как Вы будете получать информацию по данным с одного объекта, если там за запрашиваемый период стояло разное оборудование (сначало одно устрйоство, а потом другое)? Ведь получится, что запрос нужно будет разбивать к разным БД на разных машинах?
1) Это прийдется предусматривать чисто технически (или используется какая-то схема автоматизации?)
2) Как долго будет выполнятся такой запрос? С учетом сетевого взаимодействия между БД при выполнении запросов.

Или изначально в проект заложено, что вероятность миграции устройств мала и узким местом это точно не будет?
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36168598
Zorrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. у нас заложено что вероятность миграции устройсв мала.
Немножко не так распределяется нагрузка. Пример:

Пришло сообщение от устройства - сервис - который служит входным шлюзом, смотрит какие сервера ему доступны, и по msmq отправлет сообщение тому серверу, который идет следующим по списку. Тоесть вполне возможна ситуация, когда 10 принятых подряд сообщений от одного устройства будут находиться на 10 разных серверах.
Запросы на данные будет идти через клиентский шлюз, который знает список дата провайдеров и отправляет им запросы, после получения всех запросов(учитываются таймауты для сети), данные агрегируются и отдаются клиенту. Что-то напоминающие DLINQ из DSS. Как транспорт между сервисами используется MSMQ - сообщения очень шустро бегают и это еще гарантия доставки и защита от выключений серверов и тд.
Некоторые решения подглядел в StockTrader у MS.
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36169957
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Zorrik,

А какой анализ скорости выполнения запросов на выборку? Например, не элементарного запроса по номеру устройства, а чего-нибудь посложнее, гарантированно требующего обращения к нескольким серверам на разных машинах? Ожидание тайм-аутов, передача сообщений и пр.
Как я понимаю, такая архитектура была выбрана из-за ограниченя на поддержку произвольных СУБД? Иначе в пределах того же Postgres или Oracle тоже самое можно орагнизовать встроенными средствами.
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36171086
Фотография shelsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakamaС какой периодичностью делать промежуточные отчеты (минута, час, сутки, неделя)?
Делать ли это в несколько слоев? То есть собирать промежуточные отчеты за меньшие промежутки времени, потом за большие, а потом уже их использовать в окончательных запросах?

1) С точки зрения программного решения импонирует решение Naf
2) Собственно я бы по периодам проанализировал
а) запросы пользователей выполняемых для анализа мониторинговой информации
б) нормативные документы по частоте выполнения таких запросов и срокам хранения данных
и нарезал бы "периодические" слои исходя из этого, тем самым подняв бы быстродействие системы
по статистически типовым запросам. При задании выборки вне указанных срезов, да пользователю придется подождать но как правило такие запросы достаточно уникальны и не критичны к скорости
3) Утилитарно предположим что у нас есть абстактный банк храним временные срезы
- за каждый год
- квартал
- последний квартал по дням
- последний месяц по часам

P.S. в принципе конечно надо рассматривать область применения ваше системы. так что совет не идеален для определенных предметных областей







______________________________________________________
Давайте считать обступившее нас со всех строн коричневое море шоколадным
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36171091
Zorrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kamakama,

Большинство запрсов как раз идет по номеру устройства и типу данных. То есть заранее система проектировалась так, что бы как можно меньше зависеть от конкретной субд. Так же немаловажный фактор - стоимость владения. Обслуживание Оракла в качестве единой базы и к примеру пара простеньких компов за 10 тыс р с постгресом или сиквелом - немножко разные вещи. Есть заказчики которые просто хотят получить продукт и их ИТ инфраструктура на уровне каменного века=) И зачасту максимум что могут потратить это купить винсервер. Отказывать мы им не можем. Так же такой подход дает возможность очень легко масштабировать систему. Почти никаких доп настроек. Справиться даже бухгалтер=) Плюс еще достаточно легко настройить зеркальные ноды для подстраховки. То есть при падении канала связи к 1 серверу шлюз ищет его копию и начинает слать данные туда, как и клиентсуий сервис.
Запросы пока профайлили не особо. По сравнению со старой версией быстрее раза в полтора на выборках по 100 тыс. сообщений.
Ноды ксттаи могут и в 1 базу писать. Зависит от настроек. Все весьма гибко, что бы любой заказчик был доволен=) Это ведь главное=)
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36171898
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за выраженные мнения и переданный опыт! Будем экспериментировать. Если еще у кого есть какие мнения - делитесь, пожалуйста
...
Рейтинг: 0 / 0
Распределние нагрузки на БД с постоянным обновлением
    #36172110
kamakama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZorrikЗапросы пока профайлили не особо. По сравнению со старой версией быстрее раза в полтора на выборках по 100 тыс. сообщений.
А как была организованна предыдущая версия? Чтоб было с чем сравнить
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Распределние нагрузки на БД с постоянным обновлением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]