|
|
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток. И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) Делать ли это в несколько слоев? То есть собирать промежуточные отчеты за меньшие промежутки времени, потом за большие, а потом уже их использовать в окончательных запросах? Есть так же вариант считать некоторые элементы статистики на лету (типа суммы, количества записей). Но это не универсальное решение, потому характер статистики будет менятся со временем Хотелось бы узнать, правильной ли дорогой идем и делал ли кто так раньше. Если делали по другому, то поведайте, как именно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 11:56 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
сделать две базы: 1. OLTP, максимально упрощенная, без лишних связей и взаимодействий между таблицами, просто тупо пишем в нее 2. OLAP, реплицируем в нее данные в менее нагруженное время. Данные могут быть избыточны для ускорения скорости работы запросов. Запросы только на чтение. С уважением, Naf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 12:56 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Nafсделать две базы: 1. OLTP, максимально упрощенная, без лишних связей и взаимодействий между таблицами, просто тупо пишем в нее 2. OLAP, реплицируем в нее данные в менее нагруженное время. Данные могут быть избыточны для ускорения скорости работы запросов. Запросы только на чтение. С уважением, Naf Спасибо за совет. Была подобная мысль. Только не для разных БД, а для разных схем в пределах БД (особенность используемой СУБД, но по сути тоже самое). Пока отложили ее реализацию, идея не понравилась тем, что база будет разрастаться просто так вдвое, если выполнять полную репликацию. Можно совместить Вашу идею с нашей, то есть выполнять репликацию уже с промежуточными отчетами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 13:15 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
kamakama... а для разных схем в пределах БД... вы не говорили что за железо... возможно поможет - ИМХО для схем разные тэйбелспэйсы на разных винтах, по возможности индексы на отдельном винте... реплицировать полностью, как предложил Naf... дореплицировать новое можно каждые 10 минут... там наверно на пару секунд будет всплеск на графике загрузки процессора ) методом тыка можно подобрать наиболее "безболезненный" период для вашего сервера на основных данных можно с индексами не заморачиваться с копии же можете уже свои отчёты генерить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 16:23 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Кифирчик, К сожалению, решение бюджетное на одном диске ATA/SATA, поэтому приходится компенсировать отсутсвие RAID и/или SCSI программными изворотами. В конкретном контексте (идет постоянный INSERT в таблицу, откуда идут выборки) увеличение кэша практически не поможет :( Отношение hit / read (http://postgresmen.ru/articles/view/48) для базы очень маленькое (около 55-60), поэтому самым узким местом у нас являестя диск ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 17:11 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
> решение бюджетное на одном диске ATA/SATA Вы не на том экономите. Вы полагаете стоимость данных (или сервиса) эквивалентной стоимости hdd. Зачем заниматься разработкой того, что стоит 50 баксов? Простейший массив, вдвое увеличивающий скорость доступа к дисковой, обойдется дешевле килобакса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 17:55 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Так вот для бюджетного решения, самый простой спосооб расширить I/O, это разместить таблицы на разных винтах (в данном случае ИМХО лучше без рэйда, объём винтов будет избыточный, друг на друга можно бэкапить).... а лучше 3 винта, отдельный под индексы или под операционку... саташный винт стоит 1100р вы хоть как программно извратитесь, но либо при репликации, либо при получении отчёта будут тормоза... будут сперва утюжиться индексы, потом данные агрегатироваться... правильно подмечено, вы не на том экономите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2009, 18:24 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
нормальных только два варианта А) как уже сказали, две базы, в одну пишем, по втрой гоняем отчеты. Две машины, две базы, slony для репликации. Б) не писать в базу 30-60 раз в секунду, т.e. база дла только для OLAP. Группируйте эти записи, потом заливайте в базу много записей раз в Х минут. Простейший вариант: пишем данные CSV фаилик, потом раз в Х минут делаем COPY в базу. выбор варианта зависит от ситуации. Если вы стоите/поддерживаете систему "для себя", т.е. система для внутреннего использования, то вариант А предпочтительней т.к. покупка второго сервера и настройка репликации [намного ] дешевле времени разработчиков на переделку и тестирование новой системы по варианту Б. если система делается на продажу или это система которая приносит основной доход организации, то тогда надо переделать систему по варианту Б. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 00:27 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
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 за ней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 11:49 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
На данный момент решаю похожую задачу по хранению телеметрии. Пока тестирую следующую архитектуру(включая програмную часть): 1. База телеметрии - 2 таблицы. 1 - Индексы(самописные) 2 - Сама телеметрия. Связей нет. 2. Все приходящие данные при помощи опять же самописного балансировщика нагрузки раскидываются по сервисам-нодам на разных компах при помощи MSMQ и WCF. 3. В каждом ноде есть свой кэш, организованный при помощи MS Enterprise Library Cache Block. 4. Для хранения кэша используется жестак. Как только по устройству получено 1000 записей - они пишутся в базу одним куском и для них создается индекс(тестовый вариант, пока так оставили на время). 5. Запросы от клиентов обрабатывает отдельный сервис - который в свою очередь посылает запросы нодам, агрегирует полученную информацию и отдает клиенту. Но у нас требование что-бы сервер работал с любой бд. И соответственно приходится работать через NH. Но перфоманс на запись более чем приличный после оптимизации. А распределение нодов позволяет очень хорошо масштабировать сервер. Для всех задач обработки используется CCR от Robotics Studio =D Кол-во транзакций похожее как в пике так и в среднем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 13:43 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Zorrik, Как я понял, основной упор сделан на распараллеливании записией по нескольким БД, находящихся на разных машинах и кэшировании запросов обновлений? Причем признаком объединения записей в обин блок кэша служит код устройства, приславшего данные? Если так, то да, для очень масштабных решений это скорее всего подойдет. Хотя интересно - а собирали ли Вы статистическую информацию на такой архитектуре? И как будет выполнятся запрос, если данные потребуются не по устройству-источнику сообщений, а по объекту, на котором могут быть установлены разные устройства или будет идти миграция устройств со временем по объектам? Ведь прийдется шарить по разным базам на разных машинах. У Вас есть отдельный механизм, который это регулирует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 15:06 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Скажем так - используются не несколько устройств на объекте, а несколько датчиков - которые предоставляют информацию через 1 устройство. Агрегация идет по uid устройства. Уид всегда уникален для каждого устройства. Что бы небыло проблем с перекидыванием и если вдруг случится так что на 1 объекте будет 2 устройства - используются внутренние uidы устройств в сервере. Особых проблем пока не возникало на эту тему. На данный момент как раз и собираю. Пока что все устраивает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 16:53 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Zorrik, Просто я так понял, что информацию Вы раскидываете по разным машинам, объединяя их по устрйоствам? скажем, данные с первых 100 устройств на 1 машине, со следующих 100 на 2й и тд? И отдельно храните информацию по установкам устройств на объекты. Так вот, интересно, если устройства будут мигрировать по объектам (монтаж/демонтаж) как Вы будете получать информацию по данным с одного объекта, если там за запрашиваемый период стояло разное оборудование (сначало одно устрйоство, а потом другое)? Ведь получится, что запрос нужно будет разбивать к разным БД на разных машинах? 1) Это прийдется предусматривать чисто технически (или используется какая-то схема автоматизации?) 2) Как долго будет выполнятся такой запрос? С учетом сетевого взаимодействия между БД при выполнении запросов. Или изначально в проект заложено, что вероятность миграции устройств мала и узким местом это точно не будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 17:24 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Да. у нас заложено что вероятность миграции устройсв мала. Немножко не так распределяется нагрузка. Пример: Пришло сообщение от устройства - сервис - который служит входным шлюзом, смотрит какие сервера ему доступны, и по msmq отправлет сообщение тому серверу, который идет следующим по списку. Тоесть вполне возможна ситуация, когда 10 принятых подряд сообщений от одного устройства будут находиться на 10 разных серверах. Запросы на данные будет идти через клиентский шлюз, который знает список дата провайдеров и отправляет им запросы, после получения всех запросов(учитываются таймауты для сети), данные агрегируются и отдаются клиенту. Что-то напоминающие DLINQ из DSS. Как транспорт между сервисами используется MSMQ - сообщения очень шустро бегают и это еще гарантия доставки и защита от выключений серверов и тд. Некоторые решения подглядел в StockTrader у MS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2009, 17:52 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Zorrik, А какой анализ скорости выполнения запросов на выборку? Например, не элементарного запроса по номеру устройства, а чего-нибудь посложнее, гарантированно требующего обращения к нескольким серверам на разных машинах? Ожидание тайм-аутов, передача сообщений и пр. Как я понимаю, такая архитектура была выбрана из-за ограниченя на поддержку произвольных СУБД? Иначе в пределах того же Postgres или Oracle тоже самое можно орагнизовать встроенными средствами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2009, 09:57 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
kamakamaС какой периодичностью делать промежуточные отчеты (минута, час, сутки, неделя)? Делать ли это в несколько слоев? То есть собирать промежуточные отчеты за меньшие промежутки времени, потом за большие, а потом уже их использовать в окончательных запросах? 1) С точки зрения программного решения импонирует решение Naf 2) Собственно я бы по периодам проанализировал а) запросы пользователей выполняемых для анализа мониторинговой информации б) нормативные документы по частоте выполнения таких запросов и срокам хранения данных и нарезал бы "периодические" слои исходя из этого, тем самым подняв бы быстродействие системы по статистически типовым запросам. При задании выборки вне указанных срезов, да пользователю придется подождать но как правило такие запросы достаточно уникальны и не критичны к скорости 3) Утилитарно предположим что у нас есть абстактный банк храним временные срезы - за каждый год - квартал - последний квартал по дням - последний месяц по часам P.S. в принципе конечно надо рассматривать область применения ваше системы. так что совет не идеален для определенных предметных областей ______________________________________________________ Давайте считать обступившее нас со всех строн коричневое море шоколадным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2009, 16:59 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
kamakama, Большинство запрсов как раз идет по номеру устройства и типу данных. То есть заранее система проектировалась так, что бы как можно меньше зависеть от конкретной субд. Так же немаловажный фактор - стоимость владения. Обслуживание Оракла в качестве единой базы и к примеру пара простеньких компов за 10 тыс р с постгресом или сиквелом - немножко разные вещи. Есть заказчики которые просто хотят получить продукт и их ИТ инфраструктура на уровне каменного века=) И зачасту максимум что могут потратить это купить винсервер. Отказывать мы им не можем. Так же такой подход дает возможность очень легко масштабировать систему. Почти никаких доп настроек. Справиться даже бухгалтер=) Плюс еще достаточно легко настройить зеркальные ноды для подстраховки. То есть при падении канала связи к 1 серверу шлюз ищет его копию и начинает слать данные туда, как и клиентсуий сервис. Запросы пока профайлили не особо. По сравнению со старой версией быстрее раза в полтора на выборках по 100 тыс. сообщений. Ноды ксттаи могут и в 1 базу писать. Зависит от настроек. Все весьма гибко, что бы любой заказчик был доволен=) Это ведь главное=) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2009, 17:01 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за выраженные мнения и переданный опыт! Будем экспериментировать. Если еще у кого есть какие мнения - делитесь, пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2009, 09:59 |
|
||
|
Распределние нагрузки на БД с постоянным обновлением
|
|||
|---|---|---|---|
|
#18+
ZorrikЗапросы пока профайлили не особо. По сравнению со старой версией быстрее раза в полтора на выборках по 100 тыс. сообщений. А как была организованна предыдущая версия? Чтоб было с чем сравнить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2009, 11:15 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36171086&tid=1543095]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 509ms |

| 0 / 0 |
