CK高可用改造思路
一. ReplicatedMergeTree 和 Distributed 表
ReplicatedMergeTree 表:
o 每个节点上都有一个副本,数据自动同步。
o 操作这个表会直接影响该副本所在节点上的数据。
Distributed 表:
o 它是一个逻辑表,用于在多个节点或分片上分发查询。
o 操作这个表实际上是将操作分发到关联的底层表(通常是 ReplicatedMergeTree 表)上。
ReplicatedReplacingMergeTree:
o 括号中的第一个和第二个参数仍然是 ZooKeeper 路径和副本名称。
o 如果在 ReplacingMergeTree 中使用了去重字段,那么在 ReplicatedReplacingMergeTree 中,去重字段将作为第三个参数传递。
二、具体步骤
1、将flyway脚本MergeTree改成使用ReplicatedMergeTree引擎,命名为xxx_local;ReplacingMergeTree改成ReplicatedReplacingMergeTree
比如ailpha_security_alarm_local
create table if not exists securityAlarm.ailpha_security_alarm_local on CLUSTER 'all-clusters'
(
alarmSource String comment '字段名:告警来源',
attributeCompanyName String comment '字段名:归属单位名称',
attributeCompanyPath String comment '字段名:归属单位架构路径'
)
engine = ReplicatedMergeTree('/clickhouse/tables/${shard}/ailpha_security_alarm_local ', '{replica}')
PARTITION BY toYYYYMMDD(endTime)
ORDER BY (endTime, windowId, aggCondition, srcAddress, destAddress, threatSeverity, modelName, destHostName,
appProtocol, name)
SETTINGS index_granularity = 8192;
2、创建Distributed表命名为原来的名称ailpha_security_alarm,查询的时候就不需要改代码了
CREATE TABLE if not exists ailpha_security_alarm ON CLUSTER 'all-clusters' AS ailpha_security_alarm_local
ENGINE = Distributed('all-clusters', securityAlarm, ailpha_security_alarm_local, rand());
3、修改删除的地方改成直接操作本地表local且加上 ON CLUSTER 'all-clusters',新增还是操作分布式表
三、问题
1、使用了pg远程表,postgresql引擎。需要如何改造:
方案1、
还是按照上面的方式改造为分布式表,业务代码定时去将pg数据同步到clickhouse里的远程表
方案2、(采纳)
使用物化视图MATERIALIZED
Step 1: 创建 PostgreSQL 引擎表
首先,在 ClickHouse 中创建一个 PostgreSQL 引擎的表,用于访问 PostgreSQL 数据库中的表数据。
CREATE TABLE postgres_table ENGINE = PostgreSQL('host:port', 'database', 'table', 'user', 'password') AS SELECT * FROM postgres_table_name;
这一步创建了一个虚拟表,可以直接查询 PostgreSQL 数据。
Step 2: 创建 ReplicatedMergeTree 目标表
接下来,在 ClickHouse 中创建一个使用 ReplicatedMergeTree 引擎的目标表,用于存储同步的数据。
CREATE TABLE replicated_target_table ( id UInt64, data String, -- 其他字段 event_time DateTime ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/target_table', '{replica}') ORDER BY id PARTITION BY toYYYYMM(event_time)
Step 3: 创建物化视图
创建一个物化视图,从 PostgreSQL 引擎表中读取数据并插入到 ReplicatedMergeTree 表中。
CREATE MATERIALIZED VIEW postgres_to_replicated_mv ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/mv', '{replica}') ORDER BY id POPULATE AS SELECT id, data, event_time FROM postgres_table;
· POPULATE:如果你希望立即填充物化视图,请使用此选项;否则,物化视图只会同步创建后新增的数据。
· 该物化视图会自动将数据从 PostgreSQL 表同步到 ReplicatedMergeTree 表中。
优点:高可用、物化视图自动同步数据
缺点:实时性一般
方案3:
使用cbc,cbd通过监听数据日志实时捕获数据变更事件,将事件传播到目标系统,可以使用 Debezium:一个开源的 CDC 平台,支持 MySQL、PostgreSQL、MongoDB、Oracle 等数据库
优点:实时性、一致性 好
缺点:实现维护cbc比较复杂,数据库有一定的性能影响
评论区