184 похожих чатов

Хочу посоветоваться по поводу одного потенциального юзкейса для ClickHouse. Есть система,

которая делает единицы миллинов исходящих API вызовов во внешние системы статистики и сохраняет результаты в Postgres. В терминах предметной области это сколько денег потратили клиенты на свои рекламные кампании на разных платформах (Facebook, Google, Twitter, etc) с брейкдауном по дате, кампании, стране + еще несколько измерений.

Эти данные имеют свойство меняться в прошлом, поэтому каждый день мы забираем новые данные за вчера + обновленные старые за 7 дней до этого. То есть это не append only сценарий.

В Postgres мы делаем DELETE FROM ... WHERE ... (условие соответствующее кусочку данных, которые мы хотим обновить). Таких кусочков столько же сколько исходящих запросов, т.е. миллионы.
Потом вставлеяем новые через COPY FROM ...
Под транзакцией.
Это все крутится на 4 шардах с NVMe + подневное секционирование.

Это была история про запись.

На чтение мы сервим эти данные в клиентский дашборд через SELECT sum(...) FROM ... WHERE ... GROUP BY ...

Т.е. на чтение это очень ClickHouse история, на запись кажется что вообще нет 🙂

Можно ли как-то адаптировать запись под ClickHouse чтобы уйти от Postgres?

10 ответов

17 просмотров

можно попробовать ReplacingMergeTree + партиции по месяцам или неделям + optimize table ... partition ... final после вставки

Vitali Kotik- Автор вопроса
ivan
можно попробовать ReplacingMergeTree + партиции по...

Тут кастит есть нюанс наверное ReplacingMergeTree заменит старые строчки на новые Но не удалит старые строчки, которые перестали существовать. Это сценарий когда внешнее API спустя время не вернуло какую-то строку. Типа во внешнем сервисе случился какой-то внутренний reconciliation и они решили что такого сегмента данных нету на самом деле.

можно попробовать манипулировать TTL у таблицы

Vitali Kotik- Автор вопроса
critskiy
можно попробовать манипулировать TTL у таблицы

интересная мысль - некогда не думал про это интуитивно страшноват т.к. новые данные могут просто не придти вовремя, а старые при этом удалятся по ttl

Просто партиционируйте по дням и дропайте старые партиции

Я не понял, что, откуда и куда хотите аттачить. Но, в любом случае, мне не известны детали того, как у вас данные обновляются, вам виднее

Vitali Kotik- Автор вопроса
Илья Коргун
Я не понял, что, откуда и куда хотите аттачить. Но...

Спасибо за идею, подумаю. На CH пока нету системы. На Postgres она описана здесь https://t.me/clickhouse_ru/336648

С постгресом-то я понял. Всё равно, нужно знать больше деталей и решать по месту. К слову, есть ещё REPLACE PARTITION

Vitali Kotik- Автор вопроса
Илья Коргун
С постгресом-то я понял. Всё равно, нужно знать бо...

О спасибо! видимо жанглирование партициями это распространенный юзкейс раз есть такие ф-ции

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта