快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

【mysql一主三从解决什么的】

请联系QQ:1793040 索取软件


MySQL 主从复制的问题及解决方案
2020-02-08 23:24:14
zhengzhaoyang122
阅读数 79
  • MySQL DBA数据库运维高薪必备教程

    MySQL是当前世界上应用最广泛的关系型数据库。
    十年前错过了Oracle,十年后就不要再错过MySQL,在这互联网盛世的时代,MySQLDBA供不应求,同等条件下薪水已远远超过了OracleDBA。
    想要成为高级的MySQLDBA,除了自身努力之外,还需要一份”靠谱”的视频教程。由黑马程序员Linux云计算+运维开发学科精心打造《MySQL
    DBA数据库运维高薪必备教程》,让你从数据库小白成长为高薪的MySQL DBA大神。 大纲: 1、MySQL数据库概述
    2、Linux系统环境准备 3、MySQL的三种安装方式(YUM、GLIBC、源码) 4、MySQL数据库操纵语言之SQL
    5、MySQL备份与还原(逻辑备份) 6、PerconaXtraBackup专业备份工具(全量备份与增量备份)
    7、MySQL主从复制(AB复制、基于GTIDs的主从复制实践) 8、MySQL半同步复制 9、MHA(数据库高可用解决方案)
    ……



    2425
    人正在学习

    去看看
    传智

目录

一、复制概述

二、复制工作机制【异步复制】

三、复制的用途和条件

四、复制的问题和解决方案


复制功能是构建 MySQL 的大规模、高性能的基础,也就是所谓的 “水平扩展” 架构。我们可以通过为服务器配置一个或多个备库。同时,复制也是高可用性可扩展性灾难恢复备份以及数据仓库等工作的基础。MySQL主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主库从库数据不一致问题的及解决方案。


复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过复制来扩展写操作。当使用一主多备架构时,可能会造成一些浪费,因为本质上它会复制大量不必要的重复数据。
MySQL 支持两种复制方式:基于行的复制和基于语句的复制(逻辑复制)。这两种方式都是基于在主库上记录二进制日志、在备库上重放日志的方式来实现异步的数据复制。这就导致在同一时间点备库上的数据可能与主库存在不一致,并且无法保证主备之间的延迟。一些大的语句可能导致产生几秒、几分钟甚至几小时的延迟。

MySQL 大部分是向后兼容的,新版本的服务器可以作为老版本的服务器的备库,但是反过来是不可行的,因为它可能无法解析新版本所采用的新的特性或语法,另外所使用的二进制文件的格式也可能不相同。

复制通常不会增加主库的开销,主要是启用二进制日志带来的开销,但出于备份或及时从崩溃中恢复的目的,这点开销也是必要的。 除此之外,每个备库也会对主库增加一些 I/O开销,尤其当备库请求从主库读取旧的二进制日志文件时。另外锁竞争也可能阻塞事务的提交。


复制分为以下三个步骤:【1】在主库上把数据更改记录到二进制日志(Binary Log)中(这些记录被称为二进制日志事件)。MySQL 会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
【2】备库将主库上的二进制日志复制到自己的中继日志(Relay Log)中。【更多细节】备库会启动一个工作线程,称为 I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程,这个二进制转储线程会读取主库上二进制日志事件。如果该线程追赶上主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库 I/O 线程会将接收到的事件记录到中继日志中。
【3】备库读取中继日志中的事件,将其重放到备库数据之上

这种复制架构实现了获取事件和重放事件的解耦,允许这两个过程异步进行。也就是说 I/O 线程能够独立于 SQL 线程之外的工作。最重要的问题是主库上并发运行的查询在备库只能串行化执行,因为只有一个 SQL 线程来重放中继日志的事件


【1】主从复制的用途:①、实时灾备,用于故障切换;②、读写分离,提供查询服务;③、备份,避免影响业务;
【2】主从部署必要条件:①、主库开启binlog日志(设置log-bin参数);②、主从server-id不同;③、从库服务器能连通主库;


【1】MySQL 数据库从库同步的延迟问题:复制延迟是一个很普遍的问题,最好在设计应用程序时能够让其容忍备库出现延迟。如果系统在备库出现延迟时就无法很好地工作,那么应用程序也许就不应该用到复制。但也有办法可以让备库跟上主库。

MySQL 单线程复制的设计导致备库通常只会有效地使用一个 CPU和磁盘,效率相当底下。而事实上,备库通常都会和主库使用相同配置的机器。同时备库上的也是问题,运行的查询可能会阻塞复制线程。因为复制是单线程的,复制线程在等待时将会无法做别的事。

复制一般有两种产生延迟的方式:突然产生延迟然后再跟上,或者稳定的延迟增长。前一种通常是由于一条运行很长时间的查询导致,而后者即使在没有长时间运行的查询时也会出现。当备库无法跟上时,可以记录备库上的查询并使用一个日志分析工具找出哪里慢了。最好的分析办法是暂时在备库上打开慢查询日志记录,然后使用 pt-query-digest 工具来分析。如果打开了 log_slow_slave_statements 选项,在标准的 MySQL 慢查询日志能够记录 MySQL5.1 及更新的版本中复制线程执行的语句,这样就可以找到在复制时那些语句执行慢了。

解决方案一:除了购买更快的磁盘和CPU(固态磁盘能够提供极大的帮组)备库没有太多的调优空间。大部分选项都是禁止某些额外的工作以减少备库的负载。一个简单的办法时配置 InnoDB,使其不要频繁地刷新磁盘,这样事务会提交得更快些。如下:


还可以在备库上禁止二进制日志记录,如下:但这些设置都是牺牲安全获取速度。如果需要将备库提升为主库,记得将这些设置还原成安全的值。


解决方案二:不要重复写操作中代价较高的部分:重构应用程序或者优化查询通常是最好的保持备库同步的方法。任何主库上昂贵的写操作都会在每一个备库上重放。如果可以把工作转移到备库,那么就只有一个备库需要执行,然后我们可以把写的结果回传到主库,例如,通过执行 LOAD DATA INFILE。举个栗子:


