随着系统业务的不断发展,部分核心业务的数据规模愈发庞大,查询统计等场景愈发复杂,mysql的性能逐渐无法满足日常的使用需求,特别是各种维度的搜索场景。
这种情况下,一般都会选择将搜索的数据源从Mysql转移到ElasticSearch,但同时也需要面对两个数据源的数据如何同步问题。
方案总的来说,数据同步方案基本分为“同步写”和“异步写”两个大方向,并在这两个大方向上进行具体实现,同时都伴随着各自的优缺点。
同步双写同步双写,顾名思义,就是数据写入MySQL同时,需要调用ES进行数据写入,如下图:
优点:
实现简单;
相较于其他方案,数据实时性较高。
缺点:
代码耦合性强。
同步双写事务问题,性能较低。
系统可用性同时受多个数据源可用性影响,系统可用性降低;
为何强调该方案数据实时性高是相较于其他方案呢?
在默认情况下,ElasticSearch并非实时写入的,而是近实时,即对文档的修改,默认最多等待1s,就可以查询到。由于其他方案大多不是同步写,所以相对来说,本方案实时性较高。
异步双写由于同步双写会造成系统可用性降低,那很容易想到优化方案,就是同步改成异步,如下图
关于该方案中的异步,其实有不同的实现方式,比如异步线程、异步消息订阅等实现方式。在实际工作中,一般基于消息中间件的异步消息订阅的方式来实现。
优点:
代码耦合性低,业务代码无需