IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mysql数据同步ES -> 正文阅读

[大数据]Mysql数据同步ES

一、前言

随着业务发展,数据量的增长,对数据全文检索或模糊查询显得普遍而重要。

这个时候Mysql就无法应对海量数据下各种复杂条件的查询。有人说加索引,加索引确实可以提升查询速度,但是索引也是成本,MySQL 中加多个索引最终在执行 SQL 的时候它只会选择成本最低的那个索引,如果没有索引满足搜索条件,就会触发全表扫描,出现慢sql等性能低下,而有些场景是加索引也解决不了的。

这样的话,我们可以借助搜索引擎,将数据发送到搜索引擎(如ES)上,由搜索引擎来提供专业的服务。而ES是搜索引擎中佼佼者,选用ES无疑是mysql的一个有效补充。

二、ES数据同步方案

1、方案一:应用程序双写

在这里插入图片描述

1)(同步双写,代码侵入性比较高)

这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES,实现数据的双写。

  • 优点:
    • 1)业务逻辑简单。
  • 缺点:
    • 1)硬编码:有需要写入mysql的地方都需要添加写入ES的代码;业务强耦合;
    • 2)存在双写失败丢数据风险;ES系统不可用;应用系统和ES之间的网络故障;应用系统重启,导致系统来不及写入ES等;
    • 3)性能较差:本来mysql的性能就不是很高,再加写一个ES,有数据强一致性要求的,就必须双写放到事物中来处理,系统的性能必然会下降。

2)(异步双写,MQ方式)

针对第一种同步双写的性能和数据丢失问题,可以考虑引入MQ中间件:

  • 优点:
    • 1)性能高,MQ的性能基本比mysql高出一个数量级;解决数据一致性问题;
    • 2)把同步变为异步,做了部分解耦
  • 缺点:
    • 1)会增加延迟性,由于MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到,造成延时;
    • 2)硬编码问题:依然存在业务强耦合,业务系统增加mq代码;
    • 3)复杂度增加:多一个MQ中间件要维护

3)(异步双写,定时任务方式)

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

如果对实时性要求不高的情况下,可以考虑用定时器来处理,在 MySQL 的表结构里设置特殊的字段,增加一个字段为timestamp的字段,如 updated_at(数据的更新时间),任何crud操作都会导致该字段的时间发生变化。起一个定时任务,在用户低峰的时候,执行定时任务,去查询实际变更的数据,从而实现数据的增量更新到es中。这种方式可以使用开源的 Logstash 去完成。当然缺点也很明显,就是无法同步数据的物理删除操作。

优点:

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

缺点:

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

2、方案二:基于Binlog 同步(业界比较成熟的方案)

上面三种方案要么有代码侵入,要么有硬编码,要么有时延,所以通常我们利用mysql的binlog方式来进行同步。

1) 限制条件:

(1)mysql binlog必须是ROW模式;

MySQL 的 binlog 三种格式:
?ROW 模式,binlog 按行的方式去记录数据的变更;
?statement 模式,binlog 记录的是 SQL 语句;
?mixed 模式时,混合以上两种,记录的可能是 SQL 语句或者 ROW 模式的每行变更;

show variables like 'log_bin'; 查看binlog开启状态。
show variables like 'binlog-format'; 查看binlog格式。

(2)要同步的mysql数据表必须包含主键,否则直接忽略,这是因为如果数据表没有主键,UPDATE和DELETE操作就会因为在ES中找不到对应的document而无法进行同步
(3)不支持程序运行过程中修改表结构
(4)要赋予用于连接mysql的账户RELOAD权限以及REPLICATION权限, SUPER权限:
GRANT REPLICATION SLAVE ON . TO ‘elastic’@‘172.16.32.44’;
GRANT RELOAD ON . TO ‘elastic’@‘172.16.32.44’;
UPDATE mysql.user SET Super_Priv=‘Y’ WHERE user=‘elastic’ AND host=‘172.16.32.44’;

2) 具体步骤如下:

1) 读取mysql的binlog日志,获取指定表的日志信息;
2) 将读取的信息转为MQ;
3) 编写一个MQ消费程序;
4) 不断消费MQ,每消费完一条消息,将消息写入到ES中。

3)优缺点

优点:

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

缺点:

  • 构建Binlog系统复杂;
  • 存在MQ延时的风险

binglog其他详细解释参考博文:https://blog.csdn.net/weixin_47061482/article/details/115163442

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:45:16  更:2021-12-09 11:47:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:50:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码