MV не обновляется для ReplicatedMergeTree

573 views
Skip to first unread message

Ury

unread,
Jan 26, 2017, 5:56:05 AM1/26/17
to ClickHouse
Доброе время суток!

изучаю ReplicatedMergeTree и Materialized view.
наступил на проблему: MV не обновляется для реплицированной таблицы

исходные данные:
есть 2 сервера, на каждом создана ReplicatedMergeTree таблица test и MV test_log.

CREATE TABLE test (date Date MATERIALIZED toDate(timestamp), timestamp DateTime) ENGINE = ReplicatedMergeTree ('/clickhouse/tables/bar/test', 'rep1', date, timestamp, (date), 8192);
CREATE MATERIALIZED VIEW test_log ENGINE = AggregatingMergeTree(date, (date), 8192) AS SELECT toDate('1971-01-01') as date, min(timestamp) AS start, max(timestamp) AS end FROM test;

вставляем данные на первом сервере:
insert into test (timestamp) values (1485427525),(1485427526),(1485427527);

смотрим на MV:
select * from test_log;
┌───────date─┬───────────────start─┬─────────────────end─┐
│ 1971-01-01 │ 2017-01-26 13:45:25 │ 2017-01-26 13:45:27 │
└────────────┴─────────────────────┴─────────────────────┘

на втором сервере:
select * from test;
┌───────────timestamp─┐
│ 2017-01-26 13:45:25 │
│ 2017-01-26 13:45:26 │ 
│ 2017-01-26 13:45:27 │
└─────────────────────┘

select * from test_log;
0 rows in set. Elapsed: 0.001 sec.

почему так ? хочется чтобы MV обновлялся на обоих нодах.

Ury

unread,
Jan 26, 2017, 8:53:35 AM1/26/17
to ClickHouse
Upd. 
правильнее

CREATE MATERIALIZED VIEW test_log ENGINE = AggregatingMergeTree(date, (date), 8192) AS SELECT toDate('1971-01-01') as date, minState(timestamp) AS start, maxState(timestamp) AS end FROM test;
CREATE VIEW test_log2 as select minMerge(start) as start,maxMerge(end) as end from test_log;

но MV не обновляется по прежнему.

man...@gmail.com

unread,
Jan 26, 2017, 10:04:51 PM1/26/17
to ClickHouse
Вставка в MV происходит при INSERT-е в таблицу, но не при скачивании кусков при репликации.
Чтобы добиться желаемого поведения, необходимо сделать MV тоже Replicated.

В этом случае, принцип работы будет таким:
- вы выполняете INSERT в одну из реплик таблицы test;
- данные записываются также в MV test_log;
- данные реплицируются и попадают на все реплики таблицы test;
- если вы сделали MV Replicated, то данные, записанные в MV на одной реплике, тоже реплицируются, и попадают на все реплики.

Ury

unread,
Jan 27, 2017, 2:13:18 AM1/27/17
to ClickHouse
спасибо.

MV создаю чтобы ответить на вопрос, за какое время есть данные на реплике
если реплицировать MV - то ,как я понимаю, она реплицируется независимо от других таблиц ? и может приехать на сервер раньше чем test ?

не подскажете как эту задачу решить правильно ?

пятница, 27 января 2017 г., 6:04:51 UTC+3 пользователь man...@gmail.com написал:

Хрячок Хрячков

unread,
Jan 31, 2017, 9:39:03 AM1/31/17
to ClickHouse
Можно сделать <internal_replication>false</internal_replication>, тогда Distributed-таблица будет отправлять данные инсёртами на все реплики, и значит на всех репликах сработают MV. Другое дело, что, видимо, придется отказаться от репликации, и будут обычные таблицы MergeTree.

У меня была похожая задача и я сделал так (2 шарда по 2 реплики, к примеру 4 сервера: A1 A2 и B1 B2):

1) выставляем <load_balancing>in_order</load_balancing>
2) создаем MV только на первых репликах в конфиге (на A1 и B1)
3) вставляем данные в локальные таблицы на самих репликах A1 и B1, а не в Distributed-таблицу. Данные приезжают только на A1 и B1, MV заполняются, на A2 и B2 данные уезжают по репликации.

В случае, если перестанут работать реплики A1 и B1, я остановлю заливку, пересоздам MV на A2 и B2, укажу их первыми в конфиге, запущу наливку. Это ручная процедура, но в моем случае это некритично.

Это криво, но у меня не получилось создать тогда реплицированные MV, уже не помню почему. Видимо, надо будет попробовать еще раз.
Reply all
Reply to author
Forward
0 new messages