跳转至

概述

MySQL高可用通过数据库的复制技术实现,MySQL主从复制通过binlog(二进制日志)实现。主从复制将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。当主库出现故障时,可以手动切换到从库,从而保证业务连续性和可靠性。

MySQL主从复制有三种模式:异步复制、半同步复制和并行复制。异步复制和半同步复制的区别在于异步复制的binlog传输不是实时的,而半同步复制的binlog传输更接近实时。并行复制是指从库回放relay log启用多个线程执行。MySQL主从复制有两种同步方式:传统方式和GTID方式,主库和从库同步方式保持一致。

基本原理

主服务器将数据的改变记录二进制日志BINLOG,当 master 上的数据发生改变时,则将其改变写入二进制日志中;

slave 服务器会在一定时间间隔内对 master 二进制日志进行探测其是否发生改变,如果发生改变,则开始一个 I/OThread 请求 master 二进制事件;

同时主节点为每个 I/O 线程启动一个 dump 线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动 SQL 线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后 I/OThread 和 SQLThread 将进入睡眠状态,等待下一次被唤醒。

异步复制

异步复制是指主库在执行完客户端提交的事务后会立即把结果返回给客户端,同时调用dump线程通知从库有新事务产生,从库调用IO线程把获取到的binlog写入relay log(中继日志),然后调用SQL线程回放relay log把更新写入本地磁盘。异步复制模式主库不关心从库是否已经接收到binlog,所以主库和从库的数据可能不一致,一旦主库发生故障,强行把从库提升为主库会导致部分数据丢失。