目录
实时数仓
MySQL 的 binlog
-
什么是 binlog
MySQL 的二进制日志(binlog)是记录所有 DDL(数据定义语言)和 DML(数据操作语言)语句的日志文件,除了数据查询语句。它以事件形式记录变更,包括语句的执行时间。开启 binlog 通常会有约 1% 的性能损耗。二进制日志有两个主要用途:- 数据同步:MySQL Replication 使用 binlog 实现主从数据库的同步,主库(Master)将 binlog 传递给从库(Slave),确保数据一致。
- 数据恢复:通过 mysqlbinlog 工具,可以利用 binlog 恢复数据。
binlog 包括两类文件:
- 二进制日志索引文件(后缀为 .index):记录所有的二进制文件。
- 二进制日志文件(后缀为 .00000*):记录数据库的所有 DDL 和 DML 事件。
Canal
-
什么是 Canal
Canal 是一个基于 Java 开发的中间件,主要用于解析数据库增量日志(如 MySQL 的 binlog),提供增量数据的订阅和消费。Canal 模拟从库的角色,从主库获取数据变化,主要用于数据库同步和数据分析。- Canal 的工作原理:Canal 伪装成 MySQL 的 Slave,向主库请求 binlog,将其解析并通过 Canal Client 提供数据。
- MySQL 主从复制过程:
- 主库将变更记录写入 binlog。
- 从库向主库发送 dump 协议,复制 binlog 到中继日志(relay log)。
- 从库读取中继日志,并将变更同步到自己的数据库。
FlinkCDC
-
什么是 CDC
CDC(Change Data Capture)是捕获数据库变更的技术,记录数据库的插入、更新和删除操作,并将这些变更按顺序写入消息中间件,以供其他服务订阅和消费。CDC 主要有两种方式:- 基于查询:定期查询数据变化。
- 基于 Binlog:实时捕获 binlog 中的数据变化。
FlinkCDC 是使用 Flink 实现的 CDC,主要用于实时数据的 ETL 处理。它将所有数据写入一个 Topic,并需要对各表进行拆分处理。常用的做法是将维度数据存储在便于通过主键查询的数据库中(如 HBase、Redis、MySQL),而将事实数据写入流中进行处理,最终形成宽表。
内存模型
Flink 的内存使用由以下几部分组成:
- 框架堆内存:Flink 框架使用的堆内存。
- 框架堆外内存:Flink 框架使用的堆外内存。
- Task 堆内存:每个任务的堆内存。
- Task 堆外内存:每个任务的堆外内存。
- 网络缓冲内存:用于网络通信的缓冲区。
- 托管内存:由 Flink 托管的内存部分。
进程内存包括:
- Flink 使用内存:框架堆内存 + 框架堆外内存 + Task 堆内存 + Task 堆外内存 + 网络缓冲内存 + 托管内存
- JVM 元空间:JVM 的类和元数据存储空间。
- JVM 执行开销:JVM 执行时的额外开销。
OLAP 数据库
-
选择 OLAP 数据库
- ClickHouse:专门设计用于处理大量数据的统计分析,支持标准 SQL,灵活且易于使用。
- StarRocks:提供高性能的分析能力,适合复杂查询和大数据量处理。
-
列式储存的好处:
- 聚合操作优化:列式存储对列的聚合、计数、求和等操作更高效。
- 数据压缩:相同数据类型的列易于压缩,提高了数据的压缩比。
- 磁盘空间节省:压缩后节省磁盘空间,同时提升了缓存性能。
-
MergeTree
MergeTree 是 ClickHouse 中强大的表引擎,支持索引和分区,适合处理海量数据的实时分析需求。
实时需求
- 日常统计报表或分析图:需要实时更新当天的数据。
- 实时数据大屏监控:展示实时数据的可视化大屏。
- 数据预警或提示:实时监测数据异常,并及时发出警报或提示。
去重处理
-
精确去重:
- 明细数据需要保存,可以通过数据倾斜的方式,对去重值进行分桶 Hash,将内存压力分散到多个节点上,再对每个桶进行加和。
- Hash 介绍:参考相关文献,了解 Hash 算法的基本原理和应用。
-
模糊去重:
- 布隆过滤器:利用位数组算法,不保存明细数据,而是保存哈希值的标记位。适用于统计精度要求不高的场景,如全网商家的 UV 数据统计。
- 基数估计:利用哈希原理估算数据集的边界,适用于统计精度要求不高、统计维度较粗的情况,如大盘 UV 数据的粗略统计。