API-vendor/docs/datax/scheduled_execution.md

320 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# DataX 同步脚本定时执行指南
本文档介绍了如何定时执行 DataX 同步脚本的两种主要方式:宿主机 crontab 和容器内 crontab。
## 1. 宿主机 Crontab 方式
### 1.1 原理
在宿主机上使用 `crontab` 工具,通过 `docker-compose exec` 命令定期在 DataX 容器内执行同步脚本。
### 1.2 配置步骤
#### 1.2.1 创建执行脚本
首先,在宿主机上创建一个执行脚本,用于运行 DataX 作业:
```bash
# 创建脚本目录
mkdir -p /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts
# 创建产品同步脚本
touch /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_products.sh
chmod +x /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_products.sh
# 创建订单同步脚本
touch /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_orders.sh
chmod +x /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_orders.sh
```
#### 1.2.2 编写脚本内容
**产品同步脚本** (`sync_products.sh`)
```bash
#!/bin/bash
# 设置工作目录
cd /Users/zksu/Developer/work/workcode/API-vendor/container
# 执行 DataX 作业
docker-compose exec -T datax python /datax/bin/datax.py /datax/job/restful_to_mysql_products.json > /Users/zksu/Developer/work/workcode/API-vendor/container/datax/log/products_sync_$(date +%Y%m%d_%H%M%S).log 2>&1
```
**订单同步脚本** (`sync_orders.sh`)
```bash
#!/bin/bash
# 设置工作目录
cd /Users/zksu/Developer/work/workcode/API-vendor/container
# 执行 DataX 作业
docker-compose exec -T datax python /datax/bin/datax.py /datax/job/restful_to_mysql_orders.json > /Users/zksu/Developer/work/workcode/API-vendor/container/datax/log/orders_sync_$(date +%Y%m%d_%H%M%S).log 2>&1
```
#### 1.2.3 配置 Crontab
1. 编辑宿主机的 crontab 配置:
```bash
crontab -e
```
2. 添加定时任务:
```bash
# 每小时执行一次产品同步
0 * * * * /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_products.sh
# 每2小时执行一次订单同步
0 */2 * * * /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_orders.sh
# 每天凌晨3点执行所有同步
0 3 * * * /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_products.sh && /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_orders.sh
```
3. 保存并退出编辑器。
### 1.3 优点
- **配置简单**:无需修改 Docker 容器配置
- **易于管理**:所有定时任务集中在宿主机管理
- **日志管理方便**:可以将日志输出到宿主机指定位置
- **不依赖容器状态**:即使容器重启,定时任务依然有效
### 1.4 缺点
- **依赖宿主机**:宿主机故障会导致定时任务失效
- **需要宿主机权限**:需要在宿主机上配置 crontab
## 2. 容器内 Crontab 方式
### 2.1 原理
在 DataX 容器内部安装并配置 `crontab` 服务,直接在容器内定时执行同步脚本。
### 2.2 配置步骤
#### 2.2.1 自定义 Docker 镜像
1. 创建 `Dockerfile`
```bash
mkdir -p /Users/zksu/Developer/work/workcode/API-vendor/container/datax/docker
```
2. 编写 `Dockerfile`
```dockerfile
FROM beginor/datax
# 安装 crontab
RUN apt-get update && apt-get install -y cron && rm -rf /var/lib/apt/lists/*
# 创建 crontab 配置文件
RUN touch /etc/crontab /etc/cron.d/datax-cron
# 给执行权限
RUN chmod 0644 /etc/cron.d/datax-cron
# 创建日志目录
RUN mkdir -p /var/log/cron
# 复制作业脚本
COPY job/ /datax/job/
# 设置环境变量
ENV TZ=Asia/Shanghai
# 启动 crontab 服务
CMD service cron start && tail -f /dev/null
```
3. 构建自定义镜像:
```bash
cd /Users/zksu/Developer/work/workcode/API-vendor/container/datax/docker
docker build -t custom/datax .
```
4. 修改 `docker-compose.yml` 中的镜像:
```yaml
datax:
image: custom/datax
# ... 其他配置不变
```
#### 2.2.2 配置容器内 Crontab
1. 进入容器:
```bash
docker-compose exec datax bash
```
2. 编辑 crontab 配置:
```bash
crontab -e
```
3. 添加定时任务:
```bash
# 每小时执行一次产品同步
0 * * * * python /datax/bin/datax.py /datax/job/restful_to_mysql_products.json > /datax/log/products_sync_$(date +\%Y\%m\%d_\%H\%M\%S).log 2>&1
# 每2小时执行一次订单同步
0 */2 * * * python /datax/bin/datax.py /datax/job/restful_to_mysql_orders.json > /datax/log/orders_sync_$(date +\%Y\%m\%d_\%H\%M\%S).log 2>&1
```
4. 保存并退出编辑器。
5. 重启 crontab 服务:
```bash
service cron restart
```
### 2.3 优点
- **容器化管理**:定时任务与容器绑定,便于迁移和部署
- **不依赖宿主机**:容器可以在任何 Docker 环境中运行,定时任务依然有效
- **隔离性好**:定时任务只影响当前容器
### 2.4 缺点
- **配置复杂**:需要自定义 Docker 镜像
- **日志管理**:日志默认保存在容器内部,需要通过卷挂载到宿主机
- **容器重启影响**:容器重启后需要确保 crontab 服务自动启动
## 3. 定时任务监控
### 3.1 日志监控
- **宿主机方式**:直接查看宿主机上的日志文件
- **容器内方式**:通过 `docker-compose logs -f datax` 查看容器日志,或通过卷挂载查看日志文件
### 3.2 执行状态监控
1. **创建监控脚本**
```bash
#!/bin/bash
# 检查产品同步日志
PRODUCTS_LOG=$(ls -t /Users/zksu/Developer/work/workcode/API-vendor/container/datax/log/products_sync_*.log | head -1)
if [ -f "$PRODUCTS_LOG" ]; then
echo "产品同步最后执行时间:$(date -r $PRODUCTS_LOG)"
echo "执行结果:$(tail -1 $PRODUCTS_LOG)"
else
echo "产品同步日志不存在"
fi
# 检查订单同步日志
ORDERS_LOG=$(ls -t /Users/zksu/Developer/work/workcode/API-vendor/container/datax/log/orders_sync_*.log | head -1)
if [ -f "$ORDERS_LOG" ]; then
echo "订单同步最后执行时间:$(date -r $ORDERS_LOG)"
echo "执行结果:$(tail -1 $ORDERS_LOG)"
else
echo "订单同步日志不存在"
fi
```
2. 给脚本执行权限:
```bash
chmod +x /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/check_sync_status.sh
```
3. 执行监控脚本:
```bash
/Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/check_sync_status.sh
```
### 3.3 告警机制
可以结合以下工具实现告警机制:
- **Prometheus + Grafana**:监控同步任务执行状态和时间
- **ELK Stack**:收集和分析同步日志,设置告警规则
- **企业微信/钉钉机器人**:通过脚本检查执行结果,发送告警通知
## 4. 最佳实践
### 4.1 选择合适的方式
- **小型项目/测试环境**:推荐使用宿主机 crontab 方式,配置简单
- **大型项目/生产环境**:推荐使用容器内 crontab 方式,便于管理和迁移
- **需要高可用**:考虑使用专门的任务调度工具,如 Apache Airflow、XXL-JOB 等
### 4.2 日志管理
- **设置合理的日志保留时间**:避免日志文件过大
- **使用日志轮转**:定期压缩和清理旧日志
- **集中日志管理**:将日志发送到 ELK 或其他日志管理系统
### 4.3 错误处理
- **添加重试机制**:在脚本中添加失败重试逻辑
- **设置超时时间**:避免单个任务执行时间过长
- **及时告警**:同步失败时立即发送告警通知
### 4.4 性能优化
- **合理设置同步频率**:根据数据更新频率设置合适的同步间隔
- **使用增量同步**:只同步新增或修改的数据,减少同步时间
- **调整并发数**:根据系统资源和 API 限制调整 DataX 的并发通道数
## 5. 示例:完整的宿主机 Crontab 配置
### 5.1 产品同步脚本 (`sync_products.sh`)
```bash
#!/bin/bash
# 设置工作目录
cd /Users/zksu/Developer/work/workcode/API-vendor/container
# 记录开始时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行产品同步..." > /tmp/products_sync_start.log
# 执行 DataX 作业
docker-compose exec -T datax python /datax/bin/datax.py /datax/job/restful_to_mysql_products.json > /Users/zksu/Developer/work/workcode/API-vendor/container/datax/log/products_sync_$(date +%Y%m%d_%H%M%S).log 2>&1
# 检查执行结果
if [ $? -eq 0 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 产品同步执行成功" >> /tmp/products_sync_start.log
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 产品同步执行失败" >> /tmp/products_sync_start.log
# 发送告警通知(示例:企业微信机器人)
curl -s -H "Content-Type: application/json" -d '{"msgtype": "text", "text": {"content": "产品同步执行失败,请查看日志"}}' https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_webhook_key
fi
```
### 5.2 Crontab 配置
```bash
# 每小时执行一次产品同步
0 * * * * /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_products.sh
# 每2小时执行一次订单同步
0 */2 * * * /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_orders.sh
# 每天凌晨3点执行所有同步
0 3 * * * /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_products.sh && /Users/zksu/Developer/work/workcode/API-vendor/container/datax/scripts/sync_orders.sh
# 每天凌晨4点清理7天前的日志
0 4 * * * find /Users/zksu/Developer/work/workcode/API-vendor/container/datax/log -name "*.log" -mtime +7 -delete
```
## 6. 扩展阅读
- [Crontab 语法详解](https://crontab.guru/)
- [Docker 容器中使用 Crontab](https://docs.docker.com/config/containers/multi-service_container/)
- [Apache Airflow 官方文档](https://airflow.apache.org/docs/)
- [XXL-JOB 官方文档](https://www.xuxueli.com/xxl-job/)