MySQL主从架构实施
- 主服务器记录更改**:
- 在主服务器(Master)上,所有对数据库的写操作(INSERT、UPDATE、DELETE 等)都会被记录到二进制日志文件中。二进制日志不仅记录了每一个操作,还记录了操作发生的顺序和时间。
- 从服务器读取二进制日志:
- 从服务器(Slave)会连接到主服务器,并通过 I/O 线程不断读取主服务器的二进制日志,然后将这些日志复制到本地的中继日志(Relay Log)中。
- 从服务器重放二进制日志:
- 从服务器的 SQL 线程读取中继日志中的内容,并依次执行日志中的每一条语句。这些语句在从服务器上重放,从而使从服务器的数据与主服务器保持同步。
这个过程是异步进行的,从服务器通常会有一定的延迟,这个延迟取决于网络状况、服务器负载等因素。
首先准备两个虚拟机,最好都安装相同版本的 mysql
保证两台 PC 可以互相通讯

配置主数据库
1.修改主数据库的配置文件,一般在 /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
#server-id=1:指定主服务器的 ID,确保每个服务器的 ID 唯一
#log-bin=mysql-bin:启用二进制日志,这是实现复制的基础
1
2
3
4
5
2
3
4
5
2.修改完配置文件后重启 mysql
3.创建复制用户,登录 mysql,并创建复制用户
CREATE USER 'zzl'@'10.0.0.21' IDENTIFIED BY '123456zzlZZL!';
#授予用户 zzl 在所有数据库和所有表上的复制权限,允许它作为从服务器(slave)进行复制
GRANT REPLICATION SLAVE ON *.* TO 'zzl'@'10.0.0.21';
FLUSH PRIVILEGES;
1
2
3
4
2
3
4

4.锁定主数据库表并获取二进制日志信息
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
#该命令将所有表刷新到磁盘,并且对整个数据库实例加上全局读锁(全局只读锁)
#通过执行这个命令,可以确保在备份数据或记录主服务器状态(例如二进制日志位置)时,没有其他写操作改变数据库的数据状态,从而获得一个一致性快照
#该锁禁止所有写操作(INSERT、UPDATE、DELETE、CREATE、DROP 等),但允许读操作(SELECT)
#这个锁会阻塞所有写入操作,因此需要尽量缩短锁定时间
FLUSH TABLES WITH READ LOCK;
#显示主服务器当前的二进制日志文件名称和位置等信息。这些信息对于配置从服务器非常重要,因为从服务器需要知道从哪个日志文件和位置开始复制数据
SHOW MASTER STATUS;
1
2
3
4
5
6
7
2
3
4
5
6
7
记下 File
和 Position
,稍后在从服务器中使用

mysql-bin.000001,761
5.开放 mysql 端口
从数据库配置
修改从数据库配置文件 my.cnf,添加 server-id=2,确保唯一性
重启 MySQL 服务
设置从服务器与主服务器同步,登录 mysql,执行以下命令,根据实际情况执行
CHANGE MASTER TO
MASTER_HOST='10.0.0.20',
MASTER_USER='zzl',
MASTER_PASSWORD='123456zzlZZL!',
MASTER_LOG_FILE='mysql-bin.000001', -- 使用在主服务器中获取的日志文件名
MASTER_LOG_POS=761; -- 使用在主服务器中获取的位置
1
2
3
4
5
6
2
3
4
5
6
启动复制进程:START SLAVE;
检测从数据库状态:SHOW SLAVE STATUS\G;
确保 Slave_IO_Running
和 Slave_SQL_Running
都显示为 Yes

解锁主数据库:UNLOCK TABLES;
如果在复制进程启动后,Slave_IO_Running
和 Slave_SQL_Running
没有都为 Yes
,在修改完相关配置,需要再重新启动复制进程
可能是因为主节点端口没有开放
STOP SLAVE,START SLAVE