大家好,今天来为大家分享mysql主从同步的原理的一些知识点,和数据库主从同步原理的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
数据库主从同步原理
原理就是将数据库分为了主从库,一个主库用于写数据,多个从库完成读数据的操作。
2、主从库之间通过某种机制进行数据的同步,是一种常见的数据库架构。
高并发场景下,如何实现数据库主从同步
在谈这个特性之前,我们先来看看mysql的复制架构衍生史。MySQL的复制分为三种:第一种,即普通的replication。搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。但是这种架构数据是异步的,所以有丢失数据库的风险。第二种,即mysqlcluster。搭建也简单,本身也比较稳定,是mysql里面对数据保护最最靠谱的架构,也是唯一一个数据完全同步的架构,绝对的零丢失。不过性能就差远些了。第三种,即semi-syncreplication,半同步,性能,功能都介于以上两者之间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。“我们今天谈论第三种架构
我们知道,普通的replication,也即mysql的异步复制,依靠mysql二进制日志也即binarylog进行数据复制。比如两台机器,一台主机也即master,另外一台是从机,也即slave。
1.正常的复制为:事务一(t1)写入binlogbuffer;dumper线程通知slave有新的事务t1;binlogbuffer进行checkpoint;slave的io线程接收到t1并写入到自己的的relaylog;slave的sql线程写入到本地数据库。这时,master和slave都能看到这条新的事务,即使master挂了,slave可以提升为新的master。2.异常的复制为:事务一(t1)写入binlogbuffer;dumper线程通知slave有新的事务t1;binlogbuffer进行checkpoint;slave因为网络不稳定,一直没有收到t1;master挂掉,slave提升为新的master,t1丢失。
3.很大的问题是:主机和从机事务更新的不同步,就算是没有网络或者其他系统的异常,当业务并发上来时,slave因为要顺序执行master批量事务,导致很大的延迟。
为了弥补以上几种场景的不足,mysql从5.5开始推出了半同步。
即在master的dumper线程通知slave后,增加了一个ack,即是否成功收到t1的标志码。也就是dumper线程除了发送t1到slave,还承担了接收slave的ack工作。如果出现异常,没有收到ack,那么将自动降级为普通的复制,直到异常修复。
我们可以看到半同步带来的新问题:1.如果异常发生,会降级为普通的复制。那么从机出现数据不一致的几率会减少,并不是完全消失。2.主机dumper线程承担的工作变多了,这样显然会降低整个数据库的性能。3.在MySQL5.5和5.6使用after_commit的模式下,即如果slave没有收到事务,也就是还没有写入到relaylog之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从机,两边的数据就会出现不一致。在此情况下,slave会少一个事务的数据。
随着MySQL5.7版本的发布,半同步复制技术升级为全新的Loss-lessSemi-SynchronousReplication架构,其成熟度、数据一致性与执行效率得到显著的提升。
MySQL5.7对数据复制效率进行了改进1主从一致性加强支持在事务commit前等待ACK
新版本的semisync增加了rpl_semi_sync_master_wait_point参数来控制半同步模式下主库在返回给会话事务成功之前提交事务的方式。
该参数有两个值:
AFTER_COMMIT(5.6默认值)
master将每个事务写入binlog,传递到slave刷新到磁盘(relaylog),同时主库提交事务。master等待slave反馈收到relaylog,只有收到ACK后master才将commitOK结果反馈给客户端。
AFTER_SYNC(5.7默认值,但5.6中无此模式)
master将每个事务写入binlog,传递到slave刷新到磁盘(relaylog)。master等待slave反馈接收到relaylog的ack之后,再提交事务并且返回commitOK结果给客户端。即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relaylog中。
因此5.7引入了after_sync模式,带来的主要收益是解决after_commit导致的mastercrash主从间数据不一致问题,因此在引入after_sync模式后,所有提交的数据已经都被复制,故障切换时数据一致性将得到提升。
2性能提升支持发送binlog和接受ack的异步化
旧版本的semisync受限于dumpthread,原因是dumpthread承担了两份不同且又十分频繁的任务:传送binlog给slave,还需要等待slave反馈信息,而且这两个任务是串行的,dumpthread必须等待slave返回之后才会传送下一个events事务。dumpthread已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的TPS.
图:WithoutACKreceivingthread
为了解决上述问题,在5.7版本的semisync框架中,独立出一个ackcollectorthread,专门用于接收slave的反馈信息。这样master上有两个线程独立工作,可以同时发送binlog到slave,和接收slave的反馈。
图:WithACKreceivingthread3性能提升控制主库接收slave写事务成功反馈数量
MySQL5.7新增了rpl_semi_sync_master_wait_slave_count参数,可以用来控制主库接受多少个slave写事务成功反馈,给高可用架构切换提供了灵活性。
如图所示,当count值为2时,master需等待两个slave的ack
4性能提升
Binlog互斥锁改进
旧版本半同步复制在主提交binlog的写会话和dumpthread读binlog的操作都会对binlog添加互斥锁,导致binlog文件的读写是串行化的,存在并发度的问题。
MySQL5.7对binloglock进行了以下两方面优化
1.移除了dumpthread对binlog的互斥锁
2.加入了安全边际保证binlog的读安全
5性能提升组提交
5.7引入了新的变量slave-parallel-type,其可以配置的值有:
DATABASE(5.7之前默认值),基于库的并行复制方式;LOGICAL_CLOCK(5.7新增值),基于组提交的并行复制方式;
MySQL5.6版本也支持所谓的并行复制,但是其并行只是基于DATABASE的,也就是基于库的。如果用户的MySQL数据库实例中存在多个DATABASE,对于从机复制的速度的确可以有比较大的帮助,如果用户实例仅有一个库,那么就无法实现并行回放,甚至性能会比原来的单线程更差。
MySQL5.7中增加了一种新的并行模式:为同时进入COMMIT阶段的事务分配相同的序列号,这些拥有相同序列号的事务在备库是可以并发执行的。
MySQL5.7真正实现的并行复制,这其中最为主要的原因就是slave服务器的回放与主机是一致的即master服务器上是怎么并行执行的slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。
因此下面的序列中可以并发的序列为(其中前面一个数字为last_committed,后面一个数字为sequence_number):
trx11…..2trx21………….3trx31…………………….4trx42……………………….5trx53…………………………..6trx63………………………………7trx76………………………………..8
备库并行规则:当分发一个事务时,其last_committed序列号比当前正在执行的事务的最小sequence_number要小时,则允许执行。
因此,
a)trx1执行,last_commit<2的可并发,trx2,trx3可继续分发执行
b)trx1执行完成后,last_commit<3的可以执行,trx4可分发
c)trx2执行完成后,last_commit<4的可以执行,trx5,trx6可分发
d)trx3、trx4、trx5完成后,last_commit<7的可以执行,trx7可分发
综上所述
我们认为MySQL5.7版对Loss-Less半同步复制技术的优化,使得其成熟度和执行效率都得到了质的提高。我们建议在使用MySQL5.7作为生产环境的部署时,可以使用半同步技术作为高可用与读写分离方案的数据复制方案。
redis主从同步怎么实现
Redis主从同步是通过Redis的复制功能实现的。主节点将自己的数据发送给从节点,从节点接收数据并更新自己的数据,从而实现主从数据同步。
具体实现步骤如下:
1.配置主从节点:在主节点的配置文件中设置slaveof从节点的IP和端口号,从节点的配置文件中设置自己的IP和端口号。
2.主节点创建快照文件:主节点会定期创建快照文件,将自己的数据保存到磁盘上。
3.从节点连接主节点:从节点会向主节点发送SYNC命令,请求主节点发送数据给自己。
4.主节点发送数据:主节点收到SYNC命令后,会将自己的数据发送给从节点。如果主节点有新的写操作,也会将写操作发送给从节点。
5.从节点接收数据:从节点接收到主节点发送的数据后,会更新自己的数据。
6.从节点成为主节点:如果主节点出现故障,从节点会成为新的主节点,继续提供服务。
需要注意的是,主从同步是异步的,从节点的数据可能会比主节点的数据旧。如果需要保证数据的一致性,可以使用Redis的哨兵或集群功能。
MySQL主从复制能完美解决数据库的单点问题吗为什么
没有完美的解决方案。只有合适的解决方案。
当使用主从时,实际已经放弃了强一致性了。(既然题主只问单点问题,就不考虑访问量问题。即假设主从复制完全能支撑目前的系统访问。)
一般数据库主从设置:
主库可读可写
从库只读即系统既可以从主库获取数据,也可以从从库获取数据。数据写入主库后,自动同步到从库。
这构成了一个简单的分布式系统。根据cap定理,只能三选一。主从之间是最终一致,如果强一致,不但不会提高系统可用性,反而降低了系统可用性。
我们看上面的主从结构可能会出现哪些问题:
系统写入主库,再从主库查询。这就是个单点数据库,没有什么影响。
系统写入主库,再从从库查:-如果数据已经同步,则没有影响
-如果数据还未同步,则查询的是老数据
-如果同步出现了问题,则主从断开。如果系统无法感知,则查询到的可能一直是老数据。这里就需要对同步进行监控,当同步出现问题时,及时处理
主库挂掉。从库需要及时感知,并替换主库。同时需要再通知运维人员处理,否则又变成了单点。
从库挂掉。主库数据无法同步到从库。同样需要及时通知处理
如果主从切换自动化,那单点故障的概率也只是降低50%而已(主库或备库挂掉没人恢复的话)。
mysql主从还有必要备份吗
有备份的必要,防止数据库崩溃或者整个所在主机挂了,后续可以进行恢复。
关于mysql主从同步的原理,数据库主从同步原理的介绍到此结束,希望对大家有所帮助。