如何实现MySQL数据库与Apache Solr的数据同步?(Vertx应用场景)
MySQL与Apache Solr同步方案(适配Vertx+Kafka技术栈)
结合你现有Vertx+Kafka+MySQL的技术栈,提供三种可行的同步方案,覆盖实时、低侵入、定时同步不同场景:
方案1:基于业务代码+Kafka的实时同步
这是最贴合你现有架构的方案,无需引入额外中间件:
- 在Vertx应用的MySQL增删改业务逻辑中,操作数据库完成后,将变更事件(包含操作类型、主键、变更后的完整数据或关键字段)通过Vertx Kafka客户端发送到指定Kafka主题。
- 开发一个独立的Vertx消费者服务,订阅该Kafka主题:
- 解析消息后,针对不同操作类型调用Solr的REST API完成同步:
- 新增/更新:请求Solr的
/update接口,提交JSON格式的文档(用Vertx HttpClient异步发送) - 删除:请求
/update接口发送删除指令(如{"delete":{"id":"xxx"}})
- 新增/更新:请求Solr的
- 解析消息后,针对不同操作类型调用Solr的REST API完成同步:
- 关键注意点:给每条Kafka消息生成唯一ID,保证Solr操作的幂等性;处理失败的消息存入死信队列,后续重试避免数据丢失。
方案2:基于Debezium CDC的无侵入同步
适合不想修改业务代码的场景,利用MySQL binlog捕获变更:
- 部署Debezium MySQL连接器,配置监听需要同步的MySQL表,连接器会将表的全量初始数据和增量变更事件自动发送到Kafka主题。
- 用Vertx消费者服务订阅Debezium输出的Kafka主题,解析Debezium的标准消息格式(包含
before旧数据、after新数据、op操作类型等字段),然后对应更新Solr索引。 - 优势:无需改动现有Vertx业务逻辑,自动支持全量初始化+增量同步,适合数据量大、业务代码不便修改的场景。
方案3:Solr DIH增量同步(补全你遗漏的配置)
你提到查阅DIH文档未找到方案,大概率是没配置增量触发的核心参数:
- 首先确保MySQL目标表有增量标记字段:要么是自动更新的
updated_at时间戳字段,要么是自增主键id。 - 在Solr的
data-config.xml中配置增量导入逻辑:<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://your-db-host:3306/dbname" user="xxx" password="xxx"/> <document> <entity name="your_table" query="SELECT * FROM your_table" <!-- 全量导入查询 --> deltaQuery="SELECT id FROM your_table WHERE updated_at > '${dataimporter.last_index_time}'" <!-- 增量数据ID查询 --> deltaImportQuery="SELECT * FROM your_table WHERE id = '${dataimporter.delta.id}'"> <!-- 增量完整数据查询 --> <field column="id" name="id"/> <!-- 映射其他业务字段 --> </entity> </document> </dataConfig> - 触发方式:可以用Vertx的
setPeriodic定时调用Solr的增量导入接口(http://solr-host:8983/solr/core_name/dataimport?command=delta-import),或者配置Solr自带的定时任务。 - 适用场景:对同步实时性要求不高(比如分钟级),配置简单无需额外开发。
内容的提问来源于stack exchange,提问作者Ashif Khan
相关产品推荐
相关产品推荐

