当业务量上升后,由于mysql对全文检索或模糊查询支持的能力不强,在系统中查询的地方,往往会出现慢sql等,拖累系统其他模块,造成性能低下。
随着ES使用普及率的升高,ES是mysql的一个有效补充。我们可以将数据发送到搜索引擎(如ES)上,由搜索引擎来提供专业的服务。
接下来,就结合工作中实际用到的场景,对数据从mysql到es的同步进行一些分析。
在实践中我总结出了以下几种方式。
第1种:同步双写
这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES,实现数据的双写。
优点:
业务逻辑简单。
缺点:
硬编码:有需要写入mysql的地方都需要添加写入ES的代码;业务强耦合;存在双写失败丢数据风险;性能较差:本来mysql的性能就不是很高,再加写一个ES,系统的性能必然会下降。说明:
上面第3点讲到的双写失败风险,包括以下3种:
ES系统不可用;应用系统和ES之间的网络故障;应用系统重启,导致系统来不及写入ES等。针对这种情况,有数据强一致性要求的,就必须双写放到事物中来处理,但是一旦用上事物,则性能下降更加明显。
第2种:异步双写(MQ方式)
针对第一种同步双写的性能和数据丢失问题,可以考虑引入MQ,从而形成了异步双写的方案,如下图所示:
由于MQ的性能基本比mysql高出一个数量级,所以性能可以得到显著的提高