当前位置: 首页 > 后端技术 > Java

高级程序员必知必知,本文详细讲解了MySQL主从同步的原理,推荐收藏

时间:2023-04-01 22:24:33 Java

1。MySQL主从同步实现方法MySQL主从同步是基于BinLog的,BinLog记录了原始的SQL语句。BinLog有三种日志格式,可以通过binlog_format配置参数指定。参数值含义Statement记录了原始SQL语句,会导致更新时间与原始数据库不一致。
例如update_time=now()Row记录每一行数据的变化,保证数据与原始数据库一致,但缺点是数据量大。MixedStatement和Row的混合模式默认采用Statement模式,涉及到日期和函数时使用Row模式,既减少了数据量,又保证了数据的一致性。常见的主从同步架构有一主多从和两主多从。2、MySQL主从同步的作用读写分离提高数据库性能容灾,当主服务器不可用时,从服务器提供服务,提高可用性冗余备份,数据在主服务器损坏丢失,从服务器保留backup一主多从架构:一般情况下,主库负责所有的读写请求,而从库只负责容灾和冗余备份。如果做了读写分离,主库负责写请求,从库负责读请求,可以提高数据库性能。双主多从架构:一般情况下,主库1负责所有读写请求,主库2不对外提供服务,仅用于容灾。与一主多从架构相比,双主多从架构可以减少停机时间,更快地恢复数据库的可用状态。3、主动同步原理当主库数据发生变化时,写入本地BinLog文件,从库IO线程发起请求dump主库BinLog文件。主库IO线程将BinLog文件推送到从库。将日志内容写入本地RelayLog文件。从库SQL线程中读取RelayLog文件的内容。从库SQL线程重新执行SQL语句。4.主从同步延迟问题主从同步最常遇到的问题就是主从同步延迟,可以在从库上执行showslavestatus命令查看延迟时间,Seconds_Behind_Master表示秒数的延迟。主从同步延迟的原因有哪些?从库机器性能差。主库负责所有的读写请求。从库仅用于备份。性能不好的机器都会用到,执行时间自然就慢了。读写与库分离后,主库负责写请求,从库负责读请求。互联网应用一般读请求比较多,所以从库中读取压力比较大,占用CPU资源也比较多。网络延迟主库的BinLog文件发送到从库时,可能会出现网络延迟,也可能导致从库数据跟不上。主库有一笔大交易。当主库有大事务需要执行5分钟时,将BinLog文件发送到从库。从库也需要至少执行5分钟,所以此时从库有5分钟的延迟。主从同步延迟的解决方法?从库机性能差。将从库更换为与主库规格相同的机器。来自图书馆的压力更大,更多的从属图书馆被用来分担阅读请求的压力。网络延迟联系运维或云服务商。主库有一个大事务,将大事务分成小事务执行。大事务不仅会造成从库的延迟,还可能造成死锁,降低数据库的并发性能。因此,尽量少用大事务。五、如何提高主从同步的性能1、从库开启多线程复制就是在主从同步的最后两步使用多线程。修改配置slave_parallel_workers=4,即启用4个复制线程。2、修改同步方式,改为异步主从同步。复制方式一共有三种:全同步复制。当主库执行一个事务,所有从库执行该事务时,返回成功给客户端。至少一个半同步复制的从库完成后,返回成功给客户端。异步复制主库执行完毕后,会立即返回成功,而不管从库是否执行完毕。如果对数据安全性要求不是那么高,可以将同步方式改为半同步复制或异步复制。3、修改slavebinlog配置,修改sync_binlog配置:sync_binlog=0,表示写入binlog时不立即刷新磁盘,由系统决定何时刷新磁盘。sync_binlog=1,每次写入binlog都会刷新磁盘,安全性高,性能差。sync_binlog=N,写入binlogN次刷新磁盘。从库的数据安全要求不是那么高,可以设置sync_binlog=0。修改innodb_flush_log_at_trx_commit配置:innodb_flush_log_at_trx_commit=0,每秒刷新一次事务日志到磁盘。innodb_flush_log_at_trx_commit=1,每个事务都刷新到磁盘。innodb_flush_log_at_trx_commit=2,每次事务不主动刷新磁盘,由系统决定何时刷新磁盘。从库的数据安全要求不是那么高,可以设置innodb_flush_log_at_trx_commit=2。知识点总结:文章持续更新中。可以在微信搜索“一光架构”第一时间阅读更多技术干货。