做网站生意旁,学做投资网站,医院网站建设技术方案ppt,首钢建设工资网站一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id#xff0c;通过ES查询获取查询商品的列表中展示的数据#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的#xff1b; 为什么ES一般…一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id通过ES查询获取查询商品的列表中展示的数据通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的 为什么ES一般不存储所有表的数据因为数据表的所有字段列并不一定参与业务查询如果将业务表中超多列的字段全部存储在ES中反而影响ES的查询性能。 在实际使用中ES中一般存储全文检索列或者列表展示列字段和id。通过id去数据库hash散列分库分表查询大数据列是比较快的 通过点击商品详情获取商品详情id通过点击id去数据库查询获取所有数据的数据id在数据库根据分库分表策略去查询查询是很快的
一般情况下使用mysql这种关系型数据库去为所有的Nosql类型redis、mogodb、es、clickhos的数据库进行兜底数据因为关系型数据库支持事务对保持数据的一致性有比较好的支持。但是查询效率在大数据量的时候比较低。而非关系型数据库在查询效率比较高对数据的事务比较低对数据的一致性支持比较差。所以使用mysql作为其他nosql类型的数据的兜底支持
二、mysql和ES的数据同步 **在实际项目开发中我们经常将 MySQL 作为业务数据库ES 作为查询数据库用来实现读写分离缓解 MySQL 数据库的查询压力应对海量数据的复杂查询。**这其中有一个很重要的问题就是如何实现 MySQL 数据库和 ES 的数据同步今天和大家聊聊 MySQL 和 ES 数据同步的各种方案。
我们先看看下面 4 种常用的数据同步方案。
2.1 同步双写
这是一种最为简单的方式在将数据写到 MySQL 时同时将数据写到 ES。 优点
业务逻辑简单实时性高。
缺点
硬编码有需要写入 MySQL 的地方都需要添加写入 ES 的代码业务强耦合存在双写失败丢数据风险性能较差本来 MySQL 的性能不是很高再加一个 ES系统的性能必然会下降。
2.2 异步双写
针对多数据源写入的场景可以借助 MQ 实现异步的多源写入。 优点
性能高不易出现数据丢失问题主要基于 MQ 消息的消费保障机制比如 ES 宕机或者写入失败还能重新消费 MQ 消息多源写入之间相互隔离便于扩展更多的数据源写入。
缺点
硬编码问题接入新的数据源需要实现新的消费者代码系统复杂度增加引入了消息中间件MQ是异步消费模型用户写入的数据不一定可以马上看到造成延时。
2.3 基于 SQL 抽取
上面两种方案中都存在硬编码问题代码的侵入性太强如果对实时性要求不高的情况下可以考虑用定时器来处理 数据库的相关表中增加一个字段为 timestamp 的字段任何 CURD 操作都会导致该字段的时间发生变化 原来程序中的 CURD 操作不做任何变化 增加一个定时器程序让该程序按一定的时间周期扫描指定的表把该时间段内发生变化的数据提取出来 逐条写入到 ES 中。 优点 不改变原来代码没有侵入性、没有硬编码 没有业务强耦合不改变原来程序的性能 Worker 代码编写简单不需要考虑增删改查。
缺点
时效性较差由于是采用定时器根据固定频率查询表来同步数据尽管将同步周期设置到秒级也还是会存在一定时间的延迟对数据库有一定的轮询压力一种改进方法是将轮询放到压力不大的从库上。经典方案借助 Logstash 实现数据同步其底层实现原理就是根据配置定期使用 SQL 查询新增的数据写入 ES 中实现数据的增量同步。
2.4 基于 Binlog 实时同步
上面三种方案要么有代码侵入要么有硬编码要么有延迟那么有没有一种方案既能保证数据同步的实时性又没有代入侵入呢 当然有可以利用 MySQL 的 Binlog 来进行同步。
具体步骤如下
读取 MySQL 的 Binlog 日志获取指定表的日志信息将读取的信息转为 MQ编写一个 MQ 消费程序不断消费 MQ每消费完一条消息将消息写入到 ES 中。
优点
没有代码侵入、没有硬编码原有系统不需要任何变化没有感知性能高业务解耦不需要关注原来系统的业务逻辑。
缺点
构建 Binlog 系统复杂如果采用 MQ 消费解析的 Binlog 信息也会像方案二一样存在 MQ 延时的风险。
三 、数据迁移工具选型
对于上面 4 种数据同步方案“基于 Binlog 实时同步”方案是目前最常用的也诞生了很多优秀的数据迁移工具这里主要对这些迁移工具进行介绍。
这些数据迁移工具很多都是基于 Binlog 订阅的方式实现模拟一个 MySQL Slave 订阅 Binlog 日志从而实现 CDCChange Data Capture将已提交的更改发送到下游包括 INSERT、DELETE、UPDATE。
至于如何伪装大家需要先了解 MySQL 的主从复制原理需要学习这块知识的同学可以看我之前写的高并发教程里面有详细讲解。
3.1 Cannel
基于数据库增量日志解析提供增量数据订阅消费目前主要支持 MySQL。
Canal 原理就是伪装成 MySQL 的从节点从而订阅 master 节点的 Binlog 日志主要流程为
Canal 服务端向 MySQL 的 master 节点传输 dump 协议MySQL 的 master 节点接收到 dump 请求后推送 Binlog 日志给 Canal 服务端解析 - Binlog 对象原始为 byte 流转成 Json 格式Canal 客户端通过 TCP 协议或 MQ 形式监听 Canal 服务端同步数据到 ES。 下面是 Cannel 执行的核心流程其中 Binlog Parser 主要负责 Binlog 的提取、解析和推送EventSink 负责数据的过滤 、路由和加工仅作了解即可。 3.2 阿里云 DTS
数据传输服务 DTSData Transmission Service支持 RDBMS、NoSQL、OLAP 等多种数据源之间的数据传输。
它提供了数据迁移、实时数据订阅及数据实时同步等多种数据传输方式。相对于第三方数据流工具DTS 提供丰富多样、高性能、高安全可靠的传输链路同时它提供了诸多便利功能极大方便了传输链路的创建及管理。
特点
多数据源支持 RDBMS、NoSQL、OLAP 等多种数据源间的数据传输多传输方式支持多种传输方式包括数据迁移、实时数据订阅及数据实时同步高性能底层采用了多种性能优化措施全量数据迁移高峰期时性能可以达到70MB/s20万的TPS使用高规格服务器来保证每条迁移或同步链路都能拥有良好的传输性能高可用底层为服务集群如果集群内任何一个节点宕机或发生故障控制中心都能够将这个节点上的所有任务快速切换到其他节点上链路稳定性高简单易用提供可视化管理界面提供向导式的链路创建流程用户可以在其控制台简单轻松地创建传输链路 需要付费。
再看看 DTS 的系统架构。
高可用数据传输服务内部每个模块都有主备架构保证系统高可用。容灾系统实时检测每个节点的健康状况一旦发现某个节点异常会将链路快速切换到其他节点。
数据源地址动态适配对于数据订阅及同步链路容灾系统还会监测数据源的连接地址切换等变更操作一旦发现数据源发生连接地址变更它会动态适配数据源新的连接方式在数据源变更的情况下保证链路的稳定性。
更多内容请查看阿里官方文档https://help.aliyun.com/product/26590.html
3.3 Databus
Databus 是一个低延迟、可靠的、支持事务的、保持一致性的数据变更抓取系统。由 LinkedIn 于 2013 年开源。
Databus 通过挖掘数据库日志的方式将数据库变更实时、可靠的从数据库拉取出来业务可以通过定制化 client 实时获取变更并进行其他业务逻辑。
特点 多数据源Databus 支持多种数据来源的变更抓取包括 Oracle 和 MySQL。 可扩展、高度可用Databus 能扩展到支持数千消费者和事务数据来源同时保持高度可用性。 事务按序提交Databus 能保持来源数据库中的事务完整性并按照事务分组和来源的提交顺寻交付变更事件。 低延迟、支持多种订阅机制数据源变更完成后Databus 能在毫秒级内将事务提交给消费者。同时消费者使用D atabus 中的服务器端过滤功能可以只获取自己需要的特定数据。 无限回溯对消费者支持无限回溯能力例如当消费者需要产生数据的完整拷贝时它不会对数据库产生任何额外负担。当消费者的数据大大落后于来源数据库时也可以使用该功能。
再看看 Databus 的系统架构。
Databus 由 Relays、bootstrap 服务和 Client lib 等组成Bootstrap 服务中包括 Bootstrap Producer 和 Bootstrap Server。 快速变化的消费者直接从 Relay 中取事件
如果一个消费者的数据更新大幅落后它要的数据就不在 Relay 的日志中而是需要请求 Bootstrap 服务返回的将会是自消费者上次处理变更之后的所有数据变更快照。
开源地址https://github.com/linkedin/databus
3.4 其它
Flink
有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。 官网地址https://flink.apache.orgCloudCanal 数据同步迁移系统商业产品。 官网地址https://www.clougence.com/?utm_sourcewwekMaxwell 使用简单直接将数据变更输出为json字符串不需要再编写客户端。 官网地址http://maxwells-daemon.ioDRD 阿里巴巴集团自主研发的分布式数据库中间件产品专注于解决单机关系型数据库扩展性问题具备轻量(无状态)、灵活、稳定、高效等特性。 官方地址https://www.aliyun.com/product/drdsyugong 帮助用户完成从 Oracle 数据迁移到 MySQL。访问地址https://github.com/alibaba/yugong