|
|
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Имеется сайт 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)возможно переписать структуру БД или перенести на другую или еще что-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 23:08:56 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Googlemo, вам на соседний форум: http://www.sql.ru/forum/olap-dwh ищите про vertica/greenplum и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 09:10:36 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 09:47:18 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением? В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль. 2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 10:22:01 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Maxim BogukЕсли оставаться в пределах postgresql штатного то 1)диски диски и еще раз диски.... 12-48 SAS 15000RPM на нормальном рейде или SSD (тоже нормальные) 2)ну и памяти 128gb хотябы 3)подумать точно ли нужны все эти данные и нельзя ли старые данные или удалять или вынести в архив где к ним особо не будут обращаться... Т.е. у вас все сейчас в диски упирается. На счет всего остального это уже предметный разговор нужен (надо смотреть на структуру базы и запросы).. можете попробовать к нам стукнуться. Данные там все нужны, это сайт-топ, статистика, там данные будут постоянно накапливаться, на ССД такое ставить полный П, это надо по почке в неделю продавать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 12:45:12 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
rovanMaxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением? В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль. 2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу. Собссно насчет железа можете ссылками дать какие-то варианты, чтобы хоть цифры(стоимости) видеть, Всё работало более или менее нормально с базой где-то в 200-300гб, потом случился резкий спад производительности, притом лагает только при определенных запросах, поэтому вполне вероятно нужна оптимизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 12:47:04 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Googlemo, так, может, тормозящие запросы оптимизируем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 13:28:22 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
rovanMaxim Boguk, кстати, может ТСу попробовать cstore ? Не поделитесь своим мнением? В озвученной ситуации (в частности, вставка преимущественно COPY), как мне кажется, можно попробовать применить этот модуль. 2Googlemo - вообще, кроме железа, неплохо бы перепроектировать базу под хранилищные нагрузки. Обращайтесь, мб что-то подскажу. cstore - может и поможет...но поскольку я его лично не проверял под нагрузками и тд - то советовать не буду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 14:11:40 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Ну вот какой запрос выполняется 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 14:20:57 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
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) для этого запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 14:25:45 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
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: нельзя иметь большую активно растущую базу на никакой дисковой подсистеме... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 14:37:57 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Googlemo, >притом лагает только при определенных запросах, поэтому вполне вероятно нужна оптимизация. попали в данные в памяти - быстро попали на убитые диски - медленно... в вашем случае медленее в 10.000 - 100.000 раз (если не больше) оптимизация тут очень вряд ли поможет хотя конечно надо смотреть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 14:40:35 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
еще дешевый вариант - убрать item_orders на другой сервер... но это только отсрочка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 14:43:10 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Вот еще запрос: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 15:39:19 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
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 будет писаться сколько времени ушло на дисковый ввод-вывод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 15:47:11 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Возможно ли реализовать какую-то связку с SSD и обычными дисками? для ускорения работы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 15:58:56 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
GooglemoMaxim Boguk, Возможно ли реализовать какую-то связку с SSD и обычными дисками? для ускорения работы? есть всякие варианты ssd cache на уровне файловой системы или рейд контроллера (детали смотрите в гугле). насколько они помогут именно в вашем случае - вопрос спорный, все зависит от того есть ли у вас часть данных которая часто вызывается но не влезает в память, или у вас в среднем все данные одинаково (или близко к тому) запрашиваются (и тогда от кеша толку будет мало)... можно еще просто индексы на ssd вынести в отдельный tablespace, тоже может помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 16:08:16 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 16:23:24 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
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) Это уже сделали, помогло, но сейчас увы, этого мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 16:30:29 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
GooglemoLeXa NalBatпропущено... еще, если возможно, кластеризовать таблицу participates по индексу (player_id)Это уже сделали, помогло, но сейчас увы, этого мало.но ради 508-ми строк приходится читать 216+5 дисковых страниц, это слишком много. наверное кластеризация уже исчезла, надо выполнять CLUSTER регулярно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 16:37:46 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatGooglemoпропущено... Это уже сделали, помогло, но сейчас увы, этого мало.но ради 508-ми строк приходится читать 216+5 дисковых страниц, это слишком много. наверное кластеризация уже исчезла, надо выполнять CLUSTER регулярно. идея правильная но регулярно кластер на фоне "participates: 65гб с индексами 138гб " + "Hard Drive2 x 2 TB SATA 6 Gb/s 7200 rpm HDD (Software-RAID 1)" боюсь будет проблемой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 16:49:20 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Вот еще немного информации для размышления, после кластеризации всё заработало шустро. Сама кластеризация выполнялась порядка 2-3часов, и для ее выполнения приостановили сбор данных. Как часто ее имеет смысл проводить? и может ли еще сильней улучшить ситуацию модуль cstore? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 06:14:22 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Googlemo, мож глупосць скажу: тут как-то геймдевер рассказывал -- хранят всё по игроку чуть ли не в блобе, а не собирают из нормализванных табличек всякий раз. Это возможно, если именно только через id игрока всё и ходит. т.е. вместо сотен чтений по десятку подчиненок с детализацией, имеете "одно"(?) чтение из тоста, но разбирать его надо уже клиентом, например. (можно склаяры надергать из блоба, и индексировать вдоль них). вот в вашем случае можно сложить participates в массив[ы] прямо в табличке players, например. и т.п. т.е. ходы влево есть. но если participates захочтеся собирать по их признакам, вне зависимости от player_id -- то сразу возникнут проблемы (опять есть ходы через денормализацию, но там про целостность возникнет головняк, начнёте его в лоб решать -- всё встанет колом. и т.п.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 13:44:05 |
|
||
|
Структура сайта\бд\железа для работы с Большой базой
|
|||
|---|---|---|---|
|
#18+
Все правильно вам говорят. Можно попробовать справиться с аналитической группировкой, которая у вас вычисляется бесконечно. Подозреваю, что она обращается ко всем блокам, а потому вытесняет из памяти горячие блоки чтобы погруппировать данные, к которым уже неделю никто не обращался. Идеально аналитику надо выкинуть на другой физический сервер, и реплицировать туда данные с транзакционного сервера. Можно попробовать для аналитических запросов сделать инкрементальные материализованные представления. Обработать все записи, пометить их как обработанные, и сохранить результаты в отдельной таблице. Скажем, для пользователя A сохранить, что у него количество записей 125 со средним значением 4.3. В следущий раз обработать в запросе для пользователя только новые, еще неучтенные записи плюс уже аггрегированные значения. Скажем, добавились еще две записи со значениями 2 и 10. В одной транзакции помечаем их обработанными, и обновляем число записей до 127, а среднее значение на (125*4.3+2+10)/127. Ограничения такого подхода очевидны, но при благоприятных условиях можно избежать постоянного полного сканирования всех данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 00:25:38 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=1998584]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
201ms |
get topic data: |
9ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 559ms |

| 0 / 0 |
