Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Структура сайта\бд\железа для работы с Большой базой / 24 сообщений из 24, страница 1 из 1
10.07.2014, 23:08:56
    #38693864
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Имеется сайт dota2nw.com на котором ОЧЕНЬ большая база данных, за 3месяца она разрослась до(состоит из 3х таблиц):
matches: 6гб с индексами 15гб
participates: 65гб с индексами 138гб
item_orders: 153гб с индексами 329гб

бд постргресс 9.2,
система убунту 12.04,
сервер:
Intel® Core™ i7-4770
Quadcore Haswell
incl. Hyper-Threading Technology
RAM32 GB DDR3 RAMHard Drive2 x 2 TB SATA 6 Gb/s 7200 rpm
HDD (Software-RAID 1)
Class EnterpriseConnection 1 Gbit/s-Port
Guaranteed Bandwidth 200 Mbit/s

есть три таблицы: на текущий момент в них 50кк 500кк и 2ккк записей соответственно
все данные в них – целые числа integer (1,2,3,4) – в зависимости от максимальных значений
таблицы заполняются равномерно, со скоростью 10кк 100кк и 600кк записей в месяц (примерно)
вставка происходит в основном командой "COPY"

к таблицам применяются две тяжелые выборки:
1) Группировка данных – работает несколько часов, как только завершилась сразу начинается заново.
2) Выборка из второй таблицы. Используется условие по 1-3 столбцам. На всех столбцах простые или мультииндексы. Операция стала выполняться от 100ms до нескольких секунд а должна мгновенно. Explain операции показывает Index Scan или даже Index Only Scan. На требуемые поля установлен CLUSTER index.

проблемы начались с ростом данных.

Надо:
1)составить структуру железа(или требования к железу), возможно несколько серверов или 1 другой, на которой сайт будет качественно функционировать.
2)возможно переписать структуру БД или перенести на другую или еще что-то...
...
Рейтинг: 0 / 0
11.07.2014, 09:10:36
    #38693984
buddy_ekb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Googlemo,

вам на соседний форум: http://www.sql.ru/forum/olap-dwh

ищите про vertica/greenplum и т.п.
...
Рейтинг: 0 / 0
11.07.2014, 09:47:18
    #38694014
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemoИмеется сайт dota2nw.com на котором ОЧЕНЬ большая база данных, за 3месяца она разрослась до(состоит из 3х таблиц):
matches: 6гб с индексами 15гб
participates: 65гб с индексами 138гб
item_orders: 153гб с индексами 329гб

бд постргресс 9.2,
система убунту 12.04,
сервер:
Intel® Core™ i7-4770
Quadcore Haswell
incl. Hyper-Threading Technology
RAM32 GB DDR3 RAMHard Drive2 x 2 TB SATA 6 Gb/s 7200 rpm
HDD (Software-RAID 1)
Class EnterpriseConnection 1 Gbit/s-Port
Guaranteed Bandwidth 200 Mbit/s

есть три таблицы: на текущий момент в них 50кк 500кк и 2ккк записей соответственно
все данные в них – целые числа integer (1,2,3,4) – в зависимости от максимальных значений
таблицы заполняются равномерно, со скоростью 10кк 100кк и 600кк записей в месяц (примерно)
вставка происходит в основном командой "COPY"

к таблицам применяются две тяжелые выборки:
1) Группировка данных – работает несколько часов, как только завершилась сразу начинается заново.
2) Выборка из второй таблицы. Используется условие по 1-3 столбцам. На всех столбцах простые или мультииндексы. Операция стала выполняться от 100ms до нескольких секунд а должна мгновенно. Explain операции показывает Index Scan или даже Index Only Scan. На требуемые поля установлен CLUSTER index.

проблемы начались с ростом данных.

Надо:
1)составить структуру железа(или требования к железу), возможно несколько серверов или 1 другой, на которой сайт будет качественно функционировать.
2)возможно переписать структуру БД или перенести на другую или еще что-то...

Если оставаться в пределах postgresql штатного то
1)диски диски и еще раз диски.... 12-48 SAS 15000RPM на нормальном рейде или SSD (тоже нормальные)
2)ну и памяти 128gb хотябы
3)подумать точно ли нужны все эти данные и нельзя ли старые данные или удалять или вынести в архив где к ним особо не будут обращаться...

