介绍
Replication 可以使数据从一个MySQL数据库(master)复制到一个或多个MySQL数据库(slave)中,默认情况下该复制过程是异步的。我们可以通过配置来实现复制所有的database或者指定的database。
MySQL Replication 的优点如下:
- 横向扩展:可以将负载分布在多个slave上以提高性能。所有的写操作都必须在master上进行,但是读操作可以分布在一个或多个slave上。这样的模型可以提高写入性能,因为master专注于数据更新,同时多个slave可以显著的提高读取速度。
- 数据安全:定期备份是保护数据的重要手段之一,若在master上进行数据备份则需要使master处于readonly状态,这将影响写操作 。而salve可以暂停复制的过程,所以slave上进行数据备份而不会影响到master。
- 分析:数据是从master上实时写入的,数据分析可以在slave上进行而不影响master的性能。
- 远程数据分发:如果master的物理位置距离较远,我们可以在临近的地方创建slave,方便使用数据使用,而不需要总是访问远端的master。
原理
作为master 的MySQL实例将数据的变更操作作为”事件”记录到binary log
中,slave 的MySQL实例被被指为读取master的binary log
,slave将读取到的binary log
写入自己的中继日志中,然后slave回把相关的事件进行执行。slave具体执行哪些事件由slave决定。
配置
创建用于复制的账号
进入master的MySQL实例,执行以下操作:
执行以下命令创建账号,其中172.20.254.176
为slave的MySQL的ip,liuqitech@2020
为密码。
1 | CREATE USER 'slave'@'172.20.254.176' IDENTIFIED BY 'liuqitech@2020'; |
分配权限,其中replication slave
表示 主从复制权限
1 | GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.20.254.176'; |
刷新权限
1 | flush privileges; |
master配置
开启二进制日志并设置唯一的server-id。修改my.cnf
,添加如下配置
1 | [mysqld] |
重启MySQL使之生效
slave配置
被指唯一的server-id。修改my.cnf
,添加如下配置
1 | [mysqld] |
重启MySQL使之生效
获取master的二进制日志文件坐标
master上执行以下操作
1 | mysql > SHOW MASTER STATUS; |
记录File、Position的值
连接slave到master
slave上执行以下操作
1 | mysql> CHANGE MASTER TO |
1 | mysql> start slave; |
查看状态
slave 中执行 查看状态
1 | mysql> SHOW SLAVE STATUS \G |
观察是否正常运行中
1 | Slave_IO_Running: Yes |