powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
12 сообщений из 12, страница 1 из 1
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39380594
Neighb0ur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть база Log DB, в которую выполняются insert и delete операции. Ниже я приведу основные требования для этой базы. Насколько я понимаю, есть два ограничения, влияющих на ответ на мой вопрос: это какой объем данных нужно хранить и сколько операций в секунду нужно делать.

Каждый день добавляются 72 000 000 записей, что равносильно нагрузке 2000 записей в секунду в течение 10 активных часов дня.
Требуется хранить записи за последние 180 дней, суммарно 13 000 000 000 записей, 30 ТБ (2500 байт на одну запись с учетом Постгрес оверхеда и индексов). Когда начинается новый день, данные за самый старый день должны быть удалены.

Параллельно добавлению другая подсистема выполняет чтение со скоростью 500 селектов/сек:
Код: plaintext
1.
2.
3.
4.
select * from T_LOG_RECORD
where
    ((F_EXTERNAL_ID="92" AND F_SCOPE="CONT") OR F_GROUP_TAG="100000164")
    AND F_RECORD_TIME < "2016-12-12 23:59:59" 
    AND "2016-11-12 00:00:00" < F_RECORD_TIME AND F_STATUS = 0

Вот примерный DDL (синтаксис Оракла) единственной таблицы в этой базе, чтобы была понятна идея, индексы опущены:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE T_LOG_RECORD (
    T_LOG_RECORD NUMBER(20) NOT NULL,
    F_NOTIFICATION_ID VARCHAR(45) NOT NULL,
    T_OPERATOR_ID NUMBER(20) NULL,
    T_LANGUAGE_ID NUMBER(2),
    F_RECORD_TIME TIMESTAMP NOT NULL,
    F_ADDRESS_TYPE NUMBER(2) NULL,
    F_ADDRESS_VALUE VARCHAR(45) NULL,
    F_EXTERNAL_ID VARCHAR(45) NULL,
    F_SCOPE VARCHAR(45) NULL,
    F_SUBJECT VARCHAR(250) NULL,
    F_TEMPLATE_ID NUMBER(20) NULL,
    F_MESSAGE_TEMPLATE CLOB NULL,
    F_MESSAGE CLOB NULL,
    F_NOTIFICATION_PARAMS CLOB NULL,
    F_TRIGGERED_TIME TIMESTAMP(0) NULL,
    F_EXPIRED_TIME TIMESTAMP(0) NULL,
    F_GROUP_TAG VARCHAR(20) NULL,
    F_STATUS NUMBER(2) NOT NULL,
    F_DISCARD_REASON NUMBER(2) NULL,
    F_PRIORITY NUMBER(2) NULL,
    F_ERROR_CODE VARCHAR(45) NULL,
    F_DELIVERY_TIME TIMESTAMP(8) NULL
)
PARTITION BY RANGE (F_RECORD_TIME)
    INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
    (PARTITION p1 VALUES LESS THAN (TO_DATE('08-01-2017', 'DD-MM-YYYY')))
    TABLESPACE SOME_TABLESPACE
;

Пока планируется использовать недорогое commodity серверное железо. Шардинг мы собираемся делать на уровне приложения, Конфигурация Постгреса планируется Active-standby с числом реплик = 1.

Мое текущее предположение, что PostgreSQL на одном хосте (8 ядер, 16 GB RAM, 2 x 4 TB SSD) сумеет обработать как минимум 10 000 insert-ов в секунду. И что понадобятся 8 хостов или виртуальных машин с такими параметрами.
Расчет такой: 30 ТБ * 2 (replication factor) / 8 ТБ (размер дисков на хосте) = 8 хостов. Т.е. будет 4 хоста-шарда и 4 хоста-реплики для этих шардов.
Пожалуйста, покритикуйте это утверждение.
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39380622
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0urЕсть база Log DB, в которую выполняются insert и delete операции. Ниже я приведу основные требования для этой базы. Насколько я понимаю, есть два ограничения, влияющих на ответ на мой вопрос: это какой объем данных нужно хранить и сколько операций в секунду нужно делать.

