介绍
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为密码。
CREATE USER 'slave'@'172.20.254.176' IDENTIFIED BY 'liuqitech@2020';
分配权限,其中replication slave 表示 主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.20.254.176';
刷新权限
flush privileges;
master配置
开启二进制日志并设置唯一的server-id。修改my.cnf,添加如下配置
[mysqld]
log-bin=mysql-bin #表示开启binlog,并且指定二进制日志文件名为mysql-bin
server-id=1 #唯一的服务ID
重启MySQL使之生效
slave配置
被指唯一的server-id。修改my.cnf,添加如下配置
[mysqld]
server-id=2
重启MySQL使之生效
获取master的二进制日志文件坐标
master上执行以下操作
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 67 | | |
+------------------+----------+--------------+------------------+
记录File、Position的值
连接slave到master
slave上执行以下操作
mysql> CHANGE MASTER TO
MASTER_HOST='172.20.254.175',
MASTER_USER='slave',
MASTER_PASSWORD='liuqitech@2020',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=67;
mysql> start slave;
查看状态
slave 中执行 查看状态
mysql> SHOW SLAVE STATUS \G
观察是否正常运行中
Slave_IO_Running: Yes
Slave_SQL_Running: Yes