MongoDB通过airByte同步数据到clickhouse 可行性分析
-
需求:
MongDB 要对CUSTOMER_LABEL中的100多个字段,的任意组合做查询条件、并按照年龄、性别,消费能力做统计分析。 数据大小600万条,后续每年增长300万条。
-
问题
MogoDB是文档数据类型,项目需要100多个字段类型,其中有String, Double, Int, Array, Document等数据类型。 要对其中100多个字段做统计分析,分析维度不固定。
所以无法对每一个字段设置索引,导致600万数据统计时间近15-30秒。
-
方案目标
将mongoDB同步给clickhouse, 发挥clickhouse在统计情况下的性能优势。
clickhouse版本:
* 21.12.3.32 最新版本8 :
-
0.39.41-alpha. airybte
方案问题点:
1: UAT环境验证,发现同步后clickhouse字段只有15个左右,与真实的全量字段有较大差别。
原因解析: MogoDB数据是变动的,很不幸运的是 airbyte在同步前需要分析mongoDB的schema结构,用来生成对应的clickhouse数据结构。统计的是10000条,这10000条尽然是早期生成数据,分析出来的schema字段只有10-15个字段。
解决方案: MogoDB环境为一主二从的部署。
MogonDB的objectId可以由四个部分组成, 也就是时间,机器码,线程, 随机数。但这并不意味着ObjectId中时间最小的,就是自然存储顺序。
还存在objectId被人为指定, 数据恢复,数据迁移等原因。导致第一条数据并非在业务上,最早生成的第一条数据。 但总体上可以说,MongoDB第一存储是按照
时间插入顺序逐条插入,并顺序存储。
2: 为保证在任意目标的可执行性,可以做如下操作,前替条件mongoDB 中的objectID不参与任务业务。
2.1: 先查询第一条数据, 如果第一条数据为customerId=-99 表示,可以对customerId全量字字段更新。
2.2: 如果第一条数据,不等于-99 ,者需要对其数据迁移,并删除原来为-99的数据,并对第一条数据执行全量字段更新。
3: 全量同步&还是增量同步
全量同步方案,每次需要30-50分钟, 如果是覆盖模式为有段时间功能不可用的情况,
增量同步,核心是对于修改的同步能力,实时性问题? 末验证
1: 遇到的问题
同步数据时,应该clickhouse将raw表转成normalization table时,一次性将所有数据将成table数据,导致过大。 600万数据50个字段, 无法在14G(服务器内存16G)的服务器上成功
Database Error in model customer_label_scd (models/generated/airbyte_incremental/scd/uat4_admin/customer_label_scd.sql)