Mysql主从复制原理和作用(较详细)
最近一直在了解数据库的一些实现细节,今天结合网上的一些资料,总结一下Mysql的原理和作用。
什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库。一般在数据量较大的情况下会考虑,当然我们做的单机程序可能用不到这些内容,但是现在是个大数据时代,各种技术都会和分布式相联系,主要是为了进行负载均衡,数据库的主从复制其实就是为了解决数据过大,单机进行增删改查压力会比较大,所以把数据的增删改和查分开。
主从复制的作用
1 作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的评率,提高单个机器的I/O性能。
3 读写分离,使数据库能支持更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
也可以总结为以下情况:
1–在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
2–在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
3–当主服务器出现问题时,可以切换到从服务器。(提升性能)
主从复制的方式
1 一主一从,基础的主从结构
2 主主复制(两个主机在同一等级上,没有主从之分)
3 一主多从,适用于增删改少,查询多的业务
4 多主一从(Mysql 5.7开始支持),适用于增删改较多,查询少的业务
5 联级复制
主从复制实现原理
1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制到从数据库。
3.让其转为从数据库的relay-log中继日志,通过中继日志将朱数据库中的SQL语句同步到从数据库,保证主从数据库一致。
4.具体需要三个线程来操作:
1.binlog输出线程:每当有从库连接到主库发送请求时,主库都会创建一个线程然后发送binlog内容到从库。
同样,在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
1从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
2.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。
主从复制的优点
好处一:实现服务器负载均衡
通过服务器复制功能,可以在主服务器和从服务器之间实现负载均衡。即可以通过在主服务器和从服务器之间切分处理客户查询的负荷,从而得到更好地客户相应时间。通常情况下,数据库管理员会有两种思路。
一是在主服务器上只实现数据的更新操作。包括数据记录的更新、删除、新建等等作业。而不关心数据的查询作业。数据库管理员将数据的查询请求全部 转发到从服务器中。这在某些应用中会比较有用。如某些应用,像基金净值预测的网站。其数据的更新都是有管理员更新的,即更新的用户比较少。而查询的用户数 量会非常的多。此时就可以设置一台主服务器,专门用来数据的更新。同时设置多台从服务器,用来负责用户信息的查询。将数据更新与查询分别放在不同的服务器 上进行,即可以提高数据的安全性,同时也缩短应用程序的响应时间、提高系统的性能。
二是在主服务器上与从服务器切分查询的作业。在这种思路下,主服务器不单单要完成数据的更新、删除、插入等作业,同时也需要负担一部分查询作 业。而从服务器的话,只负责数据的查询。当主服务器比较忙时,部分查询请求会自动发送到从服务器重,以降低主服务器的工作负荷。当然,像修改数据、插入数 据、删除数据等语句仍然会发送到主服务器中,以便主服务器和从服务器数据的同步。
好处二:通过复制实现数据的异地备份
可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份*下,是将数据备份在本地。此时备份
作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也
不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业
带来比较大的损失。而如果使用复制来实现对数据的备份,就可以在从服务器上对数据进行备份。此时不仅不会干扰主服务气的正常运行,而且在备份过程中主服务器可以继
续处理相关的更新作业。同时在数据复制的同时,也实现了对数据的异地备份。除非主服务器和从服务器的两块硬盘同时损坏了,否则的话数据库管理员就可以在最
短时间内恢复数据,减少企业的由此带来的损失。
好处三:提高数据库系统的可用性
数据库复制功能实现了主服务器与从服务器之间数据的同步,增加了数据库系统的可用性。当主服务器出现问题时,数据库管理员可以马上让从服务器作为主服务器,用来数据的更新与查询服务。然后回过头来再仔细的检查主服务器的问题。此时一般数据库管理员也会采用两种手段。
一是主服务器故障之后,虽然从服务器取代了主服务器的位置,但是对于主服务器可以采取的操作仍然做了一些限制。如仍然只能够进行数据的查询,而
不能够进行数据的更新、删除等操作。这主要是从数据的安全性考虑。如现在一些银行系统的升级,在升级的过程中,只能够查询余额而不能够取钱。这是同样的道理。
二是从服务器真正变成了主服务器。当从服务器切换为主服务器之后,其地位完全与原先的主服务器相同。此时可以实现对数据的查询、更新、删除等操
作。为此就需要做好数据的安全性工作。即数据的安全策略,要与原先的主服务器完全相同。否则的话,就可能会留下一定的安全隐患。
存在问题
从数据库具有读log文件的延迟,如何解决?
由于从数据库存在更新从库中SQL数据的延迟,万一主库在从库读取binlog的时候宕机,那么数据可能丢失
主要是由于从库只有一个sql Thread去更新从库数据,但是主库写压力大,也就是主库会有很多写任务,同时还要有IO线程与从库进行 binlog 输出,所以复制很可能延时
解决方法:
1 半同步复制—解决数据丢失的问题
2 并行复制—-解决从库复制延迟的问题
正常主从复制(异步复制)的方式,也就是主库直接更新数据,但是主从的复制是在主库更新后或者过程中进行,这样显然容易使数据出问题,比如会丢失修改数据等:
半同步复制,可以看到当主库进行更新时,在binlog写的过程中,会主动通知Dump进程(输出IO进程)开启,与从库进行数据的同步更新,然后从库会返回一个ack信号给主库的Dump进程,收到ack确认后,会给用户提交的修改进程发送信号,让其继续执行,当然当从库比较多时,这种方法不能保证全部的从库都进行更新,如果网络异常或从库宕机,主库压力过大等,都会造成超时,影响客户响应,并行复制可以一定程度上解决类似问题:
主从复制和主主复制区别?
最大区别是 主从是对主操作数据,从会实时同步数据。反之对从操作,主不会同步数据,还有可能造成数据紊乱,导致主从失效。
主主则是无论对那一台操作,另一个都会同步数据。一般用作高容灾方案
本文地址:https://blog.csdn.net/qq_29750461/article/details/107125427