数据同步方案
前言
针对后续的产品、订单、供应商等服务的开发和产品设计,基于底层的POI信息的要求和依赖性很强,而POI的数据涉及到行政区划、景点、酒店、社会设施、购物、美食等方面。数据面和量都比较大,而且需要支持多关键字的检索,因此,传统的rds满足不了场景应用需求,因此需要使用es的全文检索来满足检索需求,而POI的数据也需要提供人工的渠道来进行补充,这就涉及到mysql到文档数据库es的数据同步的需求了,需要保障初始化数据和后续的维护数据和检索库的数据保持一致。
数据同步方式
基本上,数据同步的方式分为两种,推送和拉取两种方式:
- 主动推送: 在人工维护入库的同时,主动调用es的api,推送数据到es,达到数据的一致性.这种方式存在的问题在于人工维护的同时还需要考虑es的记录是新增还是修改,api需要进行重构和封装,另外,由于mysql和es不是同一个库,在事务控制上也无法在一个事务中进行控制,而考虑到分布式部署的情况,还需要考虑一致性的复杂性。
- 被动拉取:考虑到定时任务的方式,按照频率对数据库表进行抽取入库.这种方式有可能出现的情况是定时任务出错以及频率设置的太过于大,导致数据检索不到或者检索的实时性不高.
鉴于此两种方式的问题,我们根据mysql的特性以及消息队列的广泛应用,建议选型采用模拟数据库主从同步方式抓取binlog日志同步到消息队列,然后采用生产者/消费者线程方式实现数据的实时同步。