источников:
1. список источников открыт (т.е. в процессе сбора данных иногда могут появляться новые источники), но не будет бурного роста их числа. Скажем, количество источников - единицы десятков тысяч. Количество событий: миллионы, сотни миллионов.
2. источник в событии идентифицируется строкой (обычно это 50...300 символов)
запросы к системе будут:
1. Как по общему набору событий (какие-то агрегации)
2. Так и выборки по конкретным источникам
вопросы:
1. По привычке хочется пронумеровать источники и нормализовать схему. Надо ли это делать в clickhouse?
2. Если нормализовать надо (выгодно), то как это сделать на лету?
что-то такое сходу набросал (https://www.db-fiddle.com/f/f6k6T5rJnN3yt3php9QrN6/0):
-- сюда будут писаться миллионы (миллиарды?) записей
create table myDb.event_buffer
(
event_prop1 String,
-- ...
event_propN String,
event_source String -- строка обычно на 50...300 символов
) engine = Kafka -- например, читаем из kafka
;
create table myDb.event
(
event_source_id UInt64
event_prop1 String,
-- ...
event_propN String,
) engine MergeTree();
-- уникальных значений name ожидатся в районе нескольких десятков тысяч
create table myDb.event_source
(
id UInt64,
name String
) engine -- КАКОЙ ВЫБРАТЬ?
create materialized view myDb.event_extractor to myDb.event as
select
sipHash64(event_source) as event_source_id,
event_prop1, /* ... */, event_propN
from myDb.event_buffer;
create materialized view myDb.event_souce_extractor to myDb.event_source as
select
sipHash64(event_source) as id,
event_source as name
from myDb.event_buffer;
это похоже на рабочую схему? В ней для myDb.event_source какой движок выбрать, чтобы обеспечить уникальность строк таблицы?
> myDb.event_source ... engine -- КАКОЙ ВЫБРАТЬ? если кластер, то вариантов немного - ReplicatedReplacingMT. Если singleserver, то я бы попробовал Join(Any,Left,id) settings join_any_take_last_row=1 Но даже если и кластер, то при наличии кафки можно паралельно несколько таких таблиц поддерживать на нодах
Join(Any,Left,id) settings join_any_take_last_row=1 а мощность event_source не будет равна мощности таблицы в этом случае? типа в event 100М и в event_source получим 100М
тут же Any. Там хеш таблица. Одна строка для одного id. По умолчанию - первая, с указанным сеттингом - последняя. Вы же говорили что источников десятки тысяч - это нормально. Вот так проверить сколько займет RAM: SELECT name, formatReadableSize(total_bytes) FROM system.tables WHERE engine = 'Join';
Обсуждают сегодня