如上在主库上执行查询,每个备库将同样需要执行庞大的 GROUP BY 查询。当进行太多这样操作时,备库将被拉开差距。如果将查询转移到一个备库上也许会有帮组。在备库上创建一个特别保留的数据库,用于避免和从主库上复制的数据产生冲突。可以执行如下操作:


现在可以执行 SELECT INTO OUTFILE,然后执行 LOAD DATA INFILE 将结果集加载到主库中。如果有 N个备库,就节约了 N-1 次庞大的 GROUP BY 操作。该策略的问题是备库中的数据和写入主库的数据很难保持一致


我们还可以通过分离 REPLACE 和 SELECT 部分,把结果返回给应用程序,然后将其插入到主库中。这种方法再次避免了在备库上执行 GROUP BY 部分。将SELECT 与 REPLACE 分离后意味着查询的 SELECT 操作不会在每一个备库上重放。节约了备库上昂贵的写入操作部分。


解决方案三:在复制之外并行写入:另一种避免备库严重延迟的办法是绕过复制。自己复制数据到另外一台服务器,而不是通过复制。特别是复核的瓶颈通常集中在一些小部分表上。如果能在复制之外单独处理这些,就能够显著地加快复制。
解决方案四:并行复制:MySQL 5.7才可称为真正的并行复制,这其中最为主要的原因就是 slave服务器的回放与 master是一致的,即 master服务器上是怎么并行执行的,那么 slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。【更多细节】
【2】数据损坏或丢失的错误:从服务器崩溃、断电、磁盘损坏、内存或网络错误中恢复。都需要从某个点开始重启复制。大部分由于非正常关机导致的复制问题都是由于没有把数据及时地刷新到磁盘。例如:
主库意外关闭:如果没有设置主库的 sync_binlog 选项,就可能在崩溃前没有将最后的几个二进制日志事件刷新到磁盘中。备库 I/O 也就一直处于读不到尚未写入磁盘的事件。
解决方案:指定备库从下一个二进制日志的开头读日志,但是一些日志事件将永久丢失,建议使用Percona Toolkit 中的 pt-table-checksum 工具来检查主备一致性,以便修复。可以通过在主库开启 sync_binlog 来避免数据丢失。即使开启了 sync_binlog,MyISAM 表的数据仍然可能在崩溃的时候损坏,对于 InnoDB 事务,如果 innodb_flush_log_try_commit 没有设为1,也可能丢失数据(但数据不会损坏)。

MySQL 提供一个 sync_binlog参数来控制数据库的 binlog刷到磁盘上去。默认,sync_binlog=0,表示 MySQL不控制 binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的,但是风险也是最大的。因为一旦系统 Crash,在binlog_cache 中的所有 binlog信息都会被丢失。如果sync_binlog>0,表示每 sync_binlog次事务提交,MySQL 调用文件系统的刷新操作将缓存刷下去。最安全的就是 sync_binlog=1了,表示每次事务提交,MySQL都会把 binlog刷下去,是最安全但是性能损耗最大的设置。这样的话,在数据库所在的主机操作系统损坏或者突然掉电的情况下,系统才有可能丢失1个事务的数据。但是 binlog虽然是顺序IO,但是设置 sync_binlog=1,多个事务同时提交,同样很大的影响 MySQL和 IO性能。虽然可以通过groupcommit 的补丁缓解,但是刷新的频率过高对 IO的影响也非常大。对于高并发事务的系统来说,”sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。所以很多 MySQLDBA设置的 sync_binlog并不是最安全的1,而是100或者是0。这样牺牲一定的一致性,可以获得更高的并发和性能。

innodb_flush_log_try_commit 值说明:
0:log buffer 将每秒一次地写入log file中,并且 log file的 flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
1:每次事务提交时 MySQL都会把 log buffer的数据写入 log file,并且 flush(刷到磁盘)中去,该模式为系统默认。
2:每次事务提交时MySQL都会把 log buffer的数据写入 log file,但是 flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

备库意外关闭:当备库关闭后重启时,会读取 master.info 文件已找到上次停止复制的位置。不幸的是,该文件并没有同步写到磁盘,文件中存储的信息可能也是错误的。备库可能会尝试重新执行一些二进制日志事件,这可能会导致唯一索引错误。唯一的办法就是忽略那些错误。Percona Toolkit 中的 pt-slave-restart 工具可以帮组完成这一点。
如果使用的是 InnoDB 表,可以在重启后观察 MySQL 错误日志。InnoDB 在恢复过程中打印出它的恢复点的二进制日志坐标。可以使用这个值来决定备库指向主库的偏移量。Percona Toolkit 提供了一个新的特性,可以在恢复的过程中自动将这些信息提取出来,并更新 master.info 文件,从根本上使得复制能够协调好备库上的事务。
主库上的二进制日志损坏:除了忽略损坏的位置别无选择。可以在主库上执行 FLUSH LOGS 命令,这样主库会开启一个新的日志文件,然后在将备库指向该文件的开始位置。某些情况下可以通过 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 来忽略一个损坏的事件。如果有多个损坏的事件,就需要重复该步骤,知道跳过所有损坏的事件。
备库上的中继日志损坏:如果主库上的日志是完好的,就可以通过 CHANGE MASTER TO 命令丢弃并重新获取损坏的事件。
二进制日志与InnoDB事务日志不同步:当主库崩溃时,InnoDB 可能将一个事务标记为提交,此时该事务可能还没有记录到二进制日志中。除非是某个备库的中继日志已经保存,否则没有任何办法恢复丢失的事务。在 MySQL5.0 版本可以设置 sync_binlog 选项来防止该问题。
【3】不唯一的服务器 ID:如果不小心为两台备库设置了相同的服务器ID,当查看错误日志或者使用 innotop 查看主库,会发现两台备库只有一台连接到主库。在备库的错误日志会发现反复的重连和连接断开信息,但不会提及被错误配置的服务器ID。
解决方案:小心设置备库的服务器ID。一个比较好的办法时创建一个主库到备库的服务器ID映射表,这样就可以跟踪到备库的ID 信息。
【4】InnoDB 加锁读引起的锁争用:通常InnoDB 的读操作时非阻塞的,但是某些情况下。特别是在使用基于语句的复制方式时,执行 INSERT…SELECT 操作会锁定原表上的所有行。MySQL 需要加锁以确保该语句的执行结果在主库和备库上是一致的。实际上,加锁导致主库上的语句串行化,以确保和备库上执行的方式相符。这种设计可能导致锁竞争、阻塞、以及锁等待超时等问题。应当避免让事务开启太久以减少阻塞。
解决方案:将大命令拆分成小命令,使其尽可能简短。另一种方法时替换 INSERT…SELECT 在主库上先执行SELECT INTO OUTFILE 再执行 LOAD DATE INFILE 这种方法更快,并且不需要加锁。并在完成之后清理掉文件(通过定时任务)。