Каждый день добавляются 72 000 000 записей, что равносильно нагрузке 2000 записей в секунду в течение 10 активных часов дня.
Требуется хранить записи за последние 180 дней, суммарно 13 000 000 000 записей, 30 ТБ (2500 байт на одну запись с учетом Постгрес оверхеда и индексов). Когда начинается новый день, данные за самый старый день должны быть удалены.

Параллельно добавлению другая подсистема выполняет чтение со скоростью 500 селектов/сек:
Код: plaintext
1.
2.
3.
4.
select * from T_LOG_RECORD
where
    ((F_EXTERNAL_ID="92" AND F_SCOPE="CONT") OR F_GROUP_TAG="100000164")
    AND F_RECORD_TIME < "2016-12-12 23:59:59" 
    AND "2016-11-12 00:00:00" < F_RECORD_TIME AND F_STATUS = 0

Вот примерный DDL (синтаксис Оракла) единственной таблицы в этой базе, чтобы была понятна идея, индексы опущены:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE T_LOG_RECORD (
    T_LOG_RECORD NUMBER(20) NOT NULL,
    F_NOTIFICATION_ID VARCHAR(45) NOT NULL,
    T_OPERATOR_ID NUMBER(20) NULL,
    T_LANGUAGE_ID NUMBER(2),
    F_RECORD_TIME TIMESTAMP NOT NULL,
    F_ADDRESS_TYPE NUMBER(2) NULL,
    F_ADDRESS_VALUE VARCHAR(45) NULL,
    F_EXTERNAL_ID VARCHAR(45) NULL,
    F_SCOPE VARCHAR(45) NULL,
    F_SUBJECT VARCHAR(250) NULL,
    F_TEMPLATE_ID NUMBER(20) NULL,
    F_MESSAGE_TEMPLATE CLOB NULL,
    F_MESSAGE CLOB NULL,
    F_NOTIFICATION_PARAMS CLOB NULL,
    F_TRIGGERED_TIME TIMESTAMP(0) NULL,
    F_EXPIRED_TIME TIMESTAMP(0) NULL,
    F_GROUP_TAG VARCHAR(20) NULL,
    F_STATUS NUMBER(2) NOT NULL,
    F_DISCARD_REASON NUMBER(2) NULL,
    F_PRIORITY NUMBER(2) NULL,
    F_ERROR_CODE VARCHAR(45) NULL,
    F_DELIVERY_TIME TIMESTAMP(8) NULL
)
PARTITION BY RANGE (F_RECORD_TIME)
    INTERVAL (NUMTODSINTERVAL(1, 'DAY'))
    (PARTITION p1 VALUES LESS THAN (TO_DATE('08-01-2017', 'DD-MM-YYYY')))
    TABLESPACE SOME_TABLESPACE
;

Пока планируется использовать недорогое commodity серверное железо. Шардинг мы собираемся делать на уровне приложения, Конфигурация Постгреса планируется Active-standby с числом реплик = 1.

Мое текущее предположение, что PostgreSQL на одном хосте (8 ядер, 16 GB RAM, 2 x 4 TB SSD) сумеет обработать как минимум 10 000 insert-ов в секунду. И что понадобятся 8 хостов или виртуальных машин с такими параметрами.
Расчет такой: 30 ТБ * 2 (replication factor) / 8 ТБ (размер дисков на хосте) = 8 хостов. Т.е. будет 4 хоста-шарда и 4 хоста-реплики для этих шардов.
Пожалуйста, покритикуйте это утверждение.

1) Я бы памяти доставил до 64GB.
2)Тоже надо будет подневное партиционирование конечно.
3)Объем дисков вы совсем впритык взяли, возможно стоит сразу на 5 шардов делать (или доставлять больше дисков на 1 шард).
4)Подумал бы о том чтобы читающие запросы на реплики завернуть.

