精华内容
下载资源
问答
  • MySQL同步原理

    2021-02-07 16:10:10
    异步与全同步 首先我们需要知道,在主从复制的过程中,MySQL 默认是异步复制的。也就是说, 对于主节点来说,写入 binlog,事务结束,就返回给客户端了。对于 slave 来说,接收 到 binlog,就完事儿了,master 不...

    a1ab6be91978

    image.png

    主从复制是怎么实现的呢?更新语句会记录 binlog,它是一种逻辑日志。

    有了这个 binlog,从服务器会获取主服务器的 binlog 文件,然后解析里面的 SQL 语句,在从服务器上面执行一遍,保持主从的数据一致。

    这里面涉及到三个线程,连接到 master 获取 binlog,并且解析 binlog 写入中继日 志,这个线程叫做 I/O 线程。

    Master 节点上有一个 log dump 线程,是用来发送 binlog 给 slave 的。

    从库的 SQL 线程,是用来读取 relay log,把数据写入到数据库的。

    做了主从复制的方案之后,我们只把数据写入 master 节点,而读的请求可以分担到 slave 节点。我们把这种方案叫做读写分离。

    a1ab6be91978

    image.png

    读写分离可以一定程度低减轻数据库服务器的访问压力,但是需要特别注意主从数 据一致性的问题。如果我们在 master 写入了,马上到 slave 查询,而这个时候 slave 的 数据还没有同步过来,怎么办? 所以,基于主从复制的原理,我们需要弄明白,主从复制到底慢在哪里?

    单线程

    在早期的 MySQL 中,slave 的 SQL 线程是单线程。master 可以支持 SQL 语句的并 行执行,配置了多少的最大连接数就是最多同时多少个 SQL 并行执行。

    而 slave 的 SQL 却只能单线程排队执行,在主库并发量很大的情况下,同步数据肯 定会出现延迟

    为什么从库上的 SQL Thread 不能并行执行呢?举个例子,主库执行了多条 SQL 语 句,首先用户发表了一条评论,然后修改了内容,最后把这条评论删除了。这三条语句 在从库上的执行顺序肯定是不能颠倒的

    insert into user_comments (10000009,'nice');

    update user_comments set content ='very good' where id =10000009;

    delete from user_comments where id =10000009;

    怎么解决这个问题呢?怎么减少主从复制的延迟?

    异步与全同步

    首先我们需要知道,在主从复制的过程中,MySQL 默认是异步复制的。也就是说, 对于主节点来说,写入 binlog,事务结束,就返回给客户端了。对于 slave 来说,接收 到 binlog,就完事儿了,master 不关心 slave 的数据有没有写入成功。

    a1ab6be91978

    image.png

    如果要减少延迟,是不是可以等待全部从库的事务执行完毕,才返回给客户端呢? 这样的方式叫做全同步复制。从库写完数据,主库才返会给客户端。

    这种方式虽然可以保证在读之前,数据已经同步成功了,但是带来的副作用大家应 该能想到,事务执行的时间会变长,它会导致 master 节点性能下降。

    有没有更好的办法呢?既减少 slave 写入的延迟,又不会明显增加 master 返回给客 户端的时间?

    半同步复制

    介于异步复制和全同步复制之间,还有一种半同步复制的方式。

    主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库 接收到 binlog 并写到 relay log 中才返回给客户端。master 不会等待很长的时间,但是 返回给客户端的时候,数据就即将写入成功了,因为它只剩最后一步了:就是读取 relay log,写入从库。

    a1ab6be91978

    image.png

    如果我们要在数据库里面用半同步复制,必须安装一个插件,这个是谷歌的一位工 程师贡献的。这个插件在 mysql 的插件目录下已经有提供:

    cd /usr/lib64/mysql/plugin/

    主库和从库是不同的插件,安装之后需要启用:

    -- 主库执行

    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

    set global rpl_semi_sync_master_enabled=1;

    show variables like '%semi_sync%';

    -- 从库执行

    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

    set global rpl_semi_sync_slave_enabled=1;

    show global variables like '%semi%';

    相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延 迟,它需要等待一个 slave 写入中继日志,这里多了一个网络交互的过程,所以,半同步 复制最好在低延时的网络中使用。

    这个是从主库和从库连接的角度,来保证 slave 数据的写入。

    另一个思路,如果要减少主从同步的延迟,减少 SQL 执行造成的等待的时间,那有 没有办法在从库上,让多个 SQL 语句可以并行执行,而不是排队执行呢?

    多库并行复制

    怎么实现并行复制呢?设想一下,如果 3 条语句是在三个数据库执行,操作各自的 数据库,是不是肯定不会产生并发的问题呢?执行的顺序也没有要求。当然是,所以如 果是操作三个数据库,这三个数据库的从库的 SQL 线程可以并发执行。这是 MySQL 5.6 版本里面支持的多库并行复制。

    a1ab6be91978

    image.png

    但是在大部分的情况下,我们都是单库多表的情况,在一个数据库里面怎么实现并 行复制呢?或者说,我们知道,数据库本身就是支持多个事务同时操作的;为什么这些 事务在主库上面可以并行执行,却不会出现问题呢?

    因为他们本身就是互相不干扰的,比如这些事务是操作不同的表,或者操作不同的 行,不存在资源的竞争和数据的干扰。那在主库上并行执行的事务,在从库上肯定也是 可以并行执行,是不是?比如在 master 上有三个事务同时分别操作三张表,这三个事务 是不是在 slave 上面也可以并行执行呢?

    5 异步复制之 GTID 复制

    https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html

    所以,我们可以把那些在主库上并行执行的事务,分为一个组,并且给他们编号, 这一个组的事务在从库上面也可以并行执行。这个编号,我们把它叫做 GTID(Global Transaction Identifiers),这种主从复制的方式,我们把它叫做基于 GTID 的复制。

    a1ab6be91978

    image.png

    如果我们要使用 GTID 复制,我们可以通过修改配置参数打开它,默认是关闭的:

    show global variables like 'gtid_mode';

    无论是优化 master 和 slave 的连接方式,还是让从库可以并行执行 SQL,都是从数 据库的层面去解决主从复制延迟的问题。

    ——学自咕泡学院

    展开全文
  • 如何正确设置MySQL同步?今天给大家系统介绍mysql同步的设置,在实际的应用中体会设置mysql同步的操作。我们今天主要向大家描述的是正确设置MySQL同步(replication)的实际操作步骤,下面就是文章的主要内容的描述。...

    如何正确设置MySQL同步?今天给大家系统介绍mysql同步的设置,在实际的应用中体会设置mysql同步的操作。

    0b0522af888485bb90b19e9de89b0a8f.png

    我们今天主要向大家描述的是正确设置MySQL同步(replication)的实际操作步骤,下面就是文章的主要内容的描述。

    此文章主要向大家描述的是设置MySQL同步(replication)的实际操作流程,其中包括准备服务器,设置同步服务器,如果你对其实际操作步骤有兴趣了解的话,你就可以通过以下的文章对其有个更好的了解。

    MySQL提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。本文描述了常见的同步设置方法。

    一、准备服务器

    由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。

    本文中,我们假设主服务器(以下简称Master)和从服务器(以下简称Slave)的版本都是5.0.15,操作系统是LinuxUbuntu5.0.x。

    假设同步Master的主机名为:rep1,Slave主机名为:rep2,2个MySQL的basedir目录都是/usr/local/MySQL,datadir都是:/usr/local/MySQL/data。

    二、设置同步服务器

    1、设置同步Master

    每个同步服务器都必须设定一个唯一的编号,否则同步就不能正常运行了。接下来开始修改my.cnf,增加以下几行:

    b97debf9bf34ae2124d476c1ee6c10b8.png

    然后在Master上增加一个账号专门用于同步,如下:

    8a41825cfb097206a0b1a7e1c973fd3e.png

    如果想要在Slave上有权限执行"LOADTABLEFROMMASTER"或"LOADDATAFROMMASTER"语句的话,必须授予全局的FILE和SELECT权限:

    8d22e30b50dbd8f1654988bae9331830.png

    第三行表示不记录数据库MySQL的更新日志,这就避免了Master上的权限设置MySQL同步等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。

    接下来备份Master上的数据,首先执行如下SQL语句:

    052880acfd2f1d7116562d8cbb2e289f.png

    不要退出这个终端,否则这个锁就不生效了;接着导出数据,可以直接打包压缩数据文件,也可以使用MySQLdump工具来做,推荐前者的方法,这样更为快捷简便。

    root$cd/usr/local/MySQLroot$tarzcfdata.tar.gz./data(在这里也可能是"var"等其它实际存放数据文件的目录,根据实情而定)然后将这些数据拷贝到Slave服务器上,解开,设置好正确的权限及属主等;之后,执行"UNLOCKTABLES"语句来释放锁。

    2、设置Slave

    修改my.cnf,增加如下几行:

    server-id=2master-host=rep1#主服务器名master-user=rep#同步账户名,默认是testmaster-password=rep#同步帐户密码,默认是空master-port=3306#主服务器的TCP/IP端口号,默认是3306set-variable=replicate-ignore-db=MySQL#略过同步的数据库名,如果有多个,请设置MySQL同步多次set-variable=replicate-do-db=yejr#想要同步的数据库名,如果有多个,请设置多次接下来在Slave上检验一下是否能正确连接到Master上,并且具备相应的权限。

    96c4efd724d2121c5eb3e0c5395ef61c.png

    现在,可以启动Slave了。启动成功后,登录Slave,查看一下同步状态:

    4b681eae6629d90f13491927e4b32d86.png

    可以看到,Slave_IO_Running和Slave_SQL_Running两列的值都为"Yes",这表明Slave的I/O和SQL线程都在正常运行。

    至此,同步设定成功。

    以上就是设置mysql同步的操作步骤,有了mysql的同步可以帮助我们在实际的运用中减少不必要的工作。

    展开全文
  • mysql同步异常

    2021-01-27 03:41:06
    收到报警,数据库同步延迟登上mysql服务器,查看进程,发现同步的state一直是“Reading event from the relay log” 而正常情况下,同步是很快的,状态应该是 想着主库可能是有写入,尚未同步完,等一下可能就正常了...

    收到报警,数据库同步延迟

    登上mysql服务器,查看进程,发现同步的state一直是“Reading event from the relay log”

    6b83d0b40d50066f019b8eefdab7fdd3.png

    而正常情况下,同步是很快的,状态应该是

    1fd453ab4ead2406f5a353f0d07ef5a9.png

    想着主库可能是有写入,尚未同步完,等一下可能就正常了,然而,过了两三分钟也没好转,而且延迟时长越来越大了,查看是否有lock的进程

    SELECT * FROM information_schema.INNODB_TRX;

    da66d03a64a426f50256338a333c0131.png

    在看这个对应的mysql进程号,正是同步的进程 trx_mysql-thread_id 的值就是show processlist中的id(我这里截的其他MySQL的图,故障的忘记截图了)

    看这个事务开始好久了,现在还没结束,赶紧查看主库日志。根据报警时间查看

    mysqlbinlog  --no-defaults -v -v --base64-output=DECODE-ROWS --start-datetime="2020-04-16 15:11:21" --stop-datetime="2020-04-16 15:11:22" /xx/lib/mysql/mysql-bin.xx

    一看日志,这个时间点,一直对某一个表进行插入和更新操作,明白了,是大批量写入造成的,在看这个表,今天新加的,问同事,说是插入了20万数据,

    好吧。。。赶紧找办法解决。再看这个表,主键索引什么都没有。。。再问问这个表干啥的,说暂时没啥用,那就行,知道数据库同步可以单独跳过一些表

    所以,赶紧在从数据库配置上加上

    replicate-ignore-table = db.table1

    然后重启,ok,一切归于平静,松了一口气~

    tip:操作线上数据一定要谨慎,而且不要在业务高峰期操作

    文章来源: www.oschina.net,作者:低调的糊涂虫,版权归原作者所有,如需转载,请联系作者。

    原文链接:https://my.oschina.net/ye39zi/blog/3236852

    展开全文
  • mysql作为最流行的关系型数据库之一,它的强项可能并不是速度,并行复制能力也并不强,所以如果你要重度依赖mysql,那么必须意识到同步延迟可能是常态。那么如何尽量去避免呢?1:应用解决方案在开发中,...

    2bde2e76d925020a87b00be292dd9977.png

    本文转载自微信公众号「虞大胆的叽叽喳喳」,作者虞大胆 。转载本文请联系虞大胆的叽叽喳喳公众号。

    在mysql应用中,最让人揪心的就是同步延迟问题,原因是多方面的,但带来的负面影响非常大,甚至都无法解释。

    mysql作为最流行的关系型数据库之一,它的强项可能并不是速度,并行复制能力也并不强,所以如果你要重度依赖mysql,那么必须意识到同步延迟可能是常态。

    那么如何尽量去避免呢?

    1:应用解决方案

    在开发中,假设延迟是存在的,对于核心业务必须要严谨,比如说文章队列,如果获取不到从库文章信息,是不是再一次投递队列,或者从主库查询,尽量减少延迟带来的影响,当然设计的复杂度就增加了。

    如果你重度依赖缓存,那么如何避免缓存信息是脏的,这更难解决。

    2:减负

    mysql无法是增删改查,要保持数据量可控,我最喜欢在不影响应用的前提下删除数据,看似很low的解决方案其实很管用。

    尽量减少慢查询,以前同步延迟都是查询带来的,但这次却不是,而是队列大量更新和插入带来的,比如说每天全量推送用户,长时间高并发写,同步不可避免,所以一定要控制并发写入和更新量。

    3:选择合适的解决方案

    mysql尽量作为存储使用,因为大规模的查询和更新并不是它的优势,所以非核心业务,可以考虑redis和mongodb,尤其是队列解决方案,不建议使用mysql,或者说有多套解决方案。

    4:拆分

    受限于mysql本身机制,可以通过升级mysql版本,提升并行复制能力。或者根据不同的场景,使用多个库,甚至多个mysql实例,避免核心服务受影响。

    一方面服务能够解耦,另外也方便扩展。这也是分而治之的解决思路之一。

    5:负载均衡

    有的时候发现某些从库不延迟,就一台延迟,可以通过策略,摘除这台从库,但必须意识到,这只是临时解决方案,出现大量的延迟,说明问题可能已经比较严重了。

    目前规模还小,如果大了呢?那时候可能是灾难性的。

    【编辑推荐】

    【责任编辑:武晓燕 TEL:(010)68476606】

    点赞 0

    展开全文
  • mysql同步方式介绍

    2020-12-27 19:47:00
    master库有两个线程一个用户线程复制处理客户端的请求记录binlog日志,一个dump线程负责拷贝binlog日志跟把日志同步给slave,这样就会造成主从延时不一致问题 二:同步复制 同步复制是在记录binlog后将日志...
  • 1:在mysql下找到my.ini文件,在其[mysqld] 下添加主服务器端配置:server-id=1 #服务器 idlog-bin=C:\Program Files\MySQL\MySQL Server 5.5\mysql-bin #二进制文件存放路径binlog-do-db=test1 #待同步的数据库...
  • MySQL同步插件

    2021-02-01 02:42:09
    实验环境情况;操作系统:CentOS Linux release 7.3.1611 (Core)数据库:MariaDB-10.2.6-linux-glibc_214-x86_...插件在MySQL二进制/usr/local/mysql/lib/plugin目录下,分别是;主插件: semisync_master.so从插件: sos...
  • 在线QQ客服:1922638专业的SQL Server、MySQL数据库同步软件初次使用ETL工具抽取并同步数据,搜索之后决定使用kettle,使用后感觉很方便。本次是基于一个很小的需求,需要把老系统的mysql数据在一段新老系统共存时期...
  • sqoop導入mysql數據運行過程中依賴mysql-connector-java-*.jar,所以需要下載mysql-connector-java-*.jar到sqoop(A)的lib下 6.修改configure-sqoop 注釋掉hbase zookeeper檢查: #if [ ! -d "${HBASE_HOME}" ]; ...
  • 在从上验证:mysql> show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 111.11.1.11Master_User: repMaster_...
  • mysql从服务器因硬件故障停止复制,无法从中断点开始继续复制。在从库执行reset slave清除二进制日志,并重新生成master.info,最好将从库重启一下,slave stop在主库reset master清除二进制日志主库使用--skip-...
  • Slave_IO_Running:是Slave_SQL_Running:是Replicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:registry.user//同步表例如:tenxcloud_2_0.tenx_users\ 坑1:\ Last_IO_Errno:1236Last_IO_Error:从主机读取数据时...
  • 1同步双写这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。优点:业务逻辑简单。缺点:1、 硬编码,有需要写入mysql的地方都需要添加写入ES的代码;2、 业务强耦合;3、 存在双写失败丢数据风险;4...
  • mysql同步远程数据库某个表final class mysql39to29 {private $data_39;function data_39(){$this->data_39 = '';$con = mysql_connect("192.168.0.3","root","root");if (!$con){die('Could not connect: ' . ...
  • 服务状态检查在两台服务器上,均完成如下操作:从开始菜单中打开mysql5的命令行,输入正确的密码,进入mysql控制台命令行模式后,输入如下命令:显示主服务器状态Show master status;显示从服务器状态Show slave ...
  • 区别:1、异步复制是Master将事件写入binlog,自身并不知道slave是否...相关学习推荐:mysql教程(视频)mysql同步复制和异步复制的区别:异步复制MySQL复制默认是异步复制,Master将事件写入binlog,提交事务,自身并...
  • 将hadoop的hdfs上的数据加载到hive数据库中 根据sqoop的工作原理,使用sqoop导入数据,主要有两种方法: 方法1(直接导入):将mysql数据直接导入hive表中 方法2(导入hdfs):先将mysql数据导入hdfs上,之后再将hdfs数据...
  • 在线QQ客服:1922638专业的SQL Server、MySQL数据库同步软件首先可以查看是不是缺少连接mysql所需要的jar,mysql-connector-java-5.1.47-bin.jar,如果没有的话可以去官网下载,这里方法链接。...
  • 实现MySQL同步数据到ES构建宽表

    千次阅读 2021-11-15 16:12:11
    : "integer" }, "name" : { "type" : "text" } } } } } } 同步策略 CloudCanal 在 同步 MySQL -> ElasticSearch 数据过程中,会兼顾全量和增量两种情况,我们可以创建两个独立的任务,分别同步产品的基础信息和附加...
  • 阿里云数据库RDS for mysql提供多种方式可以让用户同步数据到本地自建数据库。本文将着重为大家介绍RDS MySQL恢复数据到本地自建库的方法。1.如果RDS上的数据没有发生增删改的操作的话,可以生成物理备份或者逻辑...
  • 分享mysql数据库同步遇到的问题–锁表 一.问题描述 ​ 如标题,想要同步一下sit的数据库。通过navicat将原转存为.sql文件(小补充:压缩可大大减小文件大小),然后拿过来右击数据库选择“运行sql文件”。但是,由于...
  • - sqoop- 数据同步- hbase目前机器使用的sqoop版本# sqoop versionWarning: /usr/hdp/2.5.3.0-37/accumulo does not exist! Accumulo imports will fail.Please set $ACCUMULO_HOME to the root of your Accumulo ...
  • 部署搭建1.1 环境准备1.2 配置调整1.3 常见报错处理Ⅱ 避坑指南2.1 同步的中文乱码问题2.2 字段大小写不自动区分的问题2.3 Load canal adapter: rdb failed问题1.1 部署搭建——环境准备源数据库:mysql5.7(我自己用...
  • 提前安装好hadoop,Hive和mysql。 1. 开启hadoop和hive [root@slave13 conf]# start-all.sh [root@slave13 conf]# hive [root@slave13 conf]# hiveserver2 #启动后的进程 [root@slave13 conf]# xcall jps =====...
  • mysql 同步备份数据库

    2021-01-19 00:11:01
    mysql提供数据库的同步备份功能,能帮助我们实现数据库的冗灾、备份/恢复、负载均衡等具体操作1 同步数据库的硬件环境最好和主数据库一致,软件环境完全与主数据库环境一致,可以像安装主数据库一样安装同步数据库...
  • 个人认为一个项目当它做大做当后都可能会需要将...全量同步所谓全量同步就是将一个mysql的整个表的所有数据都同步到es中。全量的同步在网上查询的资料中我感觉比较简单又靠谱一点是这个:logstash-input-jdbc,通...
  • MySQL同步工具使用说明:一、安装好MYSQL,建立所需数据库,停止所有的MYSQL服务器。二、请把下面六行加入到每一个需要同步的MYSQL的my.ini文件中,其中backup_db填写你真实的需要同步的数据库,server-id代表服务器...
  • 初次使用ETL工具抽取并同步数据,搜索之后决定使用kettle,使用后感觉很方便。本次是基于一个很小的需求,需要把老系统的mysql数据在一段新老系统共存时期内产生的数据实时传输到新系统oracle中,因为实时性要求不算...
  • 原标题:MySQL数据库实现双向自动同步【IT168 技术】本文将探讨如何通过MySQL数据库的高级特性,实现数据库的双向自动同步,确保数据的冗余与完整性。通过以往真实的项目实战与经验,把操作实施过程全部记录下来,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 314,728
精华内容 125,891
关键字:

mysql同步

mysql 订阅
友情链接: 1.rar