—-如果喜欢,点个红心支持以下,谢谢—-

展开阅读原文



【mysql一主三从解决什么的】

mysql一主三从解决什么的 相关内容














MySql 的主从复制
2019-07-03 21:04:36
csdn_002
阅读数 29
  • MySQL DBA数据库运维高薪必备教程

    MySQL是当前世界上应用最广泛的关系型数据库。
    十年前错过了Oracle,十年后就不要再错过MySQL,在这互联网盛世的时代,MySQLDBA供不应求,同等条件下薪水已远远超过了OracleDBA。
    想要成为高级的MySQLDBA,除了自身努力之外,还需要一份”靠谱”的视频教程。由黑马程序员Linux云计算+运维开发学科精心打造《MySQL
    DBA数据库运维高薪必备教程》,让你从数据库小白成长为高薪的MySQL DBA大神。 大纲: 1、MySQL数据库概述
    2、Linux系统环境准备 3、MySQL的三种安装方式(YUM、GLIBC、源码) 4、MySQL数据库操纵语言之SQL
    5、MySQL备份与还原(逻辑备份) 6、PerconaXtraBackup专业备份工具(全量备份与增量备份)
    7、MySQL主从复制(AB复制、基于GTIDs的主从复制实践) 8、MySQL半同步复制 9、MHA(数据库高可用解决方案)
    ……



    2425
    人正在学习

    去看看
    传智

          • 第一步 提出问题
          • 第二步 解决问题
          • 第三步 总结问题与回顾
第一步 提出问题

1.主从复制是什么?我们为什么要做mysql的主从复制?它能给我们带来什么益处?
主从复制的概念
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的业务数据库

2.为什么要做mysql的主从复制l
通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低。
为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。
而且如果主数据库崩溃,可快速将业务系统切换到从数据库上,可避免数据丢失。
这个时候 主从复制就成了主角
将数据库作为单独一台服务器来运行
从同一台服务器出发 去访问多台数据库服务器
这个时候只需要有一台数据库服务器作为主数据库服务器
来完成写入的功能
其他的数据库服务器只需要完成从主数据库中读取数据
保持主从同步即可
主从复制实际上就是从服务器在复制主服务器的动作 以此来保持数据的一致性

3.它的作用
一是作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作;
二是可在从数据库作备份、数据统计等工作,这样不影响主数据库的性能;

第二步 解决问题

1.主数据库服务器和从数据库服务器怎样才能保证数据一致呢?
这时候就需要用到binlog日志了
binlog日志简单来说
就是用来记录主数据库服务器的一系列执行的操作
此时
从数据库服务器只需要从主服务器中读取binlog日志的内容
对此进行操作
就能够保证主从服务器的数据一致
前提是主从数据库的环境和配置是想同的

2.完成主从复制需要哪些条件?
主从数据库的配置
从数据库的配置


max_allowed_packet=20M 读写允许的内存 默认为1M 尽量配置的大一点 以免遇到读写无法记录的情况
server_id=70
log-bin=mysqlbin
binlog_format=mixed

从数据库的配置


第三步 总结问题与回顾

从数据库中必须有一个用户可以在从数据库的机器上去连接主数据库


查看binlog日志的状态
会得到master_log_file 和 master_log_pos 两个参数和他们对应的值
先用主数据库服务器分配的用户连接主数据库 试试能不能链接成功
成功之后 用root用户连接mysql 执行如下命令
stop slave; 关闭从库


如果
Slave_IO_Running: Yes 负责与主机的io通信,
Slave_SQL_Running: Yes 负责自己的slave mysql进程。
这两项为NO

遇到这种问题不要惊慌
即使试了很多方法也仍然没有办法解决的时候
耐心点
仔细研究之后会发现
其实只是一条命令或者一项配置是否开启的问题


Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.

一般是事务回滚造成的:
解决办法:


binlog命令


展开阅读原文



【mysql一主三从解决什么的】

mysql一主三从解决什么的 相关内容














【MySQL】主从复制实现原理详解
2020-02-25 23:41:27
cy973071263
阅读数 53
  • MySQL DBA数据库运维高薪必备教程

    MySQL是当前世界上应用最广泛的关系型数据库。
    十年前错过了Oracle,十年后就不要再错过MySQL,在这互联网盛世的时代,MySQLDBA供不应求,同等条件下薪水已远远超过了OracleDBA。
    想要成为高级的MySQLDBA,除了自身努力之外,还需要一份”靠谱”的视频教程。由黑马程序员Linux云计算+运维开发学科精心打造《MySQL
    DBA数据库运维高薪必备教程》,让你从数据库小白成长为高薪的MySQL DBA大神。 大纲: 1、MySQL数据库概述
    2、Linux系统环境准备 3、MySQL的三种安装方式(YUM、GLIBC、源码) 4、MySQL数据库操纵语言之SQL
    5、MySQL备份与还原(逻辑备份) 6、PerconaXtraBackup专业备份工具(全量备份与增量备份)
    7、MySQL主从复制(AB复制、基于GTIDs的主从复制实践) 8、MySQL半同步复制 9、MHA(数据库高可用解决方案)
    ……



    2425
    人正在学习

    去看看
    传智

目录

一、概要

1.1 mysql复制的优点

1.2 Mysql复制解决的问题

二、MySQL 主从复制的概念

