当业务量上升后,由于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高出一个数量级,所以性能可以得到显著的提高。

优点:

性能高;不存在丢数据问题。缺点:

硬编码问题:依然存在业务强耦合:依然存在复杂度增加:系统中增加了mq的代码,;可能存在时延问题:程序的写入性能提高了,但是由于MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到,造成延时。第3种:异步双写(Worker方式)

上面两种方案中都存在硬编码问题,也就是有任何对mysq进行增删改查的地方要么植入ES代码,要么替换为MQ代码,代码的侵入性太强。

如果对实时性要求不高的情况下,可以考虑用定时器来处理,具体步骤如下:

数据库的相关表中增加一个字段为timestamp的字段,任何crud操作都会导致该字段的时间发生变化;原来程序中的CURD操作不做任何变化;增加一个定时器程序(京东内部叫Worker),让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;逐条写入到ES中。入下图所示

优点:

不改变原来代码,没有侵入性、没有硬编码;没有业务强耦合;不改变原来程序的性能;Worker代码编写简单不需要考虑增删改查。缺点:

时效性较差,由于定时器工作周期不可能设在秒级,所以实时性没有上面2中好;对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的重库上。第4种:Binlog 同步方式:

上面三种方案要么有代码侵入,要么有硬编码,要么有时延,第4中方案,可以利用mysql的binlog来进行同步

具体步骤如下:

1) 读取mysql的binlog日志,获取指定表的日志信息;

2) 将读取的信息转为MQ;

3) 编写一个MQ消费程序;

4) 不断消费MQ,每消费完一条消息,将消息写入到ES中。

优点:

没有代码侵入、没有硬编码;原有系统不需要任何变化,没有感知;性能高;业务解耦,不需要关注原来系统的业务逻辑。缺点:

构建Binlog系统复杂;也像方案二,存在MQ延时的风险

ES数据同步方案的更多相关文章

  1. oracle数据同步方案

    数据同步方案:--用DBLINK 创建与所需同步表的链接------------------------------------------------------------------------ ...

  2. Oracle数据库数据同步方案

    一.比较原始的方案:触发器/Job/快照+dblink的方式,可实现同步和定时刷新: 二台不同的数据库服务器,从一台数据库服务器A的一个用户读取另一台数据库服务器B下某个用户的数据,可以通过dblin ...

  3. 前端web服务器数据同步方案

    概述: 网站采用了web和mysql数据库分离的架构,前端有web1.web2.web3需要对他们进行上传文件同步 方案: 在web2的windows服务器上安装GoodSync软件,利用其双向同步特 ...

  4. Mysql、ES 数据同步

    数据同步中间件 不足:不支持 ES6.X 以上.Mysql 8.X 以上 ime 标识最大时间 logstash全量.增量同步解决方案 https://www.elastic.co/cn/downlo ...

  5. Docker环境下的Mysql8 实现主从数据库数据同步方案

    本文记录下通过MySQL Replication在Docker环境下,通过多个容器 实现数据库主从配置. MySQL Replication就不多解释了,简单说就是MySQL非常出色的一个功能,该功能 ...

  6. 高可用数据同步方案-SqlServer迁移Mysql实战

    简介 随着业务量的上升,以前的架构已经不满足业务的发展,数据作为业务中最重要的一环,需要有更好的架构作为支撑.目前我司有sql server转mysql的需求,所以结合当前业务,我挑选了阿里云开源的一 ...

  7. rsync安装与配置使用 数据同步方案(centos6.5)

    rsync + crond   ==定时数据同步 sersync(inotify)  + rsync  ==实时数据同步,利用rsync实现 ##应用场景 ..1 主备服务器之间同步数据定时    = ...

  8. sql server数据同步方案-日志传送

    1 功能描述 本方案采用日志传送模式,把核心数据库(主数据库)定期同步到灾备数据库(辅助服务器)及备份库(辅助服务器,便于其他系统使用,减轻主数据压力),期间,如果发生异常导致无法同步,将以电子邮件. ...

  9. 数据同步方案(附Java源码)

    一.问题背景经常碰到要同步数据的情况,而系统自带的复制功能又不能实现增量同步,每次都要做全量复制,发生异常情况后只能重头再来,非常麻烦,优其是对那种大文件的处理,更是耗时.二.解決方案1.计算源目录数 ...

随机推荐

  1. HITCON-Training-Writeup

    HITCON-Training-Writeup 原文链接M4x@10.0.0.55 项目地址M4x's github,欢迎star~ 更新时间5月16 复习一下二进制基础,写写HITCON-Train ...

  2. MVC5+EF6 入门完整教程5 :UI的一些改造

    https://www.cnblogs.com/miro/p/4095165.html 上篇文章介绍了EF实现CRUD及一些基本的Html Helpers. 这次我们将会对之前的内容进行一些修改和重构 ...

  3. Drf小结

    DRF框架 一. 认识restful架构 REST,即Representational State Transfer的缩写 ,我们一般叫他'表现层状态转化' REST的路径设计思路是简洁: 资源(比如 ...

  4. [Linux] Ubuntu18.04 安装之后配置过程

    前言  最终还是安装了Ubuntu 虽然一开始想用Deepin 但是死活安装不上,我也很绝望(引导一直找不到 恢复BIOS默认设置也还是不行 所以 有些绝望啊....)  所以 为了让以后的我不再那么 ...

  5. 【常识】常用RGB颜色对照表

    RGB颜色表 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:rgb(255,0,0) 绿色:rgb(0,255,0) 蓝色:rgb(0,0,255) 青色:rgb(0,25 ...

  6. 每天进步一点点------ORCAD Capture CIS 快捷键

                   ORCAD Capture CIS 快捷键 I: 放大O: 缩小C: 以光标所指为新的窗口显示中心 W: 画线On/OffP: 快速放置元件R: 元件旋转90°H: 元件 ...

  7. Mysql 函数定义及批量数据脚本

    零.说在前面 在定义函数之前 需要先将 log_bin_trust_function_creators 值设为开启,原因如下 在主从复制的两台Mysql服务器中,slaver会从master复制数据, ...

  8. 每日扫盲:eclipse快捷键 包括查找类、方法、变量汇总

    [Ct rl+T] 搜索当前接口的实现类 1. [ALT +/]    此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ ...

  9. Perl unless

    在perl的if控制结构中,只有当条件表达式为真时才执行某块代码.如果想让程序块在条件为假时才执行,此时可以把if改成unless 例如: unless ($fred =~ /^([A-Z_]\w*$ ...

  10. 如何创建redis集群

    1.下载redis源码包 wget http://download.redis.io/releases/redis-3.2.4.tar.gz 2.解压并安装 tar xvf redis-.tar.gz ...