MySQL 的复制默认的异步的,主从复制至少需要两个 MySQL 服务,这些服务可以分布在不同服务器上,也可以在同一个台服务器上。
主从复制
主库、从库需要安装相同的稳定版 MySQL
MySQL 数据库入门
主库上设置一个复制专用账户,并授予REPLICATION SLAVE
权限
GRANT REPLICATION SLAVE ON *.* TO 'rep'@xxx.xxx.xxx.xxx IDENTIFIED BY '8$TXDBJ*fLULiZ';
修改主库的配置文件/etc/my.cnf
,开启 BINLOG,并设置 server-id 的值,重启 MySQL 服务生效。
log-bin=mysql-bin
server-id=1
锁定主库的表,确保备份之前没有新的数据操作,避免造成数据不一致
FLUSH TABLES WITH READ LOCK;
查看主库运行状态,记下 File 和 Position 数值,后续有用
SHOW MASTER STATUS;
将主库数据完整备份到从库,直接复制数据文件夹是最方便的做法,具体情况具体对待
MySQL 数据备份恢复
修改从库的配置文件/etc/my.cnf
,设置 server-id 参数(唯一值,不能重复)
server-id=2
通过 —skip-slave-start 选项启动从库,暂时跳过复制操作以便后续配置
CHANGE MASTER TO
-> MASTER_HOST='xxx.xxx.xxx.xxx',
-> MASTER_PORT=3306,
-> MASTER_USER='rep',
-> MASTER_PASSWORD='8$TXDBJ*fLULiZ',
-> MASTER_LOG_FILE='mysql-bin.xxxxxxxx',
-> MASTER_LOG_POS=xxx;
解开主库的锁
UNLOCK TABLES;
在从库上开启复制进程并查看详情
start slave;
show processlist\G;
读写分离
读写分离是主从复制的常规操作,即:主库处理增(INSERT)、删(DELETE)、改(UPDATE)及事务性查询(SELECT)操作,从库只处理非事务性查询(SELECT)操作
数据一致
主从复制的原理是将主库的语句通过读取binlog
的方式在从库上执行,当服务高并发时,从库的数据更新会有延迟:刚写入主库的数据需要经过几十、几百毫秒、甚至更长才能在从库查询到。
- 网络方面: 保证主、从库之间的网络稳定,以及延迟较小
- 硬件方面: 从库使用更好的配置,提高随机读写的性能
- 并行复制: 从 MySQL 5.7 以后,新增了多线程复制技术,解决了主库同一个 schema 下数据发生变更,从库不能处理并发的问题。