三、MySQL 主从复制的主要用途

3.1 读写分离

3.2 数据实时备份,当系统中某个节点发生故障时,可以方便的故障切换(主从切换)

3.3 高可用(HA)

3.4 架构扩展

四、MySQL 主从形式一主一从

4.1 一主多从

4.2 多主一从 (从5.7开始支持)

4.3 双主复制

4.4 级联复制

五、MySQL 主从复制的原理

5.1 主节点 log dump 线程

5.2 从节点 I/O线程

5.3 从节点 SQL线程

5.4 复制的基本过程

六、MySQL 主从复制的模式

6.1 异步模式(mysql async-mode)

6.2 半同步模式(mysql semi-sync)

6.3 全同步模式

6.4 异步模式,全同步模式,半同步模式的对比图

6.5 GTID复制模式

6.5.1 GTID复制原理

6.5.2 GTID的好处

6.5.3 GTID模式复制局限性

6.6 多线程复制

七、MySQL主从复制的方式

7.1 Statement-base Replication (SBR)

7.2 Row-based Relication(RBR)

7.3 Mixed-format Replication(MBR)

八、总结


mysql从3.23版本开始提供复制功能,复制是将主库的DDLDML操作通过二进制日志传递到复制服务器(从库)上,然后从库对这些日志重新执行(重做),从而使得主库和从库保持数据一致。

  • 如果主库出现问题,可以快速切换到从库提供服务
  • 可以在从库执行查询操作,降低主库的访问压力。
  • 可以在从库进行备份,以免备份期间影响主库的服务。

  • 数据分布 (Data distribution )
  • 负载平衡(load balancing)
  • 数据备份(Backups) ,保证数据安全
  • 高可用性和容错行(High availability and failover)
  • 实现读写分离,缓解数据库压力

注意:由于mysql实现的异步复制,所以主库和从库数据之间存在一定的差异,在从库执行查询操作需要考虑这些数据的差异,一般只有更新不频繁和对实时性要求不高的数据可以通过从库查询,实行要求高的仍要从主库查询。

MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表

在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据;

  • 因为数据库服务器中的数据都是相同的,当Master挂掉后,可以指定一台Slave充当Master继续保证服务的运行,因为数据是一致性的(如果当插入时Master就挂掉,可能不一致,因为同步也需要时间)当然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Slave的数据同步到Master。
  • 在主服务器上执行写入和更新,在从服务器上向外提供读功能,达到读写分离的效果,也可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  • 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。

随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。

提高系统的读性能

一主一从和一主多从是最常见的主从架构,实施起来简单并且有效,不仅可以实现HA,而且还能读写分离,进而提升集群的并发能力。

多主一从可以将多个mysql数据库备份到一台存储性能比较好的服务器上。

双主复制,也就是互做主从复制,每个master(主)既是master,又是另外一台服务器的slave(从)。这样任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

级联复制模式下,部分slave的数据同步不连接主节点,而是连接从节点。因为如果主节点有太多的从节点,就会损耗一部分性能用于replication(复制),那么我们可以让3~5个从节点连接主节点,其它从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响。级联复制下从节点也要开启binary logbin-log)功能

MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread,其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:

当从节点连接主节点时,主节点会为其创建一个log dump 线程,用于发送和读取bin-log的内容。在读取bin-log中的操作时,log dump线程会对主节点上的bin-log加锁,当读取完成,在发送给从节点之前,锁会被释放。主节点会为自己的每一个从节点创建一个log dump 线程

当从节点上执行`start slave`命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-logI/O线程接收到主节点的blog dump进程发来的更新之后,保存在本地relay-log(中继日志)中。

SQL线程负责读取relay-log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

对于每一个主从连接,都需要这三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个log dump 进程,而每个从节点都有自己的I/O进程SQL进程从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步

要实施复制,首先必须打开Master 端的binary logbin-log)功能,否则无法实现

因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:

  1. 在从节点上执行sart slave命令开启主从复制开关,开始进行主从复制。从节点上的I/O 进程连接主节点,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
  2. 主节点接收到来自从节点的I/O请求后,通过负责复制的I/O进程(log dump 线程)根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包括本次返回的信息的bin-log file 的以及bin-log positionbin-log中的下一个指定更新位置
  3. 从节点的I/O进程接收到主节点发送过来的日志内容、日志文件及位置点后,将接收到的日志内容更新到本机的relaylog中继日志)的文件(Mysql-relay-bin.xxx)的最末端,并将读取到的binary logbin-log)文件名和位置保存到master-info 文件中,以便在下一次读取的时候能够清楚的告诉Master”我需要从某个bin-log 的哪个位置开始往后的日志内容,请发给我
  4. Slave 的 SQL线程检测到relay-log 中新增加了内容后,会将relay-log的内容解析成在主节点上实际执行过SQL语句,然后在本数据库中按照解析出来的顺序执行,并在relay-log.info中记录当前应用中继日志的文件名和位置点

MySQL 主从复制默认是异步的模式MySQL增删改操作会全部记录在binlogbinary log,当slave节点连接master时,会主动从master处获取最新的binlog文件。并把binlog存储到本地的relay-log中,然后去执行relay-log的更新内容。

异步模式如下图所示,这种模式下,主节点不会主动推送bin-log到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果崩溃掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从提升为主,可能导致新主节点上的数据不完整。

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay-log中才返回成功信息给客户端(只能保证主库的bin-log至少传输到了一个从节点上,但并不能保证从节点将此事务执行更新到db中),否则需要等待直到超时时间然后切换成异步模式再提交。相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。如下图所示:

半同步模式不是mysql内置的,从mysql 5.5开始集成,需要master 和slave 安装插件开启半同步模式。

指当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。

在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点(指从库更新到了主库bin-log的哪个位置,这个位置之前都已经更显完毕,这个位置之后未更新),然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道主节点的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步

基于GTID的复制是MySQL 5.6后新增的复制方式.

GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交的事务在集群中有一个唯一的ID.

在原来基于日志的复制中, 从库需要告知主库要从哪个偏移量进行增量同步, 如果指定错误会造成数据的遗漏, 从而造成数据的不一致.

