LINUX.ORG.RU
ФорумAdmin

часть тяжелых таблиц не везде реплицировалась

 , , экономия места


0

2

Коллеги, всем привет. Имеется clickhouse кластер ( один шард , 6 реплик, хранятся на сетевом СХД ) с таблицами такого вида

CREATE TABLE dds_sp.f_goods_pr                                           
(                                                                             
    `line_id` String COMMENT 'Суррогатный ключ',                              
    `price_date` DateTime COMMENT 'Дата фиксации цены',                       
    `product_id` Int32,                                                       
    `supplier_id` Int32 COMMENT 'FK к dim_suppliers',                         
    `price` Decimal(19, 4) COMMENT 'Цена за единицу',                         
    `quantity` Decimal(19, 4) COMMENT 'Количество закупленное',               
    `invoice_id` String COMMENT 'Номер накладной',                            
    `wh_id` Int32 COMMENT 'FK к dim_wh'                                       
)                                                                             
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}')
PARTITION BY toYYYYMM(price_date)                                             
ORDER BY (wh_id, product_id, supplier_id)                                     
SETTINGS index_granularity = 8192                                             
COMMENT 'Е'

Нужно чтобы тяжёлые таблицы не реплицировалась на всех нодах( только на двух. я как понял руками таблицы создавать на каждой ноде?), а обычные как показанно выше реплицировалась. Какие есть варианты? Multi tenant? Может что-то другое ?

★★★★★

Последнее исправление: pinachet (всего исправлений: 1)

У нас тут было так много девопсов, которые себя пяткой в грудь били что они огого, думаю они обязательно решат задачу…

Если они не справятся, что конечно же немыслимо, тогда подключатся недевопсы и помогут.

Вопросики по тяжелым таблицам от недевопса:

  • Они для аналитики? Интересует частота запросов к ним.
  • Вы хотите реплицировать их на паре нод или не реплицировать вообще?
Obezyan
()
Ответ на: комментарий от Obezyan

Как бы я sre, это если ты меня хочешь унизить) Понятно уже что это для относительно редко ибо olap, По второму - Да чтобы только на пару нод.

P.S. я тут смотрю разные варианты, ибо мы тут с дата инженерами смотрим что лучше

pinachet ★★★★★
() автор топика
Ответ на: комментарий от pinachet

Как бы я sre, это если ты меня хочешь унизить)

Ни в коме случае! Тирада про девопсов вообще к вам не относится, просто атланты слишком расправили плечи, пришлось им немного сутулую спину сделать.

Да чтобы только на пару нод.

Multi-tenant тут не помощник, можно просто разные ReplicaSet сделать (разные пути), те обычные таблицы у вас

ENGINE = ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}')

А на двух нодах тяжелые:

ENGINE = ReplicatedMergeTree('/clickhouse/heavy_tables/{uuid}/{shard}', '{replica}')

Играясь путями на нодах вы создаете set реплик которые видят эти таблицы. Те для нод 1 и 2:

CREATE TABLE dds_sp.f_goods_pr_heavy
(
    line_id String,
    price_date DateTime,
    product_id Int32,
    supplier_id Int32,
    price Decimal(19,4),
    quantity Decimal(19,4),
    invoice_id String,
    wh_id Int32
)
ENGINE = ReplicatedMergeTree(
    '/clickhouse/tables/heavy/f_goods_pr_heavy/{shard}',
    '{replica}'
)
PARTITION BY toYYYYMM(price_date)
ORDER BY (wh_id, product_id, supplier_id)
SETTINGS index_granularity = 8192;

Так у вас f_goods_pr_heavy будет только на первых двух нодах, без репликаций на остальные. Чтобы использовать их везде объявите на остальных нодах:

CREATE TABLE dds_sp.f_goods_pr_heavy_dist
AS dds_sp.f_goods_pr_heavy
ENGINE = Distributed(
    cluster_name_heavy,
    dds_sp,
    f_goods_pr_heavy,
    rand()
);

cluster_name_heavy опишите отдельным кластером из двух нод в cluster.xml тогда запросы по аналитике будут работать правильно обращатся в тяжелые таблицы на те ноды где они действительно есть.

мы тут с дата инженерами смотрим что лучше

За это просто палец вверх ставлю.

Obezyan
()
Ответ на: комментарий от pinachet

Оффтопный вопрос, но любопытно почему клик на схд? Миловидов сотоварищи пилили его таким какой он есть как раз чтобы уйти от схд, использовать дешёвое железо

cobold ★★★★★
()
Ответ на: комментарий от Obezyan

Насчет этого ,

cluster_name_heavy опишите отдельным кластером из двух нод в cluster.xml тогда запросы по аналитике будут работать правильно обращатся в тяжелые таблицы на те ноды где они действительно есть.

просто типа такого, верно ?

<remote_servers>
    <clickhouse_cluster>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.1.3</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
            <replica>
                <host>192.168.1.21</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
        </shard>
    </clickhouse_cluster>
</remote_servers>
pinachet ★★★★★
() автор топика
Ответ на: комментарий от pinachet

Да, примерно так:

<remote_servers>
    <clickhouse_cluster>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.1.10</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
            <replica>
                <host>192.168.1.11</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
            <replica>
                <host>192.168.1.12</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
            <replica>
                <host>192.168.1.13</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
        </shard>
    </clickhouse_cluster>
    <cluster_name_heavy>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>192.168.1.3</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
            <replica>
                <host>192.168.1.21</host>
                <port>9000</port>
                <user>admin</user>
                <password>asdasdasdasd!</password>
            </replica>
        </shard>
    </cluster_name_heavy>
</remote_servers>

и на всех нодах:

CREATE TABLE dds_sp.f_goods_pr_heavy_dist
AS dds_sp.f_goods_pr_heavy
ENGINE = Distributed(
    cluster_name_heavy,
    dds_sp,
    f_goods_pr_heavy,
    rand()
);

Любой запрос к f_goods_pr_heavy_dist будет автоматически перенаправлен на ноду 192.168.1.3 или 192.168.1.21.

Obezyan
()
Ответ на: комментарий от pinachet

Насколько я помню ReplicatedMergeTree работает когда данные находятся на той же ноже где вызываете его. Если на другойб то нужно Distributed.

  • f_goods_pr -> ReplicatedMergeTree на всех нодах
  • f_goods_pr_heavy -> ReplicatedMergeTree на ноде 1 и 2 (192.168.1.3 и 192.168.1.21)
  • f_goods_pr_heavy_dist -> Distributed на всех нодах
Obezyan
()
Ответ на: комментарий от anonymous

У меня тут в среднем в сутки ~1млрд записей, nginx>syslog>vector>кликхаус.

Я чёт наслушался всяких умных людей а теперь думаю что надо это все переделывать. Ну точнее, кликхаус менять на что-то (не на что же). Он вроде и классный и удобный, но не нравится. Может я конечно конфиги его не допилил, это отдельная история, но чё он так тупит то.

Какая то очередная поделка олимпиадников не для людей. Это надо мне его щас долго тюнить ещё, заняться больше нечем.

anonymous
()

тяжёлые таблицы не реплицировалась на всех нодах

ну создай их как mergetree, не будут реплицироваттся.

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

да

voltmod ★★★
()
Последнее исправление: voltmod (всего исправлений: 1)