PS: учитывая что 80% цены железа у вас на SSD получаются я бы скорее взял 2U сервера на 24 2' дисковых слота каждый (у supermicro таких платформ - пачка), и сделать на них raid6 из тех же SSD, это может оказаться выгоднее и проще в администрировании.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39380674
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0urМое текущее предположение, что PostgreSQL на одном хосте (8 ядер, 16 GB RAM, 2 x 4 TB SSD) сумеет обработать как минимум 10 000 insert-ов в секунду.Мне это кажется достаточно оптимистичной оценкой. У нас сейчас данные вставляются в базу статистики на сервер с SSD дисками командой COPY со скоростью 5К row/sec (ширина строки 100 байт, три индекса коррелированных со входными данными, триггер for each row). Но вставка фактически выполняется в один поток, поэтому предельно возможная скорость могла бы быть большей.

Есть важный момент. При вставке текущих данных естественным образом, то есть в порядке возрастания F_RECORD_TIME, скорость вставки уменьшается линейно при наличии индексов, которые начинаются с (F_RECORD_TIME,..). Однако, индексы, начинающиеся с других полей (F_EXTERNAL_ID, F_SCOPE, F_GROUP_TAG, F_STATUS,..), не коррелирующих с F_RECORD_TIME, могут кардинально замедлить вставку. Я наблюдал это, правда при тестировании прототипа на HDD дисках.
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39380739
Neighb0ur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, LeXa NalBat, спасибо за советы.

Maxim Boguk1) Я бы памяти доставил до 64GB.
ок
Maxim Boguk2)Тоже надо будет подневное партиционирование конечно.
это да
Maxim Boguk3)Объем дисков вы совсем впритык взяли, возможно стоит сразу на 5 шардов делать (или доставлять больше дисков на 1 шард).

ок
Maxim Boguk4)Подумал бы о том чтобы читающие запросы на реплики завернуть.

да, хорошая идея

Maxim BogukPS: учитывая что 80% цены железа у вас на SSD получаются я бы скорее взял 2U сервера на 24 2' дисковых слота каждый (у supermicro таких платформ - пачка), и сделать на них raid6 из тех же SSD, это может оказаться выгоднее и проще в администрировании.

сколько бы 2U серверов вы бы предложили, сколько SSD дисков какого объема на каждом? Зачем делать RAID6? Ведь это потребует как минимум 4 дисков на хосте. RAID6 переживает падение двух дисков одновременно. Зачем такая перестраховка? Я планировал обойтись вообще без RAID, а защиту от падений дисков сделать на уровне Postgres репликации.

LeXa NalBatМне это кажется достаточно оптимистичной оценкой. У нас сейчас данные вставляются в базу статистики на сервер с SSD дисками командой COPY со скоростью 5К row/sec (ширина строки 100 байт, три индекса коррелированных со входными данными, триггер for each row). Но вставка фактически выполняется в один поток, поэтому предельно возможная скорость могла бы быть большей.

Вот это интересно. Можете сказать, сколько у вас ядер какой частоты на сервере, сколько памяти, какие именно и сколько штук на хосте SSD? И сколько записей всего в базе?

LeXa NalBatЕсть важный момент. При вставке текущих данных естественным образом, то есть в порядке возрастания F_RECORD_TIME, скорость вставки уменьшается линейно при наличии индексов, которые начинаются с (F_RECORD_TIME,..). Однако, индексы, начинающиеся с других полей (F_EXTERNAL_ID, F_SCOPE, F_GROUP_TAG, F_STATUS,..), не коррелирующих с F_RECORD_TIME, могут кардинально замедлить вставку. Я наблюдал это, правда при тестировании прототипа на HDD дисках

Хм, почему скорость вставки уменьшается линейно? Вроде как сложность вставки в рендж индекс O(log(n)), не O(n).
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39380858
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0urMaxim BogukPS: учитывая что 80% цены железа у вас на SSD получаются я бы скорее взял 2U сервера на 24 2' дисковых слота каждый (у supermicro таких платформ - пачка), и сделать на них raid6 из тех же SSD, это может оказаться выгоднее и проще в администрировании.

