如何实现Solr到PostgreSQL数据库的增量数据导出与同步
方案1:基于Solr游标查询+增量时间戳轮询(最易落地)
该方案实现成本最低,不需要改动Solr服务端配置,适合绝大多数同步场景。
你需要先确保待同步的Solr collection存在两个必填字段:
- 数据更新时间戳字段(如
last_modified,要求新增/更新数据时自动写入当前时间,精确到毫秒级) - 全局唯一主键字段(如
id,用来做幂等去重)
同步逻辑如下: - 全量同步阶段:调用Solr的
cursorMark游标查询接口拉取全量数据,规避深分页的性能问题,每次拉取的批量数据按字段映射规则写入PostgreSQL,同步完成后记录本次拉取到的最大last_modified值作为同步位点,存入本地的位点记录表。 - 增量同步阶段:按你可接受的同步延迟设置定时任务,每次查询Solr时传入条件
last_modified > 上一次记录的位点时间,同样用游标拉取符合条件的增量数据,写入PostgreSQL后更新位点。为了避免同一时间戳下的数据遗漏,可以每次查询时给位点时间回退1-2秒做重叠查询,配合PostgreSQL侧的主键冲突更新策略,既不会丢数也不会产生重复数据。
方案2:基于变更事件监听(低延迟场景首选)
如果要求同步延迟在秒级以内,可以采用事件驱动的同步机制:
- 若你的业务写入Solr前有统一的消息链路(如所有Solr写入请求都会先经过Kafka等消息队列),直接消费对应的Topic,过滤出需要同步的字段后写入PostgreSQL即可,该方案效率最高、没有额外的Solr查询压力。
- 若没有前置消息链路,可以自定义开发Solr更新处理器插件,部署到Solr服务端,在Solr处理新增、更新、删除请求时,异步将变更事件写入消息队列,下游消费队列同步数据到PostgreSQL,该方案实现成本稍高,但不会漏数,实时性也远高于轮询方案。
方案3:基于ETL工具流转(低代码场景首选)
如果不想自行开发同步逻辑,可以用成熟的ETL工具实现:
- 选择Spark、Flink等流批一体的计算框架,内置的Solr连接器可以直接对接Solr拉取数据,做完字段映射、格式转换后直接写入PostgreSQL。增量同步逻辑和方案1一致,基于时间戳位点做增量比对,分页、批量写入等逻辑都由工具封装,只需要写少量配置即可完成部署。
通用注意事项
- 所有同步场景都建议做幂等校验,将Solr的唯一主键作为PostgreSQL同步表的唯一键,遇到主键冲突时直接执行UPDATE操作,避免重复写入。
- 数据量较大时建议开启批量写入,单次Solr拉取的批量大小根据字段数量调整,通常1000-5000条/次的性能性价比最高。
- 若需要同步Solr的删除操作,建议给Solr字段加逻辑删除标记,替代物理删除,避免轮询时无法识别已删除的数据,同步到PostgreSQL时再根据标记做删除或归档操作。
内容的提问来源于stack exchange,提问作者101000101
相关产品推荐
相关产品推荐

