热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

主从复制_mysql主从复制简介

篇首语:本文由编程笔记#小编为大家整理,主要介绍了mysql主从复制简介相关的知识,希望对你有一定的参考价值。 

篇首语:本文由编程笔记#小编为大家整理,主要介绍了mysql主从复制简介相关的知识,希望对你有一定的参考价值。


 mysql  Replication概述:

mysql replication俗称MySQL AB 复制或者主从复制,是mysql官方推荐的数据同步技术。

优点:

1.通过增加从服务器来提高数据库平台的可靠性,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而缓解主服务器平台的高性能

2.提高数据安全性,因为数据已复制到从服务器,主服务器数据异常时,可以将从服务器复制进程终止来达到保护数据完整性的特点。

3.在主服务器上生成实时数据,而在从服务器上分析这些数据,从而缓解主服务器的性能。

MySQL复制类型:

异步复制:mysql默认的复制就是异步,主库在执行完客户端提交的实务后会立即将结果返给客户端,并不关心从库是否已经接受并处理。

全同步复制:当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然受到严重影响,返回客户端的响应速度会被拖慢。

半同步复制:主库在执行完客户端提交的事务后不是立即返回给客户端,而是至少一个从库接收到并写入到relay log 中才返回给客户端。相对于异步复制,半同步复制 提高了数据的安全性,同时也造成了一定程度的延迟,这个延迟做少是一个TCP/IP往返的时间。所以半同步最好在低延时的网络中使用。当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制的从服务器及时收到信息为止。

 

半同步复制的潜在问题

 

客户端事务在存储引擎层提交后,在得到从库确认的过程中,主库宕机了。此时可能的情况有两种:

 



  • 事务还没发送到从库上:此时,客户端会收到事务提交失败的信息,客户端会重新提交该事务到新的主上,当宕机的主库重新启动后,以从库的身份重新加入到该主从结构中,会发现,该事务在从库中被提交了两次,一次是之前作为主的时候,一次是被新主同步过来的。

 



  • 事务已经发送到从库上:此时,从库已经收到并应用了该事务,但是客户端仍然会收到事务提交失败的信息,重新提交该事务到新的主上。

MySQL支持的复制模式:

基于 SQL 语句的复制(statement-based replication, SBR):在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句,效率比较高。

基于行的复制(row-based replication, RBR):主服务器把表的行变化作为事件写入到二进制日志中,主服务器把代表了行变化的事件复制到从服务中。

混合模式复制(mixed-based replication, MBR):先采用基于语句的复制,一旦发现基于语句无法精确复制时,再采用行。

 

在MySQL5.1.4之前的版本都只能使用基于 SQL 语句的复制方式,MySQL5.6.5和往后的版本是基于global transaction identifiers(GTIDs)来进行事务复制。当使用GTIDs时可以大大简化复制过程,因为GTIDs完全基于事务,只要在主服务器上提交了事务,那么从服务器就一定会执行该事务。

 

通过设置服务器的系统变量binlog_format来指定要使用的格式:


RBR 的优点



  • 任何情况都可以被复制,这对复制数据来说是最安全可靠的

  • 更少的行级锁表

  • 和其他大多数数据库系统的复制技术一样

  • 多数情况下,从服务器上的表如果有主键的话,复制就会快很多

  • Binlog 文件较大

  • 复杂的回滚时 binlog 中会包含大量的数据

  • 主服务器上执行 多个UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而且只写为一个操作事物,这会导致频繁发生 binlog 的并发写问题

  • 不能通过查看日志来审计执行过的sql语句,不过可以通过使用mysqlbinlog  --base64-output=decode-rows --verbose来查看数据的 变动

  • 历史悠久,技术成熟· binlog 文件较小

  • binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况

  • binlog可以用于实时的还原,而不仅仅用于复制

  • 主从版本可以不一样,从服务器版本可以比主服务器版本高

  • 不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。

  • 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁

  • 对于一些复杂的语句,在从服务器上的耗资源情况会更严重


RBR 的缺点

 



  • Binlog 文件较大

  • 复杂的回滚时 binlog 中会包含大量的数据

  • 主服务器上执行 多个UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而且只写为一个操作事物,这会导致频繁发生 binlog 的并发写问题

  • 不能通过查看日志来审计执行过的sql语句,不过可以通过使用mysqlbinlog  --base64-output=decode-rows --verbose来查看数据的 变动

 


SBR 的优点

 



  • 历史悠久,技术成熟· binlog 文件较小

  • binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况

  • binlog可以用于实时的还原,而不仅仅用于复制

 

主从版本可以不一样,从服务器版本可以比主服务器版本高

 


SBR 的缺点


 



  • 不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。

  • 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁


 

对于一些复杂的语句,在从服务器上的耗资源情况会更严重



  • 如下函数的语句不能被正确地复制:load_file(); uuid(), uuid_short(); user(); found_rows(); sysdate(); get_lock(); is_free_lock(); is_used_lock(); master_pos_wait(); rand(); release_lock(); sleep(); version();

  • 在日志中出现如下警告信息的不能正确地复制:[Warning] Statement is not safe to log in statement format.或者在客户端中出现show warnings

  • Insert … select语句会执行大量的行级锁表

 

无论选择哪种方式复制,都会影响到复制的效率以及服务器的损耗,以及数据一致性问题,目前其实没有很好的客观手段去评估一个系统更适合哪种方式的复制

 

关于主从同步的监控问题,Mysql 有主从同步的状态信息,可以通过命令 show slave status获取,除了获知当前是否主从同步正常工作,另外一个重要指标就是 Seconds_Behind_Master,从字面理解,它表示当前 MySQL 主从数据的同步延迟,单位是秒。但这个指标从 DBA 的角度并不能简单的理解为延迟多少秒,感兴趣的同学可以自己去研究,但对于应用来说,简单的认为是主从同步的时间差就可以了,另外,当主从同步停止以后,重新启动同步,这个数值可能会是几万秒,取决于主从同步停止的时间长短,我们可以认为数据此时有很多天没有同步了,而这个数值越接近零,则说明主从同步延迟最小,我们可以采集这个指标并汇聚曲线图,来分析我们的数据库的同步延迟曲线,然后根据此曲线,给出一个合理的阀值,主从同步的时延小于阀值时,我们认为从库是同步的,此时可以安全的从从库读取数据。


复制的工作过程

 

 该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。


 


复制过程的限制


 



  • MySQL5.6之前的版本复制操作在Slave上执行是串行化的,Master上的并行更新会导致数据复制延迟。

  • 所有MYSQL服务器的版本都要高于3.2,还有一个基本的原则就是从服务器的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。


 

 



推荐阅读
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了PostgreSQL与MySQL在SQL语法上的主要区别,包括如何使用COALESCE替代IFNULL、金额格式化的方法、别名处理以及日期处理等关键点。 ... [详细]
  • 机器学习实践:逻辑回归与过拟合控制
    本文深入探讨了逻辑回归在机器学习中的应用,并详细解释了如何通过正则化等方法来有效避免模型的过拟合问题。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Jenkins API当前未直接提供获取任务构建队列长度的功能,因此需要通过解析HTML页面来间接实现这一需求。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 在处理大量联系人数据的批量插入操作时,发现现有方法的执行效率低下,尤其是在处理数十条记录以上时,与导出操作的速度形成鲜明对比。本文将探讨如何通过代码优化来提升批量插入联系人的效率。 ... [详细]
author-avatar
jajajaja幸福_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有