关于主从复制:MySQL主从复制原理剖析与应用实践

vivo 互联网服务器团队- Shang YongxingMySQL Replication(主从复制)是指数据变动能够从一个MySQL Server被复制到另一个或多个MySQL Server上,通过复制的性能,能够在单点服务的根底上裁减数据库的高可用性、可扩展性等。 一、背景MySQL在生产环境中被宽泛地利用,大量的利用和服务都对MySQL服务存在重要的依赖关系,能够说如果数据层的MySQL实例产生故障,在不具备牢靠降级策略的背景下就会间接引发下层业务,甚至用户应用的阻碍;同时MySQL中存储的数据也是须要尽可能地缩小失落的危险,以防止故障时呈现数据失落引发的资产损失、客诉等影响。 在这样对服务可用性和数据可靠性需要的背景下,MySQL在Server层提供了一种牢靠的基于日志的复制能力(MySQL Replication),在这一机制的作用下,能够轻易构建一个或者多个从库,进步数据库的高可用性、可扩展性,同时实现负载平衡: 实时数据变动备份主库的写入数据会继续地在冗余的从库节点上被执行保留,缩小数据失落的危险横向拓展节点,撑持读写拆散当主库自身接受压力较大时,能够将读流量扩散到其它的从库节点上,达成读扩展性和负载平衡高可用性保障当主库产生故障时,能够疾速的切到其某一个从库,并将该从库晋升为主库,因为数据都一样,所以不会影响零碎的运行具备包含但不限于以上个性的MySQL集群就能够笼罩绝大多数利用和故障场景,具备较高的可用性与数据可靠性,以后存储组提供的生产环境MySQL就是基于默认的异步主从复制的集群,向业务保障可用性99.99%,数据可靠性99.9999%的在线数据库服务。 本文将深入探讨MySQL的复制机制实现的形式, 同时探讨如何具体地利用复制的能力来晋升数据库的可用性,可靠性等。 二、复制的原理2.1 Binlog 的引入从比拟宽泛的角度来探讨复制的原理,MySQL的Server之间通过二进制日志来实现实时数据变动的传输复制,这里的二进制日志是属于MySQL服务器的日志,记录了所有对MySQL所做的更改。这种复制模式也能够依据具体数据的个性分为三种: Statement:基于语句格局Statement模式下,复制过程中向获取数据的从库发送的就是在主库上执行的SQL原句,主库会将执行的SQL原有发送到从库中。Row:基于行格局Row模式下,主库会将每次DML操作引发的数据具体行变动记录在Binlog中并复制到从库上,从库依据行的变更记录来对应地批改数据,但DDL类型的操作仍然是以Statement的格局记录。Mixed:基于混合语句和行格局MySQL 会依据执行的每一条具体的 SQL 语句来辨别看待记录的日志模式,也就是在 statement 和 row 之间抉择一种。最早的实现是基于语句格局,在3.23版本被引入MySQL,从最后起就是MySQL Server层的能力,这一点与具体应用的存储引擎没有关联;在5.1版本后开始反对基于行格局的复制;在5.1.8版本后开始反对混合格局的复制。 这三种模式各有优劣,相对来说,基于Row的行格局被利用的更宽泛,尽管这种模式下对资源的开销会偏大,但数据变动的准确性以及可靠性是要强于Statement格局的,同时这种模式下的Binlog提供了残缺的数据变更信息,能够使其利用不被局限在MySQL集群零碎内,能够被例如Binlogserver,DTS数据传输等服务利用,提供灵便的跨零碎数据传输能力, 目前互联网业务的在线MySQL集群全部都是基于Row行格局的Binlog。 2.2  Binlog 的要点2.2.1 Binlog事件类型对于Binlog的定义而言,能够认为是一个个繁多的Event组成的序列,这些独自的Event能够次要分为以下几类: 各类Event呈现是具备显著的法则的: XID_EVENT标记一个事务的结尾当产生了DDL类型的QUERY_EVENT,那么也是一次事务的完结提交点,且不会呈现XID_EVENTGTID_EVENT只有开启了GTID_MODE(MySQL版本大于5.6)TABLE_MAP_EVENT必然呈现在某个表的变更数据前,存在一对多个ROW_EVENT的状况除了下面和数据更贴近的事件类型外,还有ROTATE_EVENT(标识Binlog文件产生了切分),FORMAT_DESCRIPTION_EVENT(定义元数据格式)等。 2.2.2 Binlog的生命周期Binlog和Innodb Log(redolog)的存在形式是不同的,它并不会轮转反复覆写文件,Server会依据配置的单个Binlog文件大小配置一直地切分并产生新的Binlog,在一个.index文件记录以后硬盘上所有的binlog文件名,同时依据Binlog过期工夫回收删除掉过期的Binlog文件,这两个在目前自建数据库的配置为单个大小1G,保留7天。 所以这种机制背景下,只能在短期内追溯历史数据的状态,而不可能残缺追溯数据库的数据变动的,除非是还没有产生过日志过期回收的Server。  2.2.3 Binlog事件示例Binlog是对Server层失效的,即便没有从库正在复制主库,只有在配置中开启了log_bin,就会在对应的本地目录存储binlog文件,应用mysqlbinlog关上一个Row格局的示例binlog文件: 如上图,能够很显著地留神到三个操作,创立数据库test, 创立数据表test, 一次写入引发的行变更,可读语句(create, alter, drop, begin, commit.....)都能够认为是QUERY_EVENT,而Write_rows就属于ROW_EVENT中的一种。 在复制的过程中,就是这样的Binlog数据通过建设的连贯发送到从库,期待从库解决并利用。 2.2.4 复制基准值Binlog在产生时是严格有序的,但它自身只具备秒级的物理工夫戳,所以依赖工夫进行定位或排序是不牢靠的,同一秒可能有成千盈百的事件,同时对于复制节点而言,也须要无效牢靠的记录值来定位Binlog中的水位,MySQL Binlog反对两种模式的复制基准值,别离是传统的Binlog File:Binlog Position模式,以及5.6版本后可用的全局事务序号GTID。 FILE Position只有开启了log_bin,MySQL就会具备File Position的位点记录,这一点不受GTID影响。 File: binlog.000001Position: 381808617这个概念相对来说更直观,能够间接了解为以后处在File对应编号的Binlog文件中,同时曾经产生了共计Position bytes的数据,如例子中所示即该实例曾经产生了381808617 bytes的Binlog,这个值在对应机器间接查看文件的大小也是匹配的,所以File Postion就是文件序列与大小的对应值。 基于这种模式开启复制,须要显式地在复制关系中指定对应的File和Position: CHANGE MASTER TO MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POSITION=381808617;这个值必须要精确,因为这种模式下从库获取的数据齐全取决于无效的开启点,那么如果存在偏差,就会失落或执行反复数据导致复制中断。 GTIDMySQL 会在开启GTID_MODE=ON的状态下,为每一个事务调配惟一的全局事务ID,格局为:server_uuid:id ...

