MySQL 的复制默认的异步的,主从复制至少需要两个 MySQL 服务,这些服务可以分布在不同服务器上,也可以在同一个台服务器上。

主从复制

主库、从库需要安装相同的稳定版 MySQL
MySQL 数据库入门
主库上设置一个复制专用账户,并授予REPLICATION SLAVE权限

  1. GRANT REPLICATION SLAVE ON *.* TO 'rep'@xxx.xxx.xxx.xxx IDENTIFIED BY '8$TXDBJ*fLULiZ';

修改主库的配置文件/etc/my.cnf,开启 BINLOG,并设置 server-id 的值,重启 MySQL 服务生效。

  1. log-bin=mysql-bin
  2. server-id=1

锁定主库的表,确保备份之前没有新的数据操作,避免造成数据不一致

  1. FLUSH TABLES WITH READ LOCK;

查看主库运行状态,记下 File 和 Position 数值,后续有用

  1. SHOW MASTER STATUS;

将主库数据完整备份到从库,直接复制数据文件夹是最方便的做法,具体情况具体对待
MySQL 数据备份恢复
修改从库的配置文件/etc/my.cnf,设置 server-id 参数(唯一值,不能重复

  1. server-id=2

通过 —skip-slave-start 选项启动从库,暂时跳过复制操作以便后续配置

  1. CHANGE MASTER TO
  2. -> MASTER_HOST='xxx.xxx.xxx.xxx',
  3. -> MASTER_PORT=3306,
  4. -> MASTER_USER='rep',
  5. -> MASTER_PASSWORD='8$TXDBJ*fLULiZ',
  6. -> MASTER_LOG_FILE='mysql-bin.xxxxxxxx',
  7. -> MASTER_LOG_POS=xxx;

解开主库的锁

  1. UNLOCK TABLES;

在从库上开启复制进程并查看详情

  1. start slave;
  2. show processlist\G;

读写分离

读写分离是主从复制的常规操作,即:主库处理(INSERT)、(DELETE)、(UPDATE)及事务性查询(SELECT)操作,从库只处理非事务性查询(SELECT)操作
MySQL 主从复制 & 读写分离 - 图1

数据一致

主从复制的原理是将主库的语句通过读取binlog的方式在从库上执行,当服务高并发时,从库的数据更新会有延迟:刚写入主库的数据需要经过几十、几百毫秒、甚至更长才能在从库查询到。

  • 网络方面: 保证主、从库之间的网络稳定,以及延迟较小
  • 硬件方面: 从库使用更好的配置,提高随机读写的性能
  • 并行复制: 从 MySQL 5.7 以后,新增了多线程复制技术,解决了主库同一个 schema 下数据发生变更,从库不能处理并发的问题。