侧边栏壁纸
博主头像
搞钱拒绝ICU

行动起来,活在当下

  • 累计撰写 13 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

ClickHouse高可用

admin
2024-01-28 / 0 评论 / 0 点赞 / 8 阅读 / 0 字

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比较复杂,数据库有一定的性能影响

0

评论区