MySQL 的主从复制依赖于 binlog ,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上。复制的过程就是将 binlog 中的数据从主库传输到从库上。
这个过程一般是异步的,也就是主库上执行事务操作的线程不会等待复制 binlog 的线程同步完成。还有另外两种模式:半同步复制(需要一个从库返回响应才能给客户端返回写入成功)和同步复制(所有从库都返回响应才能给客户端返回写入成功)
以异步过程为例,流程大概是这个样子的,有需要高清图的可以私信我
MySQL 集群的主从复制过程梳理成 3 个阶段:
具体详细过程如下:
在完成主从复制之后,你就可以在写数据时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行。
主从复制的模型主要有三种:
主从复制中的关键点:
三个线程:
Log Dump线程(主库)
当从节点与主节点建立连接之后,主节点会为从节点创建一个Log Dump线程,用来监听Binlog的变化,如果有变化会将新增的部分发送给从节点
I/O线程(从库)
从节点和主节点建立连接之后,从节点会开启一个I/O线程,用来接收主节点的Log Dump线程发送的binlog,I/O线程接收到binlog之后会把它追加写入到Relay Log
SQL线程(从库)
SQL线程读取Relay log的文件内容,并进行SQL重放,维护数据一致性
重要的两个日志:
Binlog
Binlog以事件形式记录了对MySQL数据库执行的所有更改操作(写操作)
Relay log
用来保存从节点IO线程接收到的Binlog日志,作为中继日志使用
GTID
MySQL的GTID(Global Transaction Identifier,全局事务标识符)是MySQL复制架构中的一个功能,用于确保数据在主从服务器之间的同步性。
GTID是一个唯一的标识符,用于标识特定的事务。在MySQL复制架构中,每个事务都被分配一个唯一的GTID,这使得在主服务器和从服务器之间的复制中,可以轻松地识别哪些事务已经被复制,哪些尚未被复制。
使用GTID还可以使得在进行主从切换时,从服务器可以自动找到正确的位置来恢复复制。此外,GTID还可以用于在多主复制环境中解决冲突,从而提高系统的可靠性和可用性。
总的来说,GTID是MySQL复制架构中一个非常有用的功能,可以提高系统的可靠性和可维护性。