前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、同步双写方案

在代码中对数据库和 ES 进行双写操作,确保先更新数据库后更新 ES 。如果数据库更新成功而 ES 更新失败,可以通过事务回滚来保证一致性。这种方案简单易实现,但可能存在性能瓶颈和不一致的风险。

image-20250226165821942

1、优点

数据一致性:双写策略可以保证在 MySQLElasticsearch 之间数据的强一致性,因为每次数据库的变更都会在 Elasticsearch 中同步反映。

实时性:双写策略可以实现数据的实时同步,用户在 MySQL 中进行的任何操作都会立即在 Elasticsearch 中体现。

易于实现:从技术角度来说,双写策略的实现相对简单,通常只需要在应用程序代码中添加额外的写入逻辑。

2、缺点

代码复杂性:需要在应用程序中增加额外的代码来处理数据的双写,这会增加代码的复杂性和维护难度。

性能开销:每次数据库操作都需要执行两次,这会导致额外的性能开销,尤其是在高并发的场景下。

数据不一致风险:在双写过程中,如果发生系统故障或网络延迟,可能会出现数据不一致的情况,尤其是在写入 MySQL 成功但写入 ES失败时。

3、应用场景

系统特点:旧系统年限长、单体架构且技术比较落后,如果引入除es之外的其他中间件治理成本很高,可以考虑这个方案。

业务场景:用户量少、偏后台管理类的系统,对数据同步的实时性要求很高,接近实时。

2、MQ 异步双写方案

使用消息队列(如 RocketMQKafka 等)作为中间件,应用程序在更新数据库后发送消息到 MQ ,由 MQ 的消费者异步更新 ES

image-20250226165833418

1、优点

系统解耦: MQ 的使用使得 MySQLES 之间的依赖性降低,提高了系统的可维护性和扩展性。

高可用性:MQ 可以提供消息的持久化存储,确保即使系统故障,消息也不会丢失。

容错性:在双写过程中,即使某个系统出现故障,数据仍然可以通过其他系统恢复。

2、缺点

延迟:异步处理可能会导致数据同步的延迟,特别是在高负载或系统资源不足的情况下。

复杂度:引入MQ和双写机制增加了系统的复杂度,需要更多的开发和维护工作。

补偿机制:需要设计复杂的补偿机制来处理同步失败的情况,增加了系统的复杂性。

3、应用场景

系统特点

  • C端系统:该系统面向最终用户,可能是移动应用、Web应用或桌面应用。
  • 引入 MQ 中间件:系统架构中已经包含了消息队列中间件,这为异步处理提供了基础。
  • 接口 TPS 性能要求:系统对接口的吞吐量(TPS,Transactions Per Second)有一定要求,需要保证高并发情况下的性能。

业务场景

  • 用户体量大,高并发场景:系统服务的大量用户同时进行操作,导致系统面临高并发压力。
  • 业务变更少:业务逻辑变更相对较少,数据同步的需求比较稳定。
  • 允许一定的延迟:在保证用户体验的前提下,数据同步的延迟在秒级范围内是可以接受的。

3、扫表定期同步方案

通过定时任务定期扫描数据库,将变更的数据同步到ES。

image-20250226170036641

1、优点

实现简单:使用定时任务调度框架,不需要复杂的开发工作。

适合批量数据:对于大量数据的迁移,批量处理可以减少网络传输次数和 ES 的写入压力。

对业务影响小:定时任务可以在系统负载较低的时段运行,对在线业务影响较小。

2、缺点

实时性差:由于是定期执行,数据同步存在延迟,不适合对实时性要求高的应用。

性能影响:同步过程中可能会对 MySQLES 的性能产生短期影响,尤其是在数据量大时。

数据一致性:如果在同步周期内数据发生变化,可能会导致 ES 中数据与 MySQL 不一致。

3、应用场景

系统特点:旧系统年限长、技术框架老旧,引入其他的中间件成本很高。

业务场景:用户体量小、偏报表统计类业务、对数据实时性要求不高。

4、监听 binlog 同步方案

通过直接监听 MySQLbinlog 来实现数据库和 ES 之间的实时同步。

image-20250226170237859

1、优点

业务无侵入:数据同步准实时

业务解耦:不需要关注原来系统的业务逻辑。

2、缺点

1、构建 Binlog 系统复杂;

2、如果采用 MQ 消费解析的 Binlog 信息,也会像方案二一样存在 MQ 延时的风险。

3、应用场景

系统特点: c 端系统,开放 mysql binlog 日志监听,引入第三方 canal 中间件成本不高。

业务场景::互联网公司,用户体量大、大型多中心组织、高并发场景,业务上允许有一定的延迟(秒级)。

ContactAuthor

 

 
 

#