April 11, 2023 · 2 min · jiezi

关于主从复制:MySQL主从复制延迟解决方案

后面一篇,咱们学习到了MySQL多版本并发管制(MVCC)实现原理,这一篇咱们接着学习MySQL主从复制模式下的提早解决方案。 MySQL主从提早是指从库的数据同步比主库略有提早,造成数据差别。MySQL主从复制模式个别采纳以下办法升高提早: 1、优化网络环境:主从复制时,减小主从服务器之间网络提早对数据库同步的影响。能够思考优化网络之间连贯的带宽、减少从库的硬件性能等。 2、减少从库数量:减少从库数量能够减少数据同步的速度和可靠性,同时也能缩小每个从库的累赘,进步从库响应速度。 3、调整数据库相干参数:能够调整一些MySQL数据库中的相干参数,比方调整binlog格局、binlog缓冲区大小、innodb_flush_log_at_trx_commit等参数,采纳半同步模式,以放慢数据的同步速度。 4、分区数据库:将数据库分成多个区,每个从库只复制本人所须要的数据区,能够无效的缩小排队梗塞、网络传输等方面的提早问题。 综上所述,优化网络环境、减少从库数量、调整数据库相干参数、分区数据库等办法能够无效的升高MySQL主从复制模式的提早。 什么是主从提早在探讨如何解决主从提早之前,咱们先理解下什么是主从提早。 为了实现主从复制,从库须要通过 I/O 线程获取主库中 dump 线程读取的 binlog 内容并写入到本人的中继日志 relay log 中,从库的 SQL 线程再读取中继日志,重做中继日志中的日志,相当于再执行一遍 SQL,更新本人的数据库,以达到数据的一致性。 与数据同步无关的工夫点次要包含以下三个: 1、主库执行完一个事务,写入 binlog,将这个时刻记为 T1; 2、之后传给从库,将从库接管完这个 binlog 的时刻记为 T2; 3、从库执行实现这个事务,将这个时刻记为 T3。 所谓主从提早,就是同一个事务,从库执行实现的工夫与主库执行实现的工夫之差,也就是 T3 - T1。 能够在备库上执行 show slave status 命令,它的返回后果外面会显示 seconds_behind_master,用于示意以后备库提早了多少秒。seconds_behind_master 的计算方法是这样的: 1、每个事务的 binlog 外面都有一个工夫字段,用于记录主库上写入的工夫; 2、备库取出以后正在执行的事务的工夫字段的值,计算它与以后零碎工夫的差值,失去 seconds_behind_master。 在网络失常的时候,日志从主库传给从库所需的工夫是很短的,即 T2 - T1 的值是十分小的。也就是说,网络失常状况下,主从提早的次要起源是从库接管完 binlog 和执行完这个事务之间的时间差。 因为主从提早的存在,咱们可能会发现,数据刚写入主库,后果却查不到,因为可能还未同步到从库。主从提早越重大,该问题也更加显著。 主从提早的起源主库和从库在执行同一个事务的时候呈现时间差的问题,次要起因包含但不限于以下几种状况: 1、有些部署条件下,从库所在机器的性能要比主库性能差。 2、从库的压力较大,即从库接受了大量的申请。 3、执行大事务。因为主库上必须等事务执行实现才会写入 binlog,再传给备库。如果一个主库上语句执行 10 分钟,那么这个事务可能会导致从库提早 10 分钟。 4、从库的并行复制能力。 主从提早的解决方案解决主从提早次要有以下计划: 1、配合 semi-sync 半同步复制; ...

