- 浏览: 495786 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (502)
- Java (70)
- Linux (10)
- 数据库 (38)
- 网络 (10)
- WEB (13)
- JSP (4)
- 互联网 (71)
- JavaScript (30)
- Spring MVC (19)
- HTML (13)
- CSS (3)
- AngularJS (18)
- Redis (5)
- Bootstrap CSS (1)
- ZooKeeper (4)
- kafka (6)
- 服务器缓存 (4)
- Storm (1)
- MongoDB (9)
- Spring boot (16)
- log4j (2)
- maven (3)
- nginx (5)
- Tomcat (2)
- Eclipse (4)
- Swagger (2)
- Netty (5)
- Dubbo (1)
- Docker (7)
- Hadoop (12)
- OAuth (1)
- webSocket (4)
- 服务器性能 (7)
- Session共享 (1)
- tieye修改 (1)
- 工作 (1)
- 有用的语录 (0)
- https (2)
- common (5)
- 产品开发管理 (1)
- CDN 工作原理 (1)
- APNS、GCM (1)
- 架构图 (3)
- 功能实现分析 (1)
- JMX (1)
- 服务器相关操作命令 (1)
- img02 (0)
- 服务器环境搭建 (9)
- goodMenuBook (1)
- CEInstantPot (0)
- 有用数据 (1)
- 百度地图WEB API (2)
- 正则表达式 (1)
- 样式例子 (2)
- staticRecipePressureCooker.zip (1)
- jCanvas (1)
- 网站攻击方法原理 (1)
- 架构设计 (3)
- 物联网相关 (3)
- 研发管理 (7)
- 技术需求点 (1)
- 计划 (1)
- spring cloud (11)
- 服务器开发的一些实用工具和方法 (1)
- 每天学到的技术点 (4)
- Guava (1)
- ERP 技术注意要点 (2)
- 微信小程序 (1)
- FineRepor (1)
- 收藏夹 (1)
- temp (5)
- 服务架构 (4)
- 任职资格方案 (0)
- osno_test (1)
- jquery相关 (3)
- mybatis (4)
- ueditor (1)
- VueJS (7)
- python (10)
- Spring EL (1)
- shiro (1)
- 前端开发原理与使用 (7)
- YARN (1)
- Spark (1)
- Hbase (2)
- Pig (2)
- 机器学习 (30)
- matplotlib (1)
- OpenCV (17)
- Hystrix (1)
- 公司 (1)
- miniui (4)
- 前端功能实现 (3)
- 前端插件 (1)
- 钉钉开发 (2)
- Jenkins (1)
- elasticSearch使用 (2)
- 技术规范 (4)
- 技术实现原理 (0)
最新评论
//===============================================================
ES数据同步方案
1.同步双写
数据写到mysql时,同时将数据写到ES,实现数据的双写。
优点:业务逻辑简单。
缺点:硬编码,业务强耦合,性能较差,代码的侵入性太强
2.异步双写(MQ方式)(程序到MQ,MQ再到MYSQL和ES)
改为写MQ,不直接写ES
优点:性能高(由于MQ的性能基本比mysql高出一个数量级);不存在丢数据问题
缺点:硬编码,业务强耦合,代码的侵入性太强,延时
3.异步双写(Worker方式)(定时任务)
让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;逐条写入到ES中。
优点:不改变原来代码,没有侵入性、没有硬编码;没有业务强耦合;
缺点:时效性较差
4.Binlog 同步方式
利用mysql的binlog来进行同步
优点:没有代码侵入、没有硬编码;原有系统不需要任何变化,没有感知;性能高;业务解耦,不需要关注原来系统的业务逻辑。
缺点:构建Binlog系统复杂;也像方案二,存在MQ延时的风险
//===============================================================
MYSQL同步方式,主从复制、半同步复制和主主复制
MySQL数据库的复制需要启动三个线程来实现:
其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
————————————————
https://blog.csdn.net/weixin_35794185/article/details/113158779
异步复制
通常没说明指的都是异步,即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等等Binlog日志传送给从库,一旦主库宕机,有可能会丢失日志。
半同步复制
半同步启动需要主从两端都需要加载安装各自对应的semi模块
而半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延),以插件 semisync_master/semisync_slave 形式存在。
半同步复制是介于全同步复制和全异步复制之间的一种,主库只需要等待至少一个从库节点收到并Flush Binlog到Relay log文件即可,主库不需要等待所有从库给主库反馈。
全同步
全同步是指当主库接收到客户端的一个事务请求,所有的从库都执行了该事务才返回给客户端。
因为要等待所有从库执行完事务,主库才将结果返回给客户端,所以全同步复制的性能必然受到严重影响,即完成一个事务的时间被拉长,性能降低。
//===============================================================
redis主从复制原理
主从复制,直观的做法是主节点产生一份数据的快照发送给从节点,以快照数据为基准,将之后增量的数据变更同步给从节点,如此就能保证主从数据的一致。总体来看,主从复制一般包含全量数据同步、增量同步两个阶段。
全量数据同步:主节点产生一份全量数据的快照,即RDB文件,并将此快照发送给从节点。且从产生快照时刻起,记录新接收到的写命令。当快照发送完成后,将累积的写命令发送绐从节点,从节点执行这些写命令。此时基准已经建立完成。
命令传播:全量数据同步完成后,主节点将执行过的写命令源源不断地发送给从节点,从节点执行这些命令,保证主从节点中数据有相同的变更,如此保证主从节点数据的一致。
1、主从关系建立后,从节点向主节点发送一个 SYNC 命令请求进行主从同步。
2、主节点收到 SYNC 命令后,执行 fork 创建一个子进程,子进程将所有的数据编码存储到 RDB(Redis Database) 文件中,这就产生了数据库的快照。
3、主节点将此快照发送给从节点,从节点接收快照并载入。
4、主节点接着将生成快照、发送快照期间积压的命令发送给从节点。
5、此后,主节点源源不断地新执行的写命令同步到从节点,从节点执行传播来的命令,命令执行后,从库中的数据也就得到了更新。如此,主从数据保持一致。需要说明的是,命令传播存在时延的,所以任意时刻,不能保证主从节点间数据完全一致。
以上就是 Redis 主从复制的基本原理,很简单很容易理解,但存在一些不美好的地方:
fork 耗时过长,阻塞主进程
执行fork 时候,需要拷贝大量的内存页表,这是一个耗时较多的操作,尤其当内存使用量较大的时候。组内同学曾做过测试,内存占用 10GB 时,fork 需要消耗 100 多毫秒。fork 的时候主进程阻塞 100 多毫秒,这对 Redis 而言,实在太长了。另外,fork 之后,如果主库中有不少的写入,那么由于写时复制机制,会额外消耗不少的内存,还会增大响应时间。
如果主从间网络闪断怎么办
如果网络故障,连接断开,主节点无法继续传播信息至该从节点。之后网络恢复,从节点重新连接上主节点后,主节点不能再继续传播新接收到的信息了,因为从节点已经漏掉了一些命令。此时,从节点需要从来,再次执行全部的同步过程,
网络闪断是常发生的事情,闪断期间主节点中可能只写入了比较少的数据,但就因为这很少的一部分数据,需要让从节点进行一全量同步。这种做法是非常低效的,该如何解决这问题
Redis部分重同步
Redis 2.8 版本后,引入了部分同步。它在主节点中维护了一个复制积压缓冲区,命令一方面会传播到从节点,另外还会记录在这个缓冲区中。保持所有的命令是不必要的,Redis 中使用了一个环形的缓冲区,这样就可以只保留最近的一些命令了。
有了部分同步,网络闪断后就可以避免全量同步了。但是因为主节点只能保留最近的部分命令,保存多少取决于复制积压缓冲区的大小。如果从节点断开时间过长,或者断开期间主节点新执行的写命令足够多,漏掉的命令就无法全部保存到复制积压缓冲区中了。加大复制积压缓冲区可以尽可能多地避免全量同步,但这同时会造成额外的内存消耗。
部分同步消耗了部分内存来保存最近执行的写命令,避免闪断后的全同步,这是很直观、很容易想象的解决方案。这种方案很好,它是否还存在其他问题呢?考虑以下问题:
ES数据同步方案
1.同步双写
数据写到mysql时,同时将数据写到ES,实现数据的双写。
优点:业务逻辑简单。
缺点:硬编码,业务强耦合,性能较差,代码的侵入性太强
2.异步双写(MQ方式)(程序到MQ,MQ再到MYSQL和ES)
改为写MQ,不直接写ES
优点:性能高(由于MQ的性能基本比mysql高出一个数量级);不存在丢数据问题
缺点:硬编码,业务强耦合,代码的侵入性太强,延时
3.异步双写(Worker方式)(定时任务)
让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;逐条写入到ES中。
优点:不改变原来代码,没有侵入性、没有硬编码;没有业务强耦合;
缺点:时效性较差
4.Binlog 同步方式
利用mysql的binlog来进行同步
优点:没有代码侵入、没有硬编码;原有系统不需要任何变化,没有感知;性能高;业务解耦,不需要关注原来系统的业务逻辑。
缺点:构建Binlog系统复杂;也像方案二,存在MQ延时的风险
//===============================================================
MYSQL同步方式,主从复制、半同步复制和主主复制
MySQL数据库的复制需要启动三个线程来实现:
其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
————————————————
https://blog.csdn.net/weixin_35794185/article/details/113158779
异步复制
通常没说明指的都是异步,即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等等Binlog日志传送给从库,一旦主库宕机,有可能会丢失日志。
半同步复制
半同步启动需要主从两端都需要加载安装各自对应的semi模块
而半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延),以插件 semisync_master/semisync_slave 形式存在。
半同步复制是介于全同步复制和全异步复制之间的一种,主库只需要等待至少一个从库节点收到并Flush Binlog到Relay log文件即可,主库不需要等待所有从库给主库反馈。
全同步
全同步是指当主库接收到客户端的一个事务请求,所有的从库都执行了该事务才返回给客户端。
因为要等待所有从库执行完事务,主库才将结果返回给客户端,所以全同步复制的性能必然受到严重影响,即完成一个事务的时间被拉长,性能降低。
//===============================================================
redis主从复制原理
主从复制,直观的做法是主节点产生一份数据的快照发送给从节点,以快照数据为基准,将之后增量的数据变更同步给从节点,如此就能保证主从数据的一致。总体来看,主从复制一般包含全量数据同步、增量同步两个阶段。
全量数据同步:主节点产生一份全量数据的快照,即RDB文件,并将此快照发送给从节点。且从产生快照时刻起,记录新接收到的写命令。当快照发送完成后,将累积的写命令发送绐从节点,从节点执行这些写命令。此时基准已经建立完成。
命令传播:全量数据同步完成后,主节点将执行过的写命令源源不断地发送给从节点,从节点执行这些命令,保证主从节点中数据有相同的变更,如此保证主从节点数据的一致。
1、主从关系建立后,从节点向主节点发送一个 SYNC 命令请求进行主从同步。
2、主节点收到 SYNC 命令后,执行 fork 创建一个子进程,子进程将所有的数据编码存储到 RDB(Redis Database) 文件中,这就产生了数据库的快照。
3、主节点将此快照发送给从节点,从节点接收快照并载入。
4、主节点接着将生成快照、发送快照期间积压的命令发送给从节点。
5、此后,主节点源源不断地新执行的写命令同步到从节点,从节点执行传播来的命令,命令执行后,从库中的数据也就得到了更新。如此,主从数据保持一致。需要说明的是,命令传播存在时延的,所以任意时刻,不能保证主从节点间数据完全一致。
以上就是 Redis 主从复制的基本原理,很简单很容易理解,但存在一些不美好的地方:
fork 耗时过长,阻塞主进程
执行fork 时候,需要拷贝大量的内存页表,这是一个耗时较多的操作,尤其当内存使用量较大的时候。组内同学曾做过测试,内存占用 10GB 时,fork 需要消耗 100 多毫秒。fork 的时候主进程阻塞 100 多毫秒,这对 Redis 而言,实在太长了。另外,fork 之后,如果主库中有不少的写入,那么由于写时复制机制,会额外消耗不少的内存,还会增大响应时间。
如果主从间网络闪断怎么办
如果网络故障,连接断开,主节点无法继续传播信息至该从节点。之后网络恢复,从节点重新连接上主节点后,主节点不能再继续传播新接收到的信息了,因为从节点已经漏掉了一些命令。此时,从节点需要从来,再次执行全部的同步过程,
网络闪断是常发生的事情,闪断期间主节点中可能只写入了比较少的数据,但就因为这很少的一部分数据,需要让从节点进行一全量同步。这种做法是非常低效的,该如何解决这问题
Redis部分重同步
Redis 2.8 版本后,引入了部分同步。它在主节点中维护了一个复制积压缓冲区,命令一方面会传播到从节点,另外还会记录在这个缓冲区中。保持所有的命令是不必要的,Redis 中使用了一个环形的缓冲区,这样就可以只保留最近的一些命令了。
有了部分同步,网络闪断后就可以避免全量同步了。但是因为主节点只能保留最近的部分命令,保存多少取决于复制积压缓冲区的大小。如果从节点断开时间过长,或者断开期间主节点新执行的写命令足够多,漏掉的命令就无法全部保存到复制积压缓冲区中了。加大复制积压缓冲区可以尽可能多地避免全量同步,但这同时会造成额外的内存消耗。
部分同步消耗了部分内存来保存最近执行的写命令,避免闪断后的全同步,这是很直观、很容易想象的解决方案。这种方案很好,它是否还存在其他问题呢?考虑以下问题:
发表评论
-
SQL常用语句
2022-07-21 19:09 210delete from cacherefresh where ... -
elasticSearch使用
2022-04-27 08:42 415ElasticSearch 基于Apache Lucene构建 ... -
SQL存储过程例子和有用的SQL
2022-02-19 09:20 198delete from cacherefresh where ... -
SQL优化对比与总结
2021-01-09 14:44 37819000000 b表 SELECT * from b w ... -
执行存储过程测试
2020-12-30 16:47 385--执行存储过程创建 if (exists (select * ... -
mysql提高insert into 插入速度的方法
2018-12-14 17:26 6110mysql提高insert into 插入 ... -
Mysql并发时经典常见的死锁原因及解决方法
2018-12-08 09:30 3063Mysql并发时经典常见的死锁原因及解决方法 MySQL有 ... -
数据库沉余实现方式
2018-12-04 17:30 1021数据库沉余实现方式 canal 原理相对比较简单: (1)c ... -
最终一致性的常用做法
2018-12-01 22:28 641最终一致性的常用做法 ... -
库存扣减和锁
2018-11-29 16:19 2库存扣减和锁 在对数据库的值进行修改时,如果在多线程情况下 ... -
Spring Boot中整合Sharding-JDBC
2018-11-26 18:03 3447Spring Boot中整合Sharding-JDBC ... -
MYSQL 主从、读写分离、分库分表、高可用、数据安全
2018-11-19 18:03 1736MYSQL 主从、读写分离、分库分表、高可用、数据安全 ... -
mybatis-generator 使用
2018-05-19 11:29 562http://www.cnblogs.com/Jason-Xi ... -
eclipse JPA Tools 使用
2018-05-14 17:11 777https://blog.csdn.net/guoxin91/ ... -
mybatis 通用查询实现
2018-03-26 10:04 1425package com.oceano.modity.entit ... -
存储过程 函数
2017-10-27 17:59 475存储过程 函数 存储过 ... -
分页查询例子
2017-10-19 10:22 780分页查询例子 Mybatis分页插件PageHelper的 ... -
数据库同步工具
2017-10-14 14:27 1342数据库同步工具 goden gate Oracle Go ... -
ETL工具
2017-09-01 15:14 761ETL工具 ETL,是英文 Extract-Transfor ... -
PowerDesigner 对比pdm文件内容变化工具
2017-08-06 14:24 704PowerDesigner 对比pdm文件内容变化工具
相关推荐
Apache SeaTunnel 是一个高性能的大数据集成工具,它提供了灵活、易用且易扩展的数据同步方案,能够处理千亿级别的数据集成问题。在本次线上 meetup 中,专家梁恩同分享了如何使用 SeaTunnel 实现从 MySQL 数据库到 ...
MySQL到Elasticsearch的实时数据同步是大数据领域中常见的需求,尤其在日志分析、监控系统、全文检索等场景下,这种同步能确保数据的实时性。本方案利用阿里巴巴开源的Canal工具,实现了MySQL数据库与Elasticsearch...
某天BI团队期望对数据库做全文索引,于是我们同时要写多一份数据到ES中,改造后一段时间,又有需求需要写入到Redis缓存中。很明显这种模式是不可持续发展的,这种双写到各个数据存储系统中可能导致不可维护和扩展,...
在当今大数据时代,实时数据同步成为许多企业和组织的关键需求,特别是从关系型数据库如 MySQL 到分布式搜索引擎如 ElasticSearch(ES)的实时同步。本文将详细介绍如何利用灵蜂数据集成软件 BeeDI 实现这一目标。 ...
综上所述,这个项目旨在搭建一个高效的数据同步方案,利用Logstash在SQL Server和ElasticSearch之间建立桥梁,同时通过.NET平台的异步查询优化,确保数据流动的高效和稳定。通过对各个目录和文件的理解,我们可以更...
5. **安装elasticsearch-hadoop库**:为了实现Hive与Elasticsearch之间的数据互通,需要安装elasticsearch-hadoop库。可以使用Maven或直接将jar包放置在合适的位置。 #### Hive端操作 接下来介绍如何在Hive端创建...
将MySQL中的数据同步到Elasticsearch,可以实现更高效的数据检索和分析。"Python-同步mysql数据到elasticsearch的工具"正是为了实现这一目的,它提供了便捷的解决方案。 该工具主要基于Python编程语言开发,利用...
MySQL与Elasticsearch实时同步方案 - ...该项目为用户提供了一个基于Canal的MySQL与Elasticsearch实时同步方案,支持增量同步和全量同步,通过界面交互和功能模块,为用户提供了一个高效、易用的实时数据同步解决方案。
总的来说,这个小程序的目标是构建一个高效的、实时的、增量的数据同步解决方案,连接MongoDB和Elasticsearch。开发者需要具备JavaScript编程基础,熟悉MongoDB和Elasticsearch的API,理解数据同步和增量更新的原理...
"mysql数据同步到elasticsearch 实时同步"这部分涉及到数据的实时迁移和同步。MySQL是一种广泛使用的开源关系型数据库,而Elasticsearch则是一个高性能、分布式、全文搜索引擎,常用于大数据分析和实时搜索场景。将...
总的来说,`go-mysql-elasticsearch` 是一个强大的数据同步工具,它结合了 Go 语言的性能优势和 MySQL 与 Elasticsearch 的数据处理能力,为需要实时数据同步的项目提供了有效支持。通过深入了解和使用这个工具,你...
金融行业跨中心异构数据同步方案设计 金融行业跨中心异构数据同步方案设计是指在金融行业中,针对异构数据源之间的数据同步问题,设计了一种可靠、安全、高效的数据同步方案。该方案使用 Moray 数据同步组件,实现...
总的来说,利用HBase的协作器机制,我们可以实现高效的数据同步,将HBase的强大存储能力与Elasticsearch的优秀搜索性能相结合。这个过程涉及到对HBase和Elasticsearch的深入理解,以及对Coprocessor编程的掌握。通过...
该工具是基于Java语言的hbase与elasticsearch数据同步解决方案,包含53个文件,涵盖29个Java源文件、5个批处理文件、5个shell脚本、5个XML配置文件、2个属性文件及其他辅助文件。它支持多种数据源和目标的数据采集与...
**canal支持自动同步到Elasticsearch。 基于 *canal* 的 *Mysql* 与 *Elasticsearch* 实时同步的 *javaweb* 服务。 canal是阿里巴巴mysql数据库binlog的增量订阅&消费组件。 ## 工作原理 ### 全量 暴露Http接口 >...
在Elasticsearch+MySQL的数据同步示例中,将MySQL数据库中的数据同步到Elasticsearch中,这样做可以让用户通过Elasticsearch进行复杂的全文搜索。 4. Logstash介绍 Logstash是一个用于搜集、处理和转发日志的工具...
对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的...
《Kafka数据同步至Elasticsearch的深度解析》 在大数据处理领域,Kafka和Elasticsearch都是不可或缺的重要组件。Kafka作为一个强大的分布式流处理平台,主要用于实时数据管道和流处理,而Elasticsearch则是一个功能...