сколько бы 2U серверов вы бы предложили, сколько SSD дисков какого объема на каждом? Зачем делать RAID6? Ведь это потребует как минимум 4 дисков на хосте. RAID6 переживает падение двух дисков одновременно. Зачем такая перестраховка? Я планировал обойтись вообще без RAID, а защиту от падений дисков сделать на уровне Postgres репликации.


2 сервера... мастер и реплику... на 40-50TB SSD raid6 в каждом. Если вы ведете речь о 4TB ssd то в raid6 на 24 слота можно набрать до 80Tb что вам с головой и даже еще заранее 2-4 ssd hotspare оставить.
Я как то прикидывал в аналогичной ситуации - такая схема получается раза в 2 дешевле по железу чем предлагаемый вам шардинг (если не больше чем в 2). И заодно на хостинге сэкономите (так как он per unit считается) и на overhead На администрирование 10 серверов вместо 2х. Плюс даже выход 2х дисков из строя на сервере - его не убьет (а на шардинге у вас RAID0 получается что вообще схема стремная для базы).

PS: сугубо IMHO конечно.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39380863
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0urМожете сказать, сколько у вас ядер какой частоты на сервере, сколько памяти, какие именно и сколько штук на хосте SSD? И сколько записей всего в базе?Ядер и памяти - с запасом, 56 штук (Xeon E5-2690 v4) и 256 Гб. На этом сервере работает не только база, но и приложение по агрегации и вставке данных.

16 дисков Samsung PM863 3840GB ( тынц ). У нас не получилось масштабироваться горизонтально, выбрать ключ шардирования. Поэтому расширились вертикально.

Объем месячной партиции составляет 2.9 Тб (в том числе три индекса занимают 1.6 Тб). В партиции содержится порядка 5-10 млрд строк, точнее сказать не могу, статистика неполная.

Neighb0urХм, почему скорость вставки уменьшается линейно? Вроде как сложность вставки в рендж индекс O(log(n)), не O(n).Мы храним агрегированные данные, используем B-tree индексы, первое поле в каждом - time_id (идентификатор пятиминутного интервала).

Я имел в виду, что скорость вставки данных при наличии коррелированных индексов уменьшится не драматически. Например, если N строк вставляются в таблицу за X секунд, то при наличии одного коррелированного индекса - за 1.5X, двух - за 2Х.

Но с НЕкоррелированным индексом замедлится, например, до 50Х. Из-за того, что каждая строка при записи в НЕкореллированный индекс попадет в худшем случае на другую дисковую страницу.
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39381000
Neighb0ur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk2 сервера... мастер и реплику... на 40-50TB SSD raid6 в каждом. Если вы ведете речь о 4TB ssd то в raid6 на 24 слота можно набрать до 80Tb что вам с головой и даже еще заранее 2-4 ssd hotspare оставить.
Я как то прикидывал в аналогичной ситуации - такая схема получается раза в 2 дешевле по железу чем предлагаемый вам шардинг (если не больше чем в 2). И заодно на хостинге сэкономите (так как он per unit считается) и на overhead На администрирование 10 серверов вместо 2х. Плюс даже выход 2х дисков из строя на сервере - его не убьет (а на шардинге у вас RAID0 получается что вообще схема стремная для базы).

Понятно. А 1 сервер потянет 2000 инсертов/сек и 500 селектов/сек? (я помню про ваше предложение читать с реплики, но здесь рассматриваю случай, когда один хост упал)
Какой вообще предел TPS для одного сервера, если мы говорим не про диски (обращения к ним параллелятся, если их 24 штуки), а про CPU и RAM ?

LeXa NalBatОбъем месячной партиции составляет 2.9 Тб (в том числе три индекса занимают 1.6 Тб). В партиции содержится порядка 5-10 млрд строк, точнее сказать не могу, статистика неполная.