Т.е. у вас все сейчас в диски упирается.

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

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
11.07.2014, 10:22:01
    #38694056
rovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Maxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением?
В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль.
2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу.
...
Рейтинг: 0 / 0
11.07.2014, 12:45:12
    #38694218
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Maxim BogukЕсли оставаться в пределах postgresql штатного то
1)диски диски и еще раз диски.... 12-48 SAS 15000RPM на нормальном рейде или SSD (тоже нормальные)
2)ну и памяти 128gb хотябы
3)подумать точно ли нужны все эти данные и нельзя ли старые данные или удалять или вынести в архив где к ним особо не будут обращаться...

Т.е. у вас все сейчас в диски упирается.

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

Данные там все нужны, это сайт-топ, статистика, там данные будут постоянно накапливаться, на ССД такое ставить полный П, это надо по почке в неделю продавать.
...
Рейтинг: 0 / 0
11.07.2014, 12:47:04
    #38694219
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
rovanMaxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением?
В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль.
2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу.

Собссно насчет железа можете ссылками дать какие-то варианты, чтобы хоть цифры(стоимости) видеть, Всё работало более или менее нормально с базой где-то в 200-300гб, потом случился резкий спад производительности, притом лагает только при определенных запросах, поэтому вполне вероятно нужна оптимизация.
...
Рейтинг: 0 / 0
11.07.2014, 13:28:22
    #38694287
rovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Googlemo, так, может, тормозящие запросы оптимизируем?
...
Рейтинг: 0 / 0
11.07.2014, 14:11:40
    #38694362
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
rovanMaxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением?
В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль.
2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу.

cstore - может и поможет...но поскольку я его лично не проверял под нагрузками и тд - то советовать не буду
...
Рейтинг: 0 / 0
11.07.2014, 14:20:57
    #38694377
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Ну вот какой запрос выполняется 9с
EXPLAIN ANALYSE
select pos, point_of_skill, matches_count
, round(100*round((0.5+(win_count*1.0000/matches_count)/2),4),2) as win_rate
,case deaths when 0 then 0 else round((kills+assists)/(deaths+0.0),2) end as kda, (select ru from period order by id desc limit 1) as descr,99 as id
from top where player_id=93824522 and game_mode=99 and lobby_type=99
UNION
select pos, point_of_skill, matches_count, round(100*round((0.5+(win_count*1.0000/matches_count)/2),4),2) as win_rate
,case deaths when 0 then 0 else round((kills+assists)/(deaths+0.0),2) end as kda,ru,id
from top_arch t join period p on t.period=p.id
where player_id=93824522 and game_mode=99 and lobby_type=99
order by id desc

Выполняется он при открытии страницы ЛЮБОГО игрока:
http://dota2nw.com/player/152854735
...
Рейтинг: 0 / 0
11.07.2014, 14:25:45
    #38694385
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemoНу вот какой запрос выполняется 9с
EXPLAIN ANALYSE
select pos, point_of_skill, matches_count
, round(100*round((0.5+(win_count*1.0000/matches_count)/2),4),2) as win_rate
,case deaths when 0 then 0 else round((kills+assists)/(deaths+0.0),2) end as kda, (select ru from period order by id desc limit 1) as descr,99 as id
from top where player_id=93824522 and game_mode=99 and lobby_type=99
UNION
select pos, point_of_skill, matches_count, round(100*round((0.5+(win_count*1.0000/matches_count)/2),4),2) as win_rate
,case deaths when 0 then 0 else round((kills+assists)/(deaths+0.0),2) end as kda,ru,id
from top_arch t join period p on t.period=p.id
where player_id=93824522 and game_mode=99 and lobby_type=99
order by id desc

Выполняется он при открытии страницы ЛЮБОГО игрока:
http://dota2nw.com/player/152854735

приведите результаты explain (analyze, costs, buffers, timing) для этого запроса
...
Рейтинг: 0 / 0
11.07.2014, 14:37:57
    #38694404
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemorovanMaxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением?
В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль.
2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу.