March 16, 2023 · 2 min · jiezi

关于主从复制:mysql主从复制实现方法

筹备好两台装置好了mysql的机器(装置在不同的机器上),如果是给予虚拟机复制的机器则须要批改/var/lib/mysql/auto.cnf 文件中的uuid 确保两台机器的uuid不一样备份主库的数据到备库 两库统一在主库上执行(已有数据)执行命令 mysqldump -uroot -pBamboocloud@1234 -A --master-data=2 --single-transaction -R -E --triggers --max-allowed-packet=64M >/tmp/full.sql将二进制文件导入到 /tmp/full.sql 中 关上vim /tmp/full.sql 找到正文的这一行 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=3050;MASTER_LOG_FILE和MASTER_LOG_POS的值记录下来留作备份前面主从复制的时候要用到 而后将full.sql传输到备库所在的机器上 scp /tmp/full.sql root@10.88.1.184:/tmp 连贯到备库的mysql 执行下列命令:敞开二进制文件同步数据开启二进制文件 set sql_log_bin =0;source /tmp/full.sqlset sql_log_bin =1;此时数据同步实现 别离配置主备库的mysql配置文件 server_id=1 #指定MySQL的id log-bin=mysql-bin #开启二进制日志文件auto_increment_increment=2auto_increment_offset=1port=13306sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES -- sqlmode须要设置为非严格模式否则程序可能会报错 见https://www.cnblogs.com/zhoujinyi/p/8035413.htmllower_case_table_names=1default-storage-engine = INNODB# mysql 主从幂等模式slave_exec_mode=IDEMPOTENT# 跳过指定谬误slave-skip-errors=1032,1062 #疏忽谬误# 更新快的表不同步先replicate-ignore-table=bim.qrtz_scheduler_statereplicate-ignore-table=bim.tb_jgroupsping配置主从a) 在主库上创立可供复制的非凡账号 创立语句如下GRANT REPLICATION SLAVE ON *.* to 'replication'@'%' identified by 'Bamboocloud@1234';而后在从库上执行下列sql;CHANGE MASTER TO MASTER_HOST = '10.88.1.73', MASTER_USER = 'replication', MASTER_PORT =13306, MASTER_PASSWORD = 'Bamboocloud@1234', MASTER_LOG_FILE = 'mysql-bin.000008', MASTER_LOG_POS = 3050; master_host是主服务器的ipmaster_port=13306(这里没有配置,默认3306)master_user:Master 服务器受权用户,也就是 Master 后面创立的那个用户master_password:Master 服务器受权用户对应的明码master_log_file:Master binlog 文件名master_log_pos:Master binlog 文件中的 Postion 值 这个值代表从库从主库同步数据的节点(终点) ...

November 10, 2021 · 1 min · jiezi