1. 项目概述
最近在数据中台项目中遇到一个典型需求:需要将业务系统的MySQL数据实时同步到Elasticsearch集群,同时要对敏感字段进行脱敏处理。经过技术选型,最终选择了ElasticRelay这个轻量级数据同步工具。今天就把整个实施过程整理成保姆级教程,包含我踩过的所有坑和实战优化技巧。
ElasticRelay是一个基于Go语言开发的开源数据同步中间件,相比传统的Logstash或Canal方案,它具有部署简单、资源占用低、支持灵活的数据转换规则等优势。特别是在处理金融、医疗等需要数据脱敏的场景时,其内置的脱敏插件能大大简化开发工作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具安装
2.1 基础环境要求
- MySQL 5.7+(必须开启binlog)
- Elasticsearch 7.x集群
- JDK 1.8+(仅运行ElasticRelay需要)
- 至少2核4G的服务器资源
重要提示:MySQL的binlog_format必须设置为ROW模式,这是实现数据同步的基础条件。可以通过以下命令检查:
sql复制SHOW VARIABLES LIKE 'binlog_format';
2.2 ElasticRelay安装部署
- 从GitHub下载最新release包:
bash复制wget https://github.com/alibaba/ElasticRelay/releases/download/v1.3.0/elasticrelay-1.3.0.tar.gz
tar -zxvf elasticrelay-1.3.0.tar.gz
cd elasticrelay-1.3.0
- 修改配置文件config/application.yml:
yaml复制server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_db?useSSL=false
username: relay_user
password: your_password
elasticsearch:
hosts: ["http://es-node1:9200","http://es-node2:9200"]
- 启动服务:
bash复制./bin/startup.sh
3. 核心配置详解
3.1 数据源配置
在config/source.json中配置MySQL数据源:
json复制{
"name": "order_db",
"host": "mysql-prod.example.com",
"port": 3306,
"username": "sync_user",
"password": "encrypted_password",
"tables": ["orders", "users"],
"position": {
"filename": "mysql-bin.000123",
"position": 107
}
}
3.2 目标索引映射
在config/mapping.json中定义ES索引结构:
json复制{
"order_index": {
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"order_id": {"type": "keyword"},
"user_id": {"type": "keyword"},
"amount": {"type": "double"},
"create_time": {"type": "date"}
}
}
}
}
3.3 数据转换规则
在config/transform.json中配置字段转换规则:
json复制{
"rules": [
{
"source": "users.mobile",
"target": "users.mobile_masked",
"type": "mask",
"params": {
"prefix": 3,
"suffix": 2,
"maskChar": "*"
}
},
{
"source": "orders.create_time",
"target": "orders.create_timestamp",
"type": "date",
"params": {
"format": "yyyy-MM-dd HH:mm:ss"
}
}
]
}
4. 实时同步实现
4.1 增量同步机制
ElasticRelay通过监听MySQL的binlog实现增量同步,其核心流程包括:
- 解析binlog事件(INSERT/UPDATE/DELETE)
- 应用转换规则处理字段
- 批量写入Elasticsearch
- 定期提交位点(position)
4.2 性能调优参数
在config/performance.json中调整:
json复制{
"batchSize": 500,
"flushInterval": 1000,
"parallelism": 4,
"bufferSize": 10000
}
实测建议:对于QPS在1000左右的业务系统,batchSize设为300-500,parallelism设为CPU核心数的70%能达到最佳性能。
5. 数据脱敏实战
5.1 内置脱敏类型
ElasticRelay支持多种脱敏方式:
- 掩码脱敏(手机号/身份证)
- 哈希脱敏(不可逆)
- 替换脱敏(如姓名保留首字)
- 加密脱敏(可逆)
5.2 自定义脱敏插件
开发自定义脱敏器的步骤:
- 实现TransformPlugin接口
java复制public class EmailMasker implements TransformPlugin {
@Override
public Object transform(Object value, Map<String, Object> params) {
String email = (String)value;
return email.replaceAll("(^.).*@(.*$)", "$1***@$2");
}
}
- 打包后放入plugins目录
- 在transform.json中引用:
json复制{
"source": "users.email",
"type": "email_masker"
}
6. 监控与运维
6.1 监控指标采集
ElasticRelay暴露的Prometheus指标:
- relay_processed_events_total
- relay_lag_seconds
- relay_batch_duration_ms
Grafana监控看板配置示例:
sql复制SELECT rate(relay_processed_events_total[1m])
FROM metrics
WHERE job='elasticrelay'
6.2 常见问题处理
- 位点丢失问题:
bash复制# 查看当前位点
curl http://localhost:8080/actuator/position
# 手动重置位点
POST /actuator/position
{
"filename": "mysql-bin.000135",
"position": 428
}
- 数据不一致处理:
- 使用_reindex API重建索引
- 配置dual-write校验机制
- 定期全量校验关键字段
7. 生产环境最佳实践
经过多个项目的实战验证,总结出以下经验:
- 网络隔离:同步服务应与MySQL、ES部署在同一VPC
- 权限控制:
- MySQL账号只需REPLICATION SLAVE和SELECT权限
- ES账号配置精确的索引级权限
- 灾备方案:
- 定期备份位点信息
- 配置多实例热备
- 版本升级:
- 先在新环境验证
- 采用蓝绿部署策略
在最近的一个电商项目中,我们使用这套方案实现了日均2000万订单数据的实时同步,端到端延迟控制在3秒内,CPU消耗稳定在30%以下。特别是在618大促期间,系统平稳支撑了平时5倍的流量峰值。