而基于GTID的复制中, 从库会告知主库已经执行的事务的GTID的值, 然后主库会将所有未执行的事务的GTID的列表返回给从库.并且可以保证同一个事务只在指定的从库执行一次.通过全局的事务ID确定从库要执行的事务的方式代替了以前需要用bin-logpos点确定从库要执行的事务的方式

GTID是由server_uuid和事物id组成,格式为:GTID=server_uuid:transaction_id。server_uuid是在数据库启动过程中自动生成,每台机器的server-uuid不一样。uuid存放在数据目录的auto.conf文件中,而transaction_id就是事务提交时系统顺序分配的一个不会重复的序列号。

主节点更新数据时,会在事务前产生GTID,一起记录到bin-log日志中。从节点的I/O线程将变更的bin-log,写入到本地的relay-log中。SQL线程从relay-log中获取GTID,然后对比本地bin-log是否有记录(所以MySQL从节点必须要开启binary-log)。如果有记录,说明该GTID的事务已经执行,从节点会忽略。如果没有记录,从节点就会从relay-log中执行该GTID的事务,并记录到binlog。在解析过程中会判断是否有主键,如果没有就用二级索引,如果有就用全部扫描。

  1. GTID使用master_auto_position=1代替了binlog和position号的主从复制搭建方式,相比binlog和position方式更容易搭建主从复制。
  2. GTID方便实现主从之间的failover(主从切换),不用一步一步的去查找position和binlog文件。

  1. 不能使用create table table_name select * from table_name模式的语句
  2. 在一个事务中既包含事务表的操作又包含非事务表
  3. 不支持CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE语句操作
  4. 使用GTID复制从库跳过错误时,不支持sql_slave_skip_counter参数的语法

多线程复制(基于库),在MySQL 5.6以前的版本,slave的复制是单线程的,而master是并发写入的,所以延时是避免不了的。唯一有效的方法是把多个库放在多台slave,这样又有点浪费服务器。在MySQL 5.6里面,我们可以把多个表放在多个库,这样就可以使用多线程复制。

但 5.6 中的每个线程只能处理一个数据库,所以如果只有一个数据库,或者绝大多数写操作都是集中在某一个数据库的,那么这个”多线程复制”就不能充分发挥作用了

Mysql 5.7 对 “多线程复制” 进行了改善,可以按照逻辑时钟的方式来分配线程,大大提高了复制性能

MySQL 主从复制有三种方式:基于SQL语句的复制(statement-based replication,SBR),基于行的复制(row-based replication,RBR),混合模式复制(mixed-based replication,MBR)。对应的bin-log文件的格式也有三种:STATEMENT, ROW, MIXED

就是记录sql语句在binlog中,Mysql 5.1.4 及之前的版本都是使用的这种复制格式。优点是只需要记录会修改数据的sql语句到binlog中,减少了binlog日质量,节约I/O,提高性能。缺点是在某些情况下,会导致主从节点中数据不一致(比如sleep(),now()等)。

mysql masterSQL语句分解为基于Row更改的语句并记录在binlog中,也就是只记录哪条数据被修改了,修改成什么样。优点是不会出现某些特定情况下的存储过程、或者函数、或者trigger的调用或者触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是修改table的时候会让日志暴增,同时增加binlog同步时间。也不能通过binlog解析获取执行过的sql语句,只能看到发生的data变更。

MySQL NDB cluster 7.3 和7.4 使用的MBR。是以上两种模式的混合,对于一般的复制使用STATEMENT模式保存到binlog,对于STATEMENT模式无法复制的操作则使用ROW模式来保存,MySQL会根据执行的SQL语句选择日志保存方式。

Mysql 主从复制是mysql 高可用,高性能的基础,有了这个基础,mysql 的部署会变得简单、灵活并且具有多样性,从而可以根据不同的业务场景做出灵活的调整。


其他相关文章:【MySQL】MySQL分库分表详解
【面试题】一致性 Hash 算法是什么?它带来了哪些问题以及解决方案
【MySQL】MySQL的锁与事务隔离级别详解
【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析
【MySQL】MySQL的存储引擎和索引详解(聚集索引和非聚集索引)
【MySQL】InnoDB存储引擎,MyISAM存储引擎,聚集索引,非聚集索引,主键索引,二级索引他们之间的关系梳理


参考资料:《深入浅出MySQL开发、维护与管理》唐汉明著

展开阅读原文



【mysql一主三从解决什么的】

mysql一主三从解决什么的 相关内容














Mysql的主主备份与主从备份–同步
2016-11-20 10:38:48
weixin_34384915
阅读数 30
  • MySQL DBA数据库运维高薪必备教程

    MySQL是当前世界上应用最广泛的关系型数据库。
    十年前错过了Oracle,十年后就不要再错过MySQL,在这互联网盛世的时代,MySQLDBA供不应求,同等条件下薪水已远远超过了OracleDBA。
    想要成为高级的MySQLDBA,除了自身努力之外,还需要一份”靠谱”的视频教程。由黑马程序员Linux云计算+运维开发学科精心打造《MySQL
    DBA数据库运维高薪必备教程》,让你从数据库小白成长为高薪的MySQL DBA大神。 大纲: 1、MySQL数据库概述
    2、Linux系统环境准备 3、MySQL的三种安装方式(YUM、GLIBC、源码) 4、MySQL数据库操纵语言之SQL
    5、MySQL备份与还原(逻辑备份) 6、PerconaXtraBackup专业备份工具(全量备份与增量备份)
    7、MySQL主从复制(AB复制、基于GTIDs的主从复制实践) 8、MySQL半同步复制 9、MHA(数据库高可用解决方案)
    ……



    2425
    人正在学习

    去看看
    传智

Mysql的主主备份与主从备份同步

一:实验目标

mysql主从原理

实战:mysql主从配置

实战:mysql主主配置

二:实验环境

导入测试数据库book:

Mysql主xuegod63 IP:192.168.1.63

Mysql从xuegod64 IP:192.168.1.64

三:实验代码

实战:mysql主从配置

服务概述:主从复制