Собссно насчет железа можете ссылками дать какие-то варианты, чтобы хоть цифры(стоимости) видеть, Всё работало более или менее нормально с базой где-то в 200-300гб, потом случился резкий спад производительности, притом лагает только при определенных запросах, поэтому вполне вероятно нужна оптимизация.

просто база доросла до такого размера что cache hit rate упал ну например с 99.9% до 99%... вроде и не много а по факту увеличение нагрузки на дисковую подсистему в 10 раз... а она у вас в 100 раз медленее чем ноутбучный SSD (не говоря уж про серверные ssd)...
если вы посмотрите на iostat там у вас наверняка 100% IO utilization...

про сервера - ну вот например
http://www.etegro.ru/configurator/servers/rackmount/enterprise/rs230g4
в нормальной конфигурации получится порядка 600-700 тысяч (из которых 70% - диски)

PS: нельзя иметь большую активно растущую базу на никакой дисковой подсистеме...
...
Рейтинг: 0 / 0
11.07.2014, 14:40:35
    #38694409
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Googlemo,

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

попали в данные в памяти - быстро
попали на убитые диски - медленно... в вашем случае медленее в 10.000 - 100.000 раз (если не больше)

оптимизация тут очень вряд ли поможет хотя конечно надо смотреть
...
Рейтинг: 0 / 0
11.07.2014, 14:43:10
    #38694413
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
еще дешевый вариант - убрать item_orders на другой сервер... но это только отсрочка...
...
Рейтинг: 0 / 0
11.07.2014, 15:39:19
    #38694495
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Вот еще запрос:
Index Scan using participates_on_player_id on participates (cost=0.57..50987.54 rows=24212 width=58) (actual time=273.125..27472.903 rows=508 loops=1)
Index Cond: (player_id = 125620773)
Buffers: shared hit=5 read=216
Total runtime: 27473.139 ms
...
Рейтинг: 0 / 0
11.07.2014, 15:47:11
    #38694507
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemoВот еще запрос:
Index Scan using participates_on_player_id on participates (cost=0.57..50987.54 rows=24212 width=58) (actual time=273.125..27472.903 rows=508 loops=1)
Index Cond: (player_id = 125620773)
Buffers: shared hit=5 read=216
Total runtime: 27473.139 ms

ну вот все же видно: 216 чтений с диска заняли 27 секунд... т.е. больше 0.1 секунды на чтение...
что делать
или а)ставить больше памяти и больше shared buffers чтобы было больше shared hit и меньше read (в идеале 0 read)
или б)ставить диски быстрее...
или а+б

сосбтвенно ничего больше тут сделать нельзя и никая оптимизация настроек базы вам не поможет

PS: для надежности стоит включить track_iotimings в postgresql.conf и тогда в explain будет писаться сколько времени ушло на дисковый ввод-вывод.
...
Рейтинг: 0 / 0
11.07.2014, 15:58:56
    #38694527
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Maxim Boguk,

Возможно ли реализовать какую-то связку с SSD и обычными дисками? для ускорения работы?
...
Рейтинг: 0 / 0
11.07.2014, 16:08:16
    #38694545
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemoMaxim Boguk,

Возможно ли реализовать какую-то связку с SSD и обычными дисками? для ускорения работы?

есть всякие варианты ssd cache на уровне файловой системы или рейд контроллера (детали смотрите в гугле).
насколько они помогут именно в вашем случае - вопрос спорный, все зависит от того есть ли у вас часть данных которая часто вызывается но не влезает в память, или у вас в среднем все данные одинаково (или близко к тому) запрашиваются (и тогда от кеша толку будет мало)...
можно еще просто индексы на ssd вынести в отдельный tablespace, тоже может помочь.
...
Рейтинг: 0 / 0
11.07.2014, 16:23:24
    #38694573
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemoВот еще запрос:
Index Scan using participates_on_player_id on participates (cost=0.57..50987.54 rows=24212 width=58) (actual time=273.125..27472.903 rows=508 loops=1)
Index Cond: (player_id = 125620773)
Buffers: shared hit=5 read=216
Total runtime: 27473.139 msеще, если возможно, кластеризовать таблицу participates по индексу (player_id)
...
Рейтинг: 0 / 0
11.07.2014, 16:30:29
    #38694587
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
LeXa NalBatGooglemoВот еще запрос:
Index Scan using participates_on_player_id on participates (cost=0.57..50987.54 rows=24212 width=58) (actual time=273.125..27472.903 rows=508 loops=1)
Index Cond: (player_id = 125620773)
Buffers: shared hit=5 read=216
Total runtime: 27473.139 msеще, если возможно, кластеризовать таблицу participates по индексу (player_id)

