MySQL主从复制是一种异步、基于日志的、单向的数据库复制技术,它通过在主服务器上启用二进制日志(binlog)并将其发送给一个或多个从服务器,实现了从服务器与主服务器之间的数据同步。以下是MySQL主从复制原理的详细解释:
一、主服务器(Master)操作
- 启用二进制日志:主服务器需要启用二进制日志功能,并记录所有的数据库变更操作。这些操作包括数据的增、删、改等,都会被顺序地写入到二进制日志文件中。
- 日志写入:当主服务器上的数据库发生变更时,这些变更会被实时地记录到二进制日志中。二进制日志文件按照时间顺序排列,包含了所有数据库操作的记录。
二、从服务器(Slave)操作
- 连接主服务器:从服务器通过I/O线程连接到主服务器,并请求复制数据。这个连接过程通常是通过执行
CHANGE MASTER TO
语句来完成的,该语句提供了主服务器的连接信息以及二进制日志的起点位置。 - 获取二进制日志:主服务器在接收到从服务器的请求后,会为其启动一个dump线程。这个线程负责读取二进制日志中的内容,并将其发送给从服务器的I/O线程。从服务器的I/O线程在接收到这些日志内容后,会将其写入到本地的中继日志(relay log)文件中。
- 执行日志内容:从服务器的SQL线程会实时监控中继日志的内容是否有更新。一旦发现有新的日志内容,SQL线程就会解析这些日志内容中的SQL语句,并在从服务器上执行这些语句,以实现数据的同步。
三、复制过程及方式
-
复制过程:
- 从服务器通过I/O线程与主服务器的dump线程进行通信,获取主服务器的二进制日志内容。
- 从服务器将获取到的二进制日志内容写入到本地的中继日志文件中。
- 从服务器的SQL线程读取中继日志文件中的内容,并解析成SQL语句在本地执行。
-
复制方式:
- 基于语句的复制:复制进程将主服务器上的SQL语句复制到从服务器上执行。这种方式在简单场景下效率较高,但在某些复杂场景下可能会导致数据不一致。
- 基于行的复制:复制进程将主服务器上的数据库行变更操作复制到从服务器上执行。这种方式能够避免基于语句复制中可能出现的数据不一致问题,但在某些场景下可能会占用较多的存储空间。
- 混合复制:复制进程根据操作类型和情况选择使用基于语句的或基于行的复制方式。这种方式结合了前两种复制方式的优点,能够更灵活地应对不同的场景。
四、复制延迟及优化
-
复制延迟:由于网络延迟、从服务器的负载等原因,从服务器上的数据可能会滞后于主服务器上的数据。这种滞后被称为复制延迟。
-
优化方法:
- 尽量减少主服务器上的大事务操作,将大事务拆分为小事务进行分批更新。
- 减少从服务器的数量,以降低主服务器的负载和复制延迟。
- 使用多线程复制技术,提高从服务器同步数据的效率。
- 监控和优化网络性能,减少网络延迟对复制延迟的影响。
综上所述,MySQL主从复制技术通过记录主服务器上的数据库变更操作,并将其同步到从服务器上,实现了数据的实时备份和读写分离。这种技术在提高数据可用性、可靠性和性能方面具有重要作用。
具体操作层面,请参考下面两篇文章
k8s搭建一主三从的mysql8集群---无坑-CSDN博客
k8s搭建双主的mysql8集群---无坑-CSDN博客