由于需要做各种数据库摆渡到kafka的组件研究。
其中clickhouse和kafka间的数据摆渡,根据官方给出的kafka引擎文档,便有了我这篇实践记录。
相应的,该配置也非常简单。
官方传送门: kafka engine clickhouse
这边对数据库和kafka环境不再累述。
kafka 2.4
zookeeper 3.4.5
clickhouse 20.4.5.36
centos7
clickhouse支持kafka的表双向同步,其中提供的为Kafka引擎。
其大致情况为如下情况:Kafka主题中存在对应的数据格式,Clickhouse创建一个Kafka引擎表(即相当于一个消费者),当主题有消息进入时,获取该消息,将其进行消费,然后物化视图同步插入到MergeTree表中。
该引擎还支持反向写入到Kafka中,即往Kafka引擎表中插入数据,可以同步到Kafka中(同样可以使用物化视图将不同引擎需要的表数据同步插入到Kafka引擎表中)。
老版本格式为:
Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format
[, kafka_row_delimiter, kafka_schema, kafka_num_consumers])
新版本格式为:
Kafka SETTINGS
kafka_broker_list = 'localhost:9092',
kafka_topic_list = 'topic1,topic2',
kafka_group_name = 'group1',
kafka_format = 'JSONEachRow',
kafka_row_delimiter = '\n',
kafka_schema = '',
kafka_num_consumers = 2
必填参数(例如topic、kafka集群、消费者组等):
非必填的参数:
CREATE TABLE queue (
q_date Date,
level String,
message String
) ENGINE = Kafka SETTINGS kafka_broker_list = 'k1:9092,k2:9092,k3:9092',
kafka_topic_list = 'my_topic',
kafka_group_name = 'kafka_group_test',
kafka_format = 'CSV',
kafka_num_consumers = 4;
消费的消息会被自动追踪,因此每个消息在不同的消费组里只会记录一次。如果希望获得两次数据,则使用另一个组名创建副本。
消费组可以灵活配置并且在集群之间同步。例如,如果群集中有 10 个主题和 5 个表副本,则每个副本将获得 2 个主题。 如果副本数量发生变化,主题将自动在副本中重新分配。
CREATE TABLE daily (
day Date,
level String,
message String
) ENGINE = MergeTree(day, (day, level), 8192);
CREATE MATERIALIZED VIEW consumer TO daily
AS SELECT q_date AS day, level, message
FROM queue;
其中AS后面的语句是自己根据实际需求进行调整的。
为了提高性能,接受的消息被分组为 max_insert_block_size 大小的块。如果未在 stream_flush_interval_ms 毫秒内形成块,则不关心块的完整性,都会将数据刷新到表中。
DETACH TABLE consumer;
ATTACH TABLE consumer;
./bin/kafka-topic.sh --create --topic my_topic --partitions 3 --replication-factor 3
此处的topic需要与之前的 kafka_topic_list对应,既然该参数为list,则可以配置多个topic
./bin/kafka-console-prodcer --topic my_topic --broker-list k1:9092
按照CSV格式,生产数据输入
2020-06-28 level1 message
2020-06-28 level2 message
2020-06-28 level3 message
此时查看表daily,数据已同步
select * from daily
|--- day --- level --- message ---|
|--- 2020-06-28 --- level1 --- message ---|
|--- 2020-06-28 --- level2 --- message ---|
|--- 2020-06-28 --- level3 --- message ---|
同理,向kafka引擎表中插入数据,也可以在my_topic中可以消费到插入数据。
首先,我们可以将daily中的消息干掉,手动导致消息丢失(自己整一个消息丢失)
TRUNCATE TABLE daily
此时,daily数据被删除了,同步的数据丢失。
接下来,我们停止kafka引擎表,在clickhouse中执行
DETACH TABLE queue
最后在kafka中,执行重置偏移量的命令
./bin/kafka-consumer-groups --bootstrap-server k1:9092 --topic my_topic --group kafka_group_test --reset-offsets --to-earliest --excute
然后,重连queue表
ATTACH TABLE queue
这样,就开始重新消费啦