复制解决的基本问题是让一台服务器的数据和另外的服务器保持同步。 一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作主服务器。主服务器和从服务器可以位亍丌同的网络拓扑中,还能对整台服务器、特定的数据库,甚至特定的表迚行复制。 主从服务器的版本必须一致,即使丌一致,主服务器版本可以是旧的,从服务器必须是新的版本。

复制解决的问题

MySQL复制技术有以下一些特点:

(1) 数据分布 (Data distribution )

(2) 负载平衡(load balancing)

(3) 备份(Backups)

(4) 高可用性和故障转移 High availability and failover

复制如何工作

整体上来说,复制有3个步骤:

(1) master将改发记录到二迚制日志(binary log)中(这些记录叨做二迚制日志事件,binary log events);

(2) slavemasterbinary log events拷贝到它的中继日志(relay log)

(3) slave重做中继日志中的事件,修改salve上的数据

服务概述:

wKiom1gxCh_QAQx6AAF9gYGp7Es360.png

I/O 表示进和出,input和output

:运行过程

1:master输入一条规则,binary log会将其转换成二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
2:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
3:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

:复制配置

有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。

:要点:

负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。

一台主服务器可以连接多台从服务器,并且从服务器也可以反过来作主服务器。

主服务器和从服务器可以位于不同的网络拓扑中,还能对整台服务器、特定的数据库,甚至特定的表迚行复制。

主从服务器的版本必须一致,即使不一致,主服务器版本可以是旧的,从服务器必须是新的版本。

3.1.复制解决的问题MySQL复制技术有以下一些特点:

(1) 数据分布(Data distribution )

(2) 负载平衡(load balancing)

(3) 备份(Backups)

(4) 高可用性和故障转移 High availability and failover

3.2复制如何工作

整体上来说,复制有3个步骤:

(1) master将改发记录到二迚制日志(binary log)中(这些记录叨做二迚制日志事件,binary log events);

(2) slave将master的binary log events拷贝到它的中继日志(relay log);

(3) slave重做中继日志中的事件,修改salve上的数据。

模式:C/S 模式

端口: 3306

:实验步骤实战mysql主从备份-同步

xuegod63 主mysql服务器配置 创建要同步的数据库:

创建数据库

mysql> create database mk;

wKioL1gxCiyBjU-vAAAoj5TTfW0547.png

mysql> use mk;

mysql> create table test1 (id int);

mysql> insert into test1 values(1)

wKioL1gxCjaR8fuLAAAR3FFiFNU926.png

停止mysql服务

[root@xuegod63 ~]# service mysql stop

编辑配置文件

[root@xuegod63 ~]# vim/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0#在原配置文件中,添加以下内容:

log-bin=mysqllog#启用二迚制日志,默认存在/var/lib/mysql 下面

server-id=1 #本机数据库ID 标示。

binlog-do-db=mk#可以被从服务器复制的库。二制需要同步的数据库名

# binlog-ignore-db=mk2 可以被从服务器复制的库

重新启劢 mysql服务器

[root@xuegod63 ~]# service mysqld restart

授权给用户名为“slave”用户登录密码及权限

mysql> grant replication slave on *.* to slave@192.168.1.64 identified by “123456”;

查看状态,信息

wKiom1gxCkGRwnWaAAAhgTP0OpM063.png

数据库备份

[root@xuegod63 ~]# mysqldump-u root-p123456–all-databases > all.sql

[root@xuegod63 ~]# ll-h all.sql

-rw-r–r–1 root root 514K Mar 27 00:54 all.sql

主服务器中的数据传给从服务器:复制前保证两个数据库数据一致:

1):方法1:scp all.sql 192.168.1.64:/root

wKiom1gxCpfwQnh9AAAfhokB9DM726.png

2:使用nc命令

NetCat,它短小精悍、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。

语法:

服务器端:nc収送数据的语法:nc-l 端口 <要传输的文件

客户端: nc接叐数据的语法:nc 进程nc服务器端IP 端口 > 文件名

例:监听9999端口,当有客户端连接时,就把对应文件传送到来连接的客户端

[root@xuegod63 ~]# rpm-qf `which nc `

nc-1.84-22.el6.x86_64

开启监听:

[root@xuegod63 ~]#nc-l 9999

[root@xuegod63 ~]# netstat-antup | grep 9999

tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 15164/nc

测试接收:

1)配置从服务器xuegod64 :

[root@xuegod64 ~]# cd/opt/

[root@xuegod64 opt]# ls

[root@xuegod64 opt]# nc 192.168.1.63 9999 > ncall.sql

[root@xuegod64 opt]# diff ncall.sql/root/all.sql

============================================================

wKiom1gxCsfwva9wAAA5gSr5OkI475.png

2):数据库版本相同

Mysql主服务器xuegod63

mysql从服务xuegod64

[root@xuegod64 opt]# yum install mysql-server-y

[root@xuegod64 opt]# service mysqld restart

mysql>show variables like ‘%version%’;查看版本

wKioL1gxCtTR18xuAAA3TAPs5Q4411.png

测试连接到主服务器是否成功

[root@xuegod64 opt]# mysql-u slave-h 192.168.1.63-p123456

wKioL1gxDCzhZn6YAAAYZE1_Uzs259.png

从服务器导入数据库和主服务器保持一致

[root@xuegod64 ~]# mysql-u root-p

Enter password:123456

[root@xuegod64 opt]# mysql-u root-p

Enter password:123456

wKiom1gxC-Hw77eyAAAikSwTafE707.png

/////////////////////////////////////////////////////////////////////////注释:在这里可能会报错

wKioL1gxC7vxFMmQAAAiDS9TkSA711.png

解决方法

方法操作流程很简单,如下:

#/etc/init.d/mysqld stop//停止MySQL服务的运行
# mysqld_safe–user=mysql–skip-grant-tables–skip-networking &//跳过受权表访问
# mysql-u root mysql//登录mysql

1:关闭mysqld服务

[root@xuegod64 ~]# service mysqld stop

2:跳过授权访问

[root@xuegod64 ~]# mysqld_safe–user=mysql–skip-grant-tables–skip-networking &