Это уже сделали, помогло, но сейчас увы, этого мало.
...
Рейтинг: 0 / 0
11.07.2014, 16:37:46
    #38694602
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
GooglemoLeXa NalBatпропущено...
еще, если возможно, кластеризовать таблицу participates по индексу (player_id)Это уже сделали, помогло, но сейчас увы, этого мало.но ради 508-ми строк приходится читать 216+5 дисковых страниц, это слишком много. наверное кластеризация уже исчезла, надо выполнять CLUSTER регулярно.
...
Рейтинг: 0 / 0
11.07.2014, 16:49:20
    #38694612
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
LeXa NalBatGooglemoпропущено...
Это уже сделали, помогло, но сейчас увы, этого мало.но ради 508-ми строк приходится читать 216+5 дисковых страниц, это слишком много. наверное кластеризация уже исчезла, надо выполнять CLUSTER регулярно.

идея правильная но регулярно кластер на фоне
"participates: 65гб с индексами 138гб " + "Hard Drive2 x 2 TB SATA 6 Gb/s 7200 rpm HDD (Software-RAID 1)"
боюсь будет проблемой
...
Рейтинг: 0 / 0
12.07.2014, 06:14:22
    #38694856
Googlemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Вот еще немного информации для размышления, после кластеризации всё заработало шустро. Сама кластеризация выполнялась порядка 2-3часов, и для ее выполнения приостановили сбор данных. Как часто ее имеет смысл проводить? и может ли еще сильней улучшить ситуацию модуль cstore?
...
Рейтинг: 0 / 0
12.07.2014, 13:44:05
    #38694934
какабычна
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Googlemo,
мож глупосць скажу:

тут как-то геймдевер рассказывал -- хранят всё по игроку чуть ли не в блобе, а не собирают из нормализванных табличек всякий раз. Это возможно, если именно только через id игрока всё и ходит. т.е. вместо сотен чтений по десятку подчиненок с детализацией, имеете "одно"(?) чтение из тоста, но разбирать его надо уже клиентом, например. (можно склаяры надергать из блоба, и индексировать вдоль них).


вот в вашем случае можно сложить participates в массив[ы] прямо в табличке players, например. и т.п.

т.е. ходы влево есть. но если participates захочтеся собирать по их признакам, вне зависимости от player_id -- то сразу возникнут проблемы (опять есть ходы через денормализацию, но там про целостность возникнет головняк, начнёте его в лоб решать -- всё встанет колом. и т.п.)
...
Рейтинг: 0 / 0
15.07.2014, 00:25:38
    #38696444
Sergei.Agalakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура сайта\бд\железа для работы с Большой базой
Все правильно вам говорят. Можно попробовать справиться с аналитической группировкой, которая у вас вычисляется бесконечно. Подозреваю, что она обращается ко всем блокам, а потому вытесняет из памяти горячие блоки чтобы погруппировать данные, к которым уже неделю никто не обращался. Идеально аналитику надо выкинуть на другой физический сервер, и реплицировать туда данные с транзакционного сервера.
Можно попробовать для аналитических запросов сделать инкрементальные материализованные представления. Обработать все записи, пометить их как обработанные, и сохранить результаты в отдельной таблице. Скажем, для пользователя A сохранить, что у него количество записей 125 со средним значением 4.3. В следущий раз обработать в запросе для пользователя только новые, еще неучтенные записи плюс уже аггрегированные значения. Скажем, добавились еще две записи со значениями 2 и 10. В одной транзакции помечаем их обработанными, и обновляем число записей до 127, а среднее значение на (125*4.3+2+10)/127.
Ограничения такого подхода очевидны, но при благоприятных условиях можно избежать постоянного полного сканирования всех данных.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Структура сайта\бд\железа для работы с Большой базой / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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