业务日志设计
当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集
设计一个统计系统的日志记录机制时,主要需要考虑日志的结构、数据存储方案、查询效率和系统扩展能力。
一、日志设计
1.日志结构
- 时间戳 : 记录事件发生的时间。
- 业务系统标识: 标识记录来源于哪个业务系统。
- 事件类型: 描述业务中发生的具体事件(例如:创建、更新、删除)。
- 用户标识: 记录哪个用户触发了事件(如果适用)。
- 事件详情: 事件的具体内容,可以是 JSON 格式,包含更多关键信息(如影响的数据、变更的值等)。
- 状态: 事件的状态,如成功、失败等。
2.日志存储形式
- 批量写入:
- 为了提高性能,可以使用批量写入的方式,将多个日志记录合并后一起写入数据库。
- 异步处理:
- 主业务流程中的日志记录操作可以异步进行(例如,通过消息队列),避免对主流程的性能影响。
二、数据库选择
1.NoSql数据库
- MongoDB:
- 特别适合存储 JSON 格式的日志记录,灵活的文档模型能很好地应对结构变化。
- 自带水平扩展能力,适合大规模日志数据存储。
- 虽然 MongoDB 不支持传统的 SQL JOIN,但可以通过手动查询、$lookup 聚合管道等方式实现关联查询(引用)。
- Elasticsearch:
- 适合进行复杂的查询和分析,良好的全文搜索功能。
- 实时数据分析能力强,能快速从海量日志中检索信息。
- 适合用于构建实时的监控和统计系统。
2.关系型数据库
- PostgreSQL:
- 功能强大的关系数据库,支持 JSON 数据类型,可以存储灵活的日志记录。
- 适合需要复杂查询和强一致性的场景。
- MySQL:
- 传统的关系型数据库,支持高并发读写。
- 可以通过使用合适的分区策略来处理大规模日志。
3.数据库对比
- MongoDB vs MySQL:
- 如果应用需要处理非结构化数据、灵活的数据模型和高并发的写入,MongoDB 是更好的选择。MySQL 的结构化数据模型在特定情况下可能会造成性能瓶颈。
- PostgreSQL vs MySQL:
- PostgreSQL 通常在处理复杂查询、支持高级功能(例如窗口函数、CTE、JSONB 等)方面超越 MySQL。如果需要复杂的数据分析,大型项目通常倾向于使用 PostgreSQL
- MongoDB vs Elasticsearch:
- 如果你的应用程序需要存储、更新和处理柔性数据结构,并且需要一些基本的查询能力,MongoDB 可能更合适。
- 如果你的需求主要集中在快速搜索、分析和实时数据处理,Elasticsearch 可能是更合适的选择。
三、数据采集与分析
- 数据采集:
- 使用ETL(提取、转换、加载)工具或自定义脚本,定期将日志数据从数据库或消息队列中提取到统计系统中。
- 统计分析:
- 使用数据分析工具(如 Apache Spark、Presto 等)进行批量数据处理和分析。
- 对于实时统计需求,可以直接从日志数据库(如 Elasticsearch)进行查询和分析。
四、性能和扩展
- 设计日志收集系统时,请考虑日志的写入性能和查询性能。
- 随着数据量的增加,监控性能,并基于需求进行扩展(如读写分离、增加节点、分区等)。
五、ETL工具推荐
1.Apache Nifi
- 特点: 一个易于使用、强大的数据处理和分发工具,支持实时数据流处理。
- 优点: 可视化的数据流设计界面,支持多种数据源和目标,能够处理数据流的路由、转换和操作。
- 官网: Apache NiFi
- 与 PHP 的结合: 可通过 REST API 与 PHP 集成。您可以使用 PHP 发出 API 请求来管理数据流、启动流程等操作。
- 推荐方式: 创建一个 PHP 应用,使用 cURL 或其他 HTTP 客户端库与 Nifi 的 REST API 进行交互。
2.Apache Airflow
- 特点: 一个调度工作流的工具,可以编排 ETL 任务。
- 优点: 高度灵活,可扩展的工作流管理,支持定时和依赖性任务管理。
- 官网: Apache Airflow
- 与 PHP 的结合: 可以通过 Airflow 的 REST API 来调度任务,您可以使用 PHP 发送 API 请求来管理 DAG(有向无环图)和任务执行。
- 推荐方式: 使用 PHP 创建自动化脚本来调用 Airflow API,推进 ETL 流程
3.Singer
- 特点: 采用“音乐”协议的开源工具,专注于数据提取和加载。
- 优点: 易于扩展和构建,提供许多预构建的连接器,可以通过编写 TAP 和 TARGET 轻松集成。
- 官网: Singer | Open Source ETL
- 与 PHP 的结合: Singer 的 TAP 和 TARGET 可以用任何编程语言实现,包括 PHP。您可以编写 Singer 的目标应用程序来提取数据并加载到目标位置。
- 推荐方式: 使用 PHP 实现自己的 Singer TAP 或 TARGET。
4.阿里云 DataWorks
- 中文支持: 阿里云的 DataWorks 是一个大数据开发和管理平台,整个界面和文档均为中文。
- 特点: 提供丰富的数据集成、处理和分析功能,适合生产环境。
- 与 PHP 集成: 阿里云的 DataWorks 可以通过 API 进行集成。您可以在 PHP 程序中使用阿里云的 API 调用数据工作流和任务。
- 推荐方式: 使用 PHP 代码调用 DataWorks 的 REST API,以启动作业或管理工作流。
5.DataX (阿里巴巴开源)
- 中文支持: DataX 是阿里巴巴开源的 ETL 工具,相关文档和社区交流多为中文。
- 特点: 适合大规模数据的实时和离线同步,支持多种数据源和目标。
- 与 PHP 集成: DataX 是一个命令行工具,因此可以通过 PHP 调用所在服务器中对应的执行命令。也可以在定期任务中结合 PHP 与 DataX 进行数据迁移。
- 推荐方式: 创建 PHP 脚本,使用 exec() 或 shell_exec() 来运行 DataX 任务。