3:修改数据库更新

[root@xuegod64 ~]# mysql-u root mysql#mysql5.7以下的版本如下:
mysql> UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’ and host=’127.0.0.1′ or host=’localhost’;//把空的用户密码都修改成非空的密码就行了。
mysql> FLUSH PRIVILEGES;
mysql> quit

4:重启数据库并重设密码

[root@xuegod64 ~]# service mysqld start :
[root@xuegod64 ~]# mysql-uroot-p
Enter password: <输入新设的密码newpassword>

/////////////////////////////////////////////////////////////////////////

修改从服务器配置文件:从服务器没必要开bin-log日志注。

[root@xuegod64 ~]# vim/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

#在配置文件中写入以下内容

server-id=2#从服务器ID号,要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须主服务器以及其它从服务器的相同。可以认为server-id值类似亍IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。

master-host=192.168.1.63#指定主服务器IP地址

master-user=slave #定在主服务器上可以行同步的用户名

master-password=123456#定在主服务器上可以行同步的用户名密码

####以下可以

master-port=3306 #同步所用的端口

master-connect-retry=60 #断点重新连接时间

重启mysql服务

[root@xuegod64 ~]# service mysqld restart

测试: 主服务器上查看:

[root@xuegod63 ~]# mysql-u root-p

Enter password:

mysql> show master status;

wKioL1gxCzjAPpBeAAAkYTvi34w223.png

#证明主服务器成功

从服务器上查看:–#证明从服务器成功

[root@xuegod64 opt]# mysql-u root-p

Enter password:

mysql> show slave status \G

*************************** 1.row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.1.63

Master_User: slave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysqllog.000001

Read_Master_Log_Pos: 315

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 459

Relay_Master_Log_File: mysqllog.000001

Slave_IO_Running: Yes #可以看到这两个Yes,说明从服务器安装成功。

Slave_SQL_Running: Yes

Slave_IO_Running :一个负责不主机的io通信

Slave_SQL_Running:负责自己的slave mysql迚程

测试:数据同步

xuegod63写数据:

[root@xuegod63 ~]# mysql-u root-p

Enter password:

mysql> use mk;

mysql> show tables;

+————–+

| Tables_in_mk |

+————–+

| test1|

+————–+

1 row in set (0.00 sec)

mysql> insert into test1 values(5);

xuegod64读数据:

[root@xuegod64 opt]# mysql-u root-p

Enter password:

mysql> use mk;

wKioL1gxCyrSQK_IAAAPnCiytvo609.png

排错:

同步之前如果怀疑主从数据同步可以采上面冷备份进程拷贝法或者在从服务器上命行同步方法。

实战:mysql主主配置

mysql主:服务端:xuegod63.cn IP:192.168.1.63

mysql主:服务端:xuegod64.cn IP:192.168.1.64

配置xuegod64 :身份1:xuegod63

身份2:xuegod63的从。

root@xuegod64 ~]# vim/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

server-id=2

master-host=192.168.1.63

master-user=slave

master-password=123456

####to master

log-bin=mysqlslave-bin-log

binlog-do-db=mk

binlog-ignore-db=mysql #避免同步mysql用户 相关配置。

授权名为slave64用户登录密码及权限:

[root@xuegod64 opt]# mysql-u root-p123456

mysql> grant replication slave on *.* to slave64@’192.168.1.63′ identified by ‘123456’;

[root@xuegod64 opt]# service mysqld restart

[root@xuegod64 ~]# mysql-u root-p

Enter password:

wKioL1gxCxrh9wJKAAAhLNrXMZA500.png

#说明xuegod64 作为mysql 主已经成功。

配置xuegod63 :身份1:xuegod64的主。

身份2:xuegod64的从。

[root@xuegod63 ~]# vim/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

### to master-64

symbolic-links=0

log-bin=mysqllog

server-id=1

binlog-do-db=mk

### to slave-64

master-host=192.168.1.64

master-user=slave64

master-password=123456

replicate-do-db=mk

[root@xuegod63 ~]# service mysqld restart

[root@xuegod63 ~]# mysql-u root-p

Enter password:123456

mysql> show slave status \G;

ERROR 2006 (HY000): MySQL server has gone away

No connection.Trying to reconnect…

Connection id: 4

Current database: mk

*************************** 1.row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.1.64 #主服务器是64

Master_User: slave64 #授权的用户是slave64

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysqlslave-bin-log.000001

Read_Master_Log_Pos: 106

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 260

Relay_Master_Log_File: mysqlslave-bin-log.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: mk

Replicate_Ignore_DB:

测试主主数据同步:

xuegod64主服务器添加表

[root@xuegod64 ~]# mysql-u root-p

Enter password:123456

mysql> use mk;

mysql> create table test2(id int);

mysql> create table xuegod (id int);

mysql> insert into test2 values(10);

mysql> insert into xuegod values(100);

xuegod63从服务器-测试

[root@xuegod63 ~]# mysql-u root-p

Enter password:123456

mysql> use mk;

wKiom1gxCweiA0j-AAAfDMBpGXI409.png

wKiom1gxCwfSMHjeAAAhHW6M8cc961.png

展开阅读原文



【mysql一主三从解决什么的】

mysql一主三从解决什么的 相关内容














