MySQL ES 数据同步方案
架构图
说明
业务数据
拟支持如下数据源:
- RDS(关系型数据库);
- DRDS(分布式关系型数据库);
- MongoDB;
- KV存储(Redis、Memercache);
- MQ(消息队列里)
- OSS(对象存储)
数据抽取
拟采用如下几种方式:
- 针对MySQL,用阿里Canal抓取binlog做实时增量;
- 针对Mongodb,用阿里KafkaShake抓取opLog做实时增量;
- 针对其他,采用自研工具做全量与增量
- 支持定时增量与全量
- 支持开放接口手动增量与全量
- 自研组件,对db数据的读取应遵循:
- 串行+分页读DB(禁止多线程读DB),具体为
- lock,redis get table:currMaxId
- db数据返回之后,redis set table:currMaxId,unlock
- 将返回的数据交给线程池处理
- 进行下一波读取
- 串行+分页读DB(禁止多线程读DB),具体为
数据通道
拟采用Kafka做通道中转,支持:
- 针对ES索引创建Topic
- ES相关Topic拟采用统一前缀,如 es-sync-索引名
- kafka消费者拟采用正则表达式来订阅Topic,如es-sync-*
- Topic分区数一次性设足,如12个,方便未来轻松增加消费者节点
ES适配器
拟采用自研组件,实现:
- 消费Kafka中ES相关Topic,订阅正则表达式es-sync-*
- ES中主键必须为业务数据的唯一标识
- 写入ES前对比Id+updateTime,判断 丢弃、更新、新增;
- 可灵活扩展节点数
ES存储
应该遵守:
- 只存储必要字段,包括:
- 业务唯一标识(Id)
- 列表显示字段
- 查询条件字段
- update_time
- 只做简单查询,不做复杂嵌套查询
- 写入ES的数据应该是从DB表中Join之后的结果