主从复制的过程
MySQL 主从复制是在一个或多个从服务器上复制另一个服务器(主服务器)的数据更改。
准备阶段
在主服务器上,首先需要开启二进制日志记录功能。
这需要在 MySQL 的配置文件 (my.cnf
或 my.ini
) 中通过设置以下参数来实现:
server-id
: 每个参与复制的服务器都需要一个唯一的 ID。log_bin
: 指定启用二进制日志。binlog_format
: 指定二进制日志的格式(Statement、Row 或 Mixed)。binlog_cache_size
: 设置每个事务使用的缓存大小。max_binlog_cache_size
: 设置最大的缓存大小。
二进制日志
当任何数据修改操作发生时(如 INSERT、UPDATE、DELETE),MySQL 会将这些更改记录到二进制日志文件中。
二进制日志记录了数据库的更改历史,包括 SQL 语句和行数据的变化。
根据配置的不同,这些更改可以是基于语句的 (SBR)、基于行的 (RBR) 或混合模式 (MBR)。
从服务器配置
需要在配置文件中指定 server-id
,确保与主服务器和其他从服务器的 ID 不同。
配置从服务器连接到主服务器的信息,包括主服务器的 IP 地址、端口、用户名和密码等。
初始化从服务器
从服务器通过 CHANGE MASTER TO
命令来指定主服务器的信息和复制起点。
可以通过以下命令来初始化复制:
CHANGE MASTER TO
MASTER_HOST='主服务器IP',
MASTER_USER='复制用户',
MASTER_PASSWORD='复制用户的密码',
MASTER_LOG_FILE='二进制日志文件名',
MASTER_LOG_POS=二进制日志位置;
如果是第一次设置从服务器,通常还需要通过 FLUSH TABLES WITH READ LOCK
命令锁定所有表并导出数据,然后在从服务器上导入这些数据。
复制过程
一旦配置完毕,从服务器通过一个特殊的进程(称为“IO线程”或“I/O Thread”)连接到主服务器,并请求从特定位置开始的日志数据。
主服务器上的另一个特殊进程(称为“Log Dump Thread”)负责向从服务器发送这些日志数据。
从服务器接收到这些日志后,会先将它们存储在本地的一个名为“中继日志”(Relay Log)的文件中。
一旦日志数据被存储在中继日志中,从服务器上的另一个特殊进程(称为“SQL线程”或“SQL Thread”)就会读取这些日志,并在从服务器上执行相应的操作,从而使得从服务器的数据状态与主服务器保持一致。
主从复制的模式
同步复制
在同步复制中,当主服务器上提交一个事务时,它不会立即返回成功给客户端,直到所有从服务器都确认已经接收并记录了该事务。这种模式确保了数据的高度一致性,但可能会牺牲一些性能,因为主服务器必须等待所有从服务器的确认。
半同步复制
半同步复制是MySQL复制功能的一种增强模式。在此模式下,主数据库在提交事务前,会等待至少一个从数据库确认已接收并记录了该事务的日志。这种机制相较于传统的异步复制,提高了数据的安全性和一致性,但也造成了一定程度的延迟,通常最少是一个TCP/IP往返的时间。
工作机制:
- 主库提交事务:主库将更新写入二进制日志文件后,不立即通知客户端提交成功。
- 从库接收日志:至少有一个从库接收到主库传递过来的binlog内容,并将其写入到自己的relay log里面。
- 返回确认信息:从库处理完这些操作后,会向主库返回一个确认信息(ACK),表明已经接收并写入了这些日志数据。
- 主库完成提交:主库接收到从库的ACK后,才会向客户端返回事务提交成功的消息,完成整个事务的提交过程。
异步复制
异步复制是MySQL中最常用的复制模式。在此模式下,主库提交事务后立即返回客户端响应,而无需等待任何来自从库的确认。从库会在稍后的时间点独立地获取并应用这些事务。如果主服务器在提交事务后立即发生故障,而此时从属服务器尚未接收到相关日志,则这部分数据可能会丢失。
多源复制
多源复制允许一个从属服务器从多个主服务器接收数据。每个主服务器负责不同的数据库或表,并将更改发送给同一个从属服务器。从属服务器需要能够处理来自多个主服务器的更改,并且能够正确地应用这些更改,避免数据冲突。适用于需要将来自不同应用程序或服务的数据合并到一个中心数据库的情况。