什么是复制
复制是 MySQL 的一项功能,它使服务器能够将更改从一个实例复制到另一个实例
• 主服务器 (master) 将所有数据和结构更改记录到二进制日志中
– 二进制日志格式是基于语句的、基于行的或混合的
• 从属服务器 (slave) 从主服务器请求二进制日志并在本地应用其内容
– 它记录所有接收和应用的事件的状态,以便在服务器重启或网络故障后可以从停止的位置恢复
主/从属服务器关系是一对多关系
• 每个从属服务器从一个主服务器读取日志
• 一个主服务器可以将日志传送给许多从属服务器
中继从属服务器
• 一个中继从属服务器可以用作另一个从属服务器的主服务器
• 更改会传播到更多的从属服务器

可以使用更复杂的拓扑:
• 双向 (bi-directional) 拓扑具有两个主服务器,每个主服务器是另一个主服务器的从属服务器

• 循环 (circular) 拓扑具有任意数量的服务器
– 每个服务器是一个主服务器并且是另一个主服务器的从属服务器
– 对任何主服务器的更改将复制到所有主服务器
– 并非每个从属服务器都必须是主服务器

• 多源 (Multisource) 复制允许一个从属服务器接收来自多个主服务器的事务

复制冲突
在包括多个主服务器的所有拓扑中都可能发生冲突
• 如果两个客户机几乎同时写入两个主服务器上的同一行,则会无法预测从属服务器上该行的最终值
• 最终值取决于中继从属服务器上的事件顺序
– 在分层复制中,该行在从属服务器上的最终值由分层结构确定:
— 如果某个中间主服务器更改了行,则从属服务器与主服务器的值不同
– 在循环复制中,如果发生冲突,行的最终值在各服务器之间不一致
— 该值取决于每个主服务器上应用事件的顺序
什么时候复制
解决数据高可用、读写分离、负载均衡、备份恢复等场景需求
1、读多写少的业务,需要减轻主库压力,将查询请求分散到多个从库。
2、需要避免单点故障,确保高可用性
3. 数据备份与灾难恢复
4、需要与生产环境数据同步的测试库,开发人员调试SQL,避免直接操作生产库。
5、高并发写入或单机性能瓶颈时,进行水平扩展
配置复制
1. 规划绘制复制拓扑图
2. 标识参与复制的所有服务器(的主从关系)
– 要注意,从另一个主服务器复制的每个复制主服务器也是复制从属服务器
3. 为每个服务器配置唯一的 server-id
– 默认值为 1 的无符号 32 位整数
– server-id 为0 的服务器(无论是从属服务器还是主服务器)都拒绝使用其他服务器进行复制
4. 配置每个主服务器
5. 配置每个复制从属服务器以连接到主服务器
6. 使用 START SLAVE 在每个复制从属服务器上启动复制
配置复制主服务器
• 启用 TCP/IP 网络
– 复制不能使用 UNIX 套接字文件
• 启用二进制日志
– 在复制过程中,每个主服务器将其日志内容发送到每个从属服务器
• 创建具有 REPLICATION SLAVE 权限的用户
CREATE USER user@slave_hostname IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO user@slave_hostname;
– 每个从属服务器必须登录到主服务器中才能从中进行复制
– 在有多个从属服务器的主服务器上,在主机名中指定通配符可以匹配所有从站,或者创建多个用户
• 备份主数据库作为从属服务器开始复制的起点
• 如果不使用 GTID,则记录日志坐标
– 如果使用 mysqldump 执行备份,就要使用 --master-data 选项
配置复制从属服务器
• 从主服务器备份恢复
– 如果使用 GTID,则验证是否设置了 gtid_purged 变量
• 在每个从属服务器上发出 CHANGE MASTER TO 语句,包含:
– 主服务器的网络位置
— MASTER_HOST 和 MASTER_PORT 值
— 或者,在复制期间使用 MASTER_SSL 和相关选项来加密主从服务器之间的网络流量
– 复制帐户用户名和口令(具有 REPLICATION SLAVE 权限)
— MASTER_USER 和 MASTER_PASSWORD 值
– 开始复制的二进制日志坐标(如果不使用 GTID)
— MASTER_LOG_FILE 和 MASTER_LOG_POS 值存储从属服务器开始复制的二进制日志位置
— 如果使用 GTID,则指定 MASTER_AUTO_POSITION=1