第1种:同步双写
概述:最简单的一种,在将数据写到mysql时,同时将数据写到ES,实现数据的双写。
优点:业务逻辑简单。
缺点:
硬编码(es的编码);
业务耦合性高;
性能较差(mysql+es会降低系统性能);
存在双写失败丢数据风险(如果数据有强一致性的要求,那就必须加上事务,性能又会降低)
(ES系统不可用、应用系统和ES之间的网络故障、应用系统重启,导致系统来不及写入ES等);
第2种:异步双写(MQ方式)
概述:针对第一种同步双写的性能和数据丢失问题,可以考虑引入MQ。(引入MQ比直接引入ES效率高)
优点:性能高;不存在丢数据问题。
缺点:
硬编码(MQ的编码);
业务耦合性高;
可能存在时延问题(MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到,造成延时);
第3种:异步双写(Worker方式)
概述:上面两种方案中都存在硬编码问题,要么植入ES代码,要么替换为MQ代码。如果对实时性要求不高的情况下,可以考虑用定时器来处理。
数据库的相关表中增加一个字段为 timestamp 的字段,任何crud操作都会导致该字段的时间发生变化,让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;逐条写入到ES中。
优点:
不改变原来代码,没有侵入性、没有硬编码;
没有业务耦合;
缺点:
时效性较差(由于定时器工作周期不可能设在秒级);
对数据库有一定的轮询压力(改进方法是将轮询放到压力不大的重库上);
第4种:Binlog 同步方式
概述:上面三种方案要么有代码侵入,要么有硬编码,要么有时延,那么可以利用mysql的binlog来进行同步。
具体步骤如下:
1)读取mysql的binlog日志,获取指定表的日志信息;
2)将读取的信息转为MQ;
3)编写一个MQ消费程序;
4)不断消费MQ,每消费完一条消息,将消息写入到ES中;
优点:
没有代码侵入、没有硬编码;
没有业务耦合;
缺点:
构建Binlog系统复杂;
可能存在时延问题(MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到,造成延时);