MySQL 主从同步的基本原理

1、简介

  • MySQL 主从同步主要通过 二进制日志(binlog) 来实现。以下是主从同步的工作流程
1、主库记录 binlog:当主库执行数据更新操作(如 INSERT、UPDATE、DELETE)时,会将这些数据变更写入 二进制日志(binlog) 中。这个日志文件记录了所有影响数据的 SQL 操作。
2、从库请求 binlog:从库通过一个 I/O 线程 向主库请求其 binlog 文件。主库将这些 binlog 文件发送给从库。
3、从库接收 binlog 并存储到 relay log:从库的 I/O 线程将从主库接收到的 binlog 数据存储在本地的 中继日志(relay log) 中。
4、从库应用 relay log:从库的 SQL 线程,它会读取中继日志中的内容,并执行相应的 SQL 操作,从而将主库的数据变更应用到从库中,保持数据同步。

这种流程的核心是 MySQL binlog 日志的复制与重放。

2、详解

  • 主从同步的详细流程
1、主库开启 binlog 日志:
- 当主库执行更新操作(如增删改),这些操作首先会被记录到 binlog 日志文件中。
2、从库启动复制进程
- 在从库上,使用change master to命令配置主库的连接信息,并执行start slave启动从库的复制进程
- 从库开启两个线程:一个I/O线程和一个SQL线程
	- I/O线程负责从主库上请求并接受binlog文件,并写入relay log文件中
	- SQL线程负责解析relay log文件中的内容为sql语句,并逐条执行sql语句
3、I/O线程请求biglog
- 从库的I/O线程会通过网络连接主库,发送一个binlog dump请求。这个请求告诉主库“从某个具体的binglog文件及位置(如binlog文件名及位置)开始,发送binlog内容给我”
- 主库收到请求后,从相应的biglog文件的指定位置开始,逐条日志数据发送给从库的I/O线程
4、从库I/O线程写入relay log
- 从库的IO线程将主库发送过来的binlog数据保存到本地的中继日志(relay log)中
5、SQL线程执行中继日志
- 从库的SQL线程不断读取中继日志中的内容,将其当做普通SQL语句执行,应用在从库数据库中
- 当SQL线程执行完所有的relay log后,从库的数据状态就与主库保持一致

3、主从同步的类型

3.1、异步复制:

	默认情况下,MySQL使用异步复制,既主库在执行事务时不会等待从库确认收到binlog并应用该日志。只要主库完成操作,会立即返回给客户端。这种模式下,如果主库发生崩溃,可能会导致部分事务没有传输到从库

3.2、半同步复制

	MySQL5.5引入了半同步复制。在这种模式下,主库在提交事务时,至少会等到一个从库确认收到该事物的binlog日志后才会返回给客户端。因此,它比异步复制提供了更高的数据安全性,但也可能影响主库的性能

3.3、延迟复制

	从库可以设置一个固定的延迟时间来应用relay log中的更改,这成为延迟复制。这种的好处是:当发现主库上的错误操作后,可以通过延迟的从库找回来未被错误操作影响的数据

4、MySQL主从复制的优点

4.1、高可用性

	从库可以用作主库的备份,在主库发生故障时,可以迅速将从库提升为主库,保证业务的连续性

4.2、负载均衡

	在读写分离的架构中,主库承担写操作,从库承担读操作,从而减轻主库的压力,提高数据库性能

4.3、灾难恢复

	主从同步可以保障数据库在发生故障时迅速恢复数据,通过将主库的实时操作同步到从库,降低数据丢失的风险

4.4、数据分析

	从库可以作为数据分析或备份的数据库实例,避免对主库的性能造成影响

5、需要注意的问题

5.1、数据一致性

	异步复制模式下,主库和从库的数据可能暂时不一致,尤其是主库崩溃时,未传输的binlog数据可能会丢失

5.2、延迟问题

	如果主库的更新频繁且数据量大,从库可能会出现延迟,既从库无法实现应用所有主库的更新。这会导致主从库的数据暂时不同步,尤其是网络慢或者从库压力大的情况下

5.3、自动故障转移

	MySQL没有故障后自动转移机制。如果主库宕机,需要手动将从库提升为主库。可以结合一些高可用的方案(如mha、pxc、orchestrator)实现自动切换

5.4、全局事务ID(GTID)

	在MySQL5.6 及跟高版本中,支持GTID(全局事务标识符),用于简化主从同步中的故障恢复。GTID确保每个事务有唯一的ID,从而使得管理多个主从复制关系更容易

6、主从配置

  • 主库
[mysqld]
log-bin=mysql-bin
server-id=1
  • 从库
[mysqld]
server-id=2
relay-log=relay-log
  • 开启主从同步
# 登录从库在从库执行下面的command
CHANGE MASTER TO
  MASTER_HOST='主库IP地址',
  MASTER_USER='复制用户',
  MASTER_PASSWORD='复制用户密码',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=4;

START SLAVE;

# 查看
show slave status;
posted @ 2024-10-11 10:04  Hello_worlds  阅读(52)  评论(0编辑  收藏  举报