Я правильно понимаю, что у вас около 20 месячных партиций по 2.9 ТБ?
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39381193
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0urПонятно. А 1 сервер потянет 2000 инсертов/сек и 500 селектов/сек? (я помню про ваше предложение читать с реплики, но здесь рассматриваю случай, когда один хост упал)
Какой вообще предел TPS для одного сервера, если мы говорим не про диски (обращения к ним параллелятся, если их 24 штуки), а про CPU и RAM ?


Все зависит от того сколько собственно строк ваши 500 селект получают от базы в среднем.
Так как одно дело отдать 1 строку по PK а совсем другое миллион строк по сложным условиям.
Но вообще разумные пределы для одного сервера это будет порядка 50.000 insert/s (но это требует очень внятной настройки и понимания что делаешь, 10.000 insert/s - совсем легко), и наверное до 300.000-500.000 простых select/second.
Предполагается что у сервера есть разумное количество ядер конечно (т.е. 24-64 без учета HT).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39381379
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0urЯ правильно понимаю, что у вас около 20 месячных партиций по 2.9 ТБ?Нет, общий объем дискового пространства 28 Тб. Сейчас шесть партиций, с момента переезда на новый сервер.
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39381810
Neighb0ur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat, Maxim Boguk,
спасибо за советы. Ваши живые примеры с реальными цифрами многое проясняют.
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39382596
Neighb0ur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukТак как одно дело отдать 1 строку по PK а совсем другое миллион строк по сложным условиям.
Но вообще разумные пределы для одного сервера это будет порядка 50.000 insert/s (но это требует очень внятной настройки и понимания что делаешь, 10.000 insert/s - совсем легко), и наверное до 300.000-500.000 простых select/second.
Предполагается что у сервера есть разумное количество ядер конечно (т.е. 24-64 без учета HT).


Речь про простые селекты, которые возвращают несколько записей, 10-20.
Допустим, это будет 50 К селектов/сек.
Какая будет летенси этих запросов? Другими словами, сколько тредов приложения понадобится, чтобы держать 50 К селектов/сек ?

И еще вопрос: допустим, есть другая база, в одну из таблиц которой нужно добавить столбец и заполнить его значением, которое зависит от двух других столбцов отдельно взятой строки.
Если размер базы составляет 600 М записей, каждая строка занимает 300 байт с учетов всех оверхедов и индексов, какой порядок времени (минуты, часы, дни) займет выполнение операции ALTER TABLE T_1 ADD COLUMN F_NEW_COLUMN?
Какой порядок времени займет выполнение операции UPDATE T_1 SET F_NEW_COLUMN = F_1 + "_" + F_2, если такое вообще возможно сделать за один раз?
...
Рейтинг: 0 / 0
Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
    #39383229
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Neighb0ur,

>>Речь про простые селекты, которые возвращают несколько записей, 10-20.
>>Допустим, это будет 50 К селектов/сек.
>>Какая будет летенси этих запросов? Другими словами, сколько тредов приложения понадобится, чтобы держать 50 К селектов/сек ?

Если запросы простые и из памяти - то я бы ожидал порядка 1-2ms на запрос.
Если с дисков то "время выполнения 10-50 чтений с диска" (ну и надо чтобы дисковая система тянула 2M IOPS что как минимум требует blk-mq IO scheduler с новым ядром).

>>Если размер базы составляет 600 М записей, каждая строка занимает 300 байт с учетов всех оверхедов и индексов, какой порядок времени (минуты, часы, дни) займет выполнение операции ALTER TABLE T_1 ADD COLUMN F_NEW_COLUMN?
Если без указания default value - то миллисекунды.

>>Какой порядок времени займет выполнение операции UPDATE T_1 SET F_NEW_COLUMN = F_1 + "_" + F_2, если такое вообще возможно сделать за один раз?
Теоретически да, а на выходе вы получите таблицу выросшую в размере в 2 раза и сутки работы в лучше случае. Такие миграции всегда делаются блоками по 0.1% - 1% строк за раз с контролем что autovacuum за вами успевает подчищать.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Какое железо (число ядер, размер RAM, тип и размер диска) и какое число хостов нужно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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