多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 主节点和从节点 结果集:每个保存数据库完整数据集的节点称之为副本 问题:有了多个结果集,如何确保所有的副本数据一致? ## MySQL主从同步的作用 1. 读写分离,提升数据库性能 2. 容灾恢复,主服务器不可用时,从服务器提供服务,提高可用性 3. 冗余备份,主服务器数据损坏丢失,从服务器保留备份 ## MySQL主从同步实现 1. 当有数据更改语句执行时,MySQL主库要在更新数据的同时,写二进制日志,将数据修改的内容记录进入日志中。 2. MySQL从库上运行这一些I/O进程,这个进程会监视MySQL主库上的二进制日志,当发现修改时,会立即同步到自身的中继日志。 3. MySQL从库上还会运行一个SQL进程,该进程用于监视自身的中继日志,当发现自身的中继日志发生改变时,立即将该中继日志改变对应的数据更改操作写入自身的数据库。 ## MySQL主从同步方式 MySQL主从同步有三种方式,这些方式的差异主要存在于写入日志的内容不同,也会导致MySQL主从同步性能上的区别。 1. 基于SQL语句的复制。 基于SQL语句的复制模式的Binlog格式为STATEMENT,在这种模式下,每一条修改数据的SQL语句都会记录到Binlog中,这样做的优点是并不需要记录每一条SQL语句和每一行的变化,减少了二进制日志日志量,节约了I/O。但是会导致某些情况下主、从库数据不一致的场景。 2. 基于行的复制。 不记录每条SQL语句,仅记录哪条记录数据被修改了,以及修改后的结果。这样做的优点是不容易出现主、从库数据不一致的场景,但是缺点在于会产生大量日志。 3. 混合模式复制。 在混合模式下,边的复制采用基于SQL语句的复制方式,只有当该方式无法复制(比如触发器、存储过程等等)时,才会使用基于行的方式 ## 主从同步延迟问题 主从同步最常遇到的问题就是主从同步延迟,可以通过在从库上执行show slave status命令查看延迟时间,Seconds_Behind_Master表示延迟的秒数。 ## 主从同步延迟的原因有哪些? 1. 从库机器性能较差 主库负责所有读写请求,从库只用来备份,会用性能较差的机器,执行时间自然较慢。 解决方式: 增加从库服务器性能 2. 从库压力更大 读写分离后,主库负责写请求,从库负责读请求。 互联网应用一般读请求更多,所以从库读压力更大,占用更多CPU资源。 解决方式: 增加从库数量,分担读请求压力 3. 网络延迟 当主库的Bin Log文件往从库上发送时,可能产生网络延迟,也会导致从库数据跟不上。 解决方式: 增加带宽 4. 主库有大事务 当主库上有个大事务需要执行5分钟,把Bin Log文件发送到从库,从库至少也需要执行5分钟,所以这时候从库就出现了5分钟的延迟。 解决方式: 把大事务分割成小事务执行,大事务不但会产生从库延迟,还可能产生死锁,降低数据库并发性能,所以尽量少用大事务。 ## 三种复制方式 ### 全同步复制技术 当主库执行完一个事务,并且所有从库都执行完该事务后,才给客户端返回成功。性能不是很好,会影响用户体验。 对数据一致性有严格要求的场合,比如金融、交易之类的场景用的比较多。 ### 异步复制技术 主库执行完后,立即返回成功,不关心从库是否执行完成。这种方式保证了系统的可用性,但牺牲了数据的一致性。 异步复制技术大多应用在对用户请求响应时延要求很高的场景,MySQL 集群默认的复制模式 ### 半同步复制技术 至少有一个从库执行完成后,就给客户端返回成功。 半同步复制技术通常有两种方式:(一个或者一半) 1. 一种是,当主数据库收到多个备数据库中的**某一个**回复数据同步成功后,便可给用户响应写操作完成; 2. 另一种是,主数据库等**超过一半节点**(包括主数据库)回复数据更新成功后,再给用户响应写操作成功。