基于GTID的 Mysql 主从数据库的复制
2020-03-09 17:18:49
qq_35887546
阅读数 32
  • MySQL DBA数据库运维高薪必备教程

    MySQL是当前世界上应用最广泛的关系型数据库。
    十年前错过了Oracle,十年后就不要再错过MySQL,在这互联网盛世的时代,MySQLDBA供不应求,同等条件下薪水已远远超过了OracleDBA。
    想要成为高级的MySQLDBA,除了自身努力之外,还需要一份”靠谱”的视频教程。由黑马程序员Linux云计算+运维开发学科精心打造《MySQL
    DBA数据库运维高薪必备教程》,让你从数据库小白成长为高薪的MySQL DBA大神。 大纲: 1、MySQL数据库概述
    2、Linux系统环境准备 3、MySQL的三种安装方式(YUM、GLIBC、源码) 4、MySQL数据库操纵语言之SQL
    5、MySQL备份与还原(逻辑备份) 6、PerconaXtraBackup专业备份工具(全量备份与增量备份)
    7、MySQL主从复制(AB复制、基于GTIDs的主从复制实践) 8、MySQL半同步复制 9、MHA(数据库高可用解决方案)
    ……



    2425
    人正在学习

    去看看
    传智

  • 一、主从复制存在的问题以及解决办法
    • 1.数据库同步是怎样进行的
    • 2.数据库是靠什么同步的
    • 3.从节点怎么知道要从哪块进行同步
    • 4:pos与GTID有什么区别
  • 二、GTID的概念
  • 三、GTID的组成
  • 四、GTID的优势
  • 五、GTID的工作原理
  • 六、配置基于GTID的 Mysql 主从数据库的复制
    • 配置server1(主库)
    • 配置server2(从库)
    • 测试:
    • 结论:

问题:


解决方法:


master用户写入数据,生成event记到binary log中.
slave接收master上传来的binlog,然后按顺序应用,重现master上的用户操作。

主从复制,默认是通过pos复制(postion),就是说在日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制时从节点时,要输入master的log_pos值就是这个原因,要求它从哪个pos开始同步数据库里的数据,这也是传统复制技术, MySQL5.6增加了GTID复制,GTID就是类似于pos的一个作用,不过它是整个mysql复制架构全局通用的,就是说在这整个mysql冗余架构中,它们的日志文件里事件的GTID值是一致的.

上面也说了,一开始是自己设置的从节点从主节点的日志文件里的pos开始复制,以后就自己去读取上一次同步到哪一块,接着同步.

两者都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体,pos就是局部的,GTID就是全局的。

  1. 全局事务标识:。
  2. GTID是一个事务一一对应,并且全局唯一ID。
  3. 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
  4. GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启。
  5. 而是使用MASTER_AUTO_POSTION=1的方式开始复制。
  6. MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。

  • ,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
  • ,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。

#示例:


前面的一串为服务器的,即,后面的为

  1. 更简单的实现failover,不用以前那样在需要找log_file和log_pos。
  2. 更简单的搭建主从复制。
  3. 比传统的复制更加安全。
  4. GTID是连续的没有空洞的,保证数据的一致性,零丢失
  5. 借助GTID,在发生主备切换的情况下,MySQL的其它Slave可以自动在新主上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
  1. 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
  2. binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
  3. sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
  4. 如果有记录,说明该GTID的事务已经执行,slave会忽略。
  5. 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。在解析过程中会判断是否有主键,如果有就用二级索引,如果没有就用全部扫描。

1.修改配置文件(/etc/my.cnf)并重启mysql


修改完配置文件之后,重启mysqld服务


2.查看主库状态


在这里插入图片描述

1.修改配置文件(/etc/my.cnf)并重启mysql


修改完配置文件之后,重启mysqld服务


2.设定从库,将主库与从库连接起来,并开启从库

登录server2(从库)自己的数据库进行设置


查看从库状态:
如果Slave_IO_Running和Slave_SQL_Running都为yes,则表示正常
在这里插入图片描述

下图记录了gtid的变化

在这里插入图片描述

1.在主库端的数据库westos下的表usertb中,插入信息


在主库上查看gtid号的改变


在这里插入图片描述

2.从库端查看是否存在在主库中添加的内容

在这里插入图片描述
此时可以在从库上查看gtid号码的改变。

在这里插入图片描述

从库看到的数据和主库看到的数据是一致的,代表基于gtid的主从复制搭建成功

展开阅读原文



【mysql一主三从解决什么的】

mysql一主三从解决什么的 相关内容













Mysql的主从复制(三)

阅读数 34

一 mysql主从复制的优化说明:5.7之后才引出的GTID:不需要再指明要读取的二进制日志文件,也不需要知道主库为了跟踪日志循环所维护文件的一个索引(position动态变化)实验:基于GTID的主从复制!重点:GTID和半同步复制解决的问题!master配置文件log-bin=mysql-binserver_id=1 #每一个都不一样!gtid_mode=ON…

博文
来自:wzj_110

mysql slave主从设置和相关问题解决

阅读数 675

一、主服务器设置:1.首先修改mysql的配置文件,使其支持二进制日志功能。打开主服务器的mysql配置文件:my.cnf加入如下三行代码:参数解释:(这段代码一定要放到mysqld标签下) log-bin=mysql-bin//将mysql二进制日志取名为mysql-bin   binlog_format=mixed//二进制日志的格式,有三种:sta

博文
来自:xuz0917

mysql 读写分离和主从同步原理

阅读数 56

目录一 为什么需要将 mysql 进行读写分离?二 mysql 主从同步原理?三 为什么主从同步会有数据延迟问题四 主从同步延迟问题解决方案一 为什么需要将 mysql 进行读写分离? 读写分离是基于数据库集群的主从同步来做的,所谓的读写分离是:写操作访问主库,读操作访问从库。现实生活中更多的应用场景是读多写少,读写分离可以将写的压力集中放在集群的主库,读的压力…

博文
来自:jack1liu

mysql 主从配置详解3 主从配置不一致问题

阅读数 33

主从读写与维护有三个待解决问题: 1.校验主从数据一致性问题 2.数据校验恢复 3.主从延迟问题1.校验主从数据一致性问题在理想情况下,备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误,备库同样可能因为MySQL自身的特 性导致数据不一致,例如MySQL的Bug感、网络中断、服务器崩溃,非正常关闭或者其…

博文
来自:qq_34341290

初探MySQL主从复制

阅读数 23

文章目录MySQL主从同步原理主库配置从库配置主从同步存在的情况分析情况一:中继日志损坏导致主从同步中断情况二:主从同步延迟如何判断主从延时产生延时的原因主从延时的解决方法binlog日志有statement、row、mixed三种格式如何修改MySQL的binlog日志格式binlog日志里是二进制格式的,需要通过mysqlbinlog的工具来查看具体内容利用binlog日志进行数据恢复的小小实…

博文
来自:weixin_42933971

没有更多推荐了,返回首页

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1793040