当一个项目足够大的时候,我们需要将统计系统完全独立出去,那么就无法避免数据采集的问题,我们可以在业务触发处增加log日志来记录当前变化的原始数据,提供统计系统进行采集
设计一个统计系统的日志记录机制时,主要需要考虑日志的结构、数据存储方案、查询效率和系统扩展能力。
一、日志设计
1.日志结构
- 时间戳 : 记录事件发生的时间。
- 业务系统标识: 标识记录来源于哪个业务系统。
- 事件类型: 描述业务中发生的具体事件(例如:创建、更新、删除)。
- 用户标识: 记录哪个用户触发了事件(如果适用)。
- 事件详情: 事件的具体内容,可以是 JSON 格式,包含更多关键信息(如影响的数据、变更的值等)。
- 状态: 事件的状态,如成功、失败等。
2.日志存储形式
二、数据库选择
1.NoSql数据库
- MongoDB:
- Elasticsearch:
2.关系型数据库
- PostgreSQL:
- MySQL:
3.数据库对比
- MongoDB vs MySQL:
- 如果应用需要处理非结构化数据、灵活的数据模型和高并发的写入,MongoDB 是更好的选择。MySQL 的结构化数据模型在特定情况下可能会造成性能瓶颈。
- PostgreSQL vs MySQL:
- PostgreSQL 通常在处理复杂查询、支持高级功能(例如窗口函数、CTE、JSONB 等)方面超越 MySQL。如果需要复杂的数据分析,大型项目通常倾向于使用 PostgreSQL
- MongoDB vs Elasticsearch:
- 如果你的应用程序需要存储、更新和处理柔性数据结构,并且需要一些基本的查询能力,MongoDB 可能更合适。
- 如果你的需求主要集中在快速搜索、分析和实时数据处理,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 任务。