如图,主从同步的流程大致是从服务器有一个IO线程读取主服务的binlog日志,然后写入自己的relaylog,会有一个sql线程解析成sql去执行,先写到relaylog再去解析是利用了生产者消费者模型,达到一个异步的作用。
国际惯例,授之以鱼不如授之以渔,开始之前先告诉大家官方文档怎么去查
地址:https://dev.mysql.com/doc/refman/8.0/en/grant.html#grant-privileges
首先我们准备两个装有mysql8的虚拟机,可以安装好一个然后克隆。
我的是192.168.1.8和192.168.1.9
1.8做主服务器,1.9做从
我们先来做主服务器的工作
配置文件配置如下:
可以对这三个参数做一个解释,看官方文档:
大致意思就是必须在源和副本上设置这个唯一的server-id,范围是 2的32次方 − 1.
log_bin 是binlog日志文件名
log_bin_index就是索引文件
配置好以后重启mysql服务
接下来我们创建一个用户专门用来做读取主服务器二进制文件
mysql -u root -p create user replication_user IDENTIFIED BY 'Replication@163.com'; grant REPLICATION SLAVE on *.* to 'replication_user'@'%'; alter user 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Replication@163.com'; flush privileges;
查看一下主服务器状态和二进制文件
接下来是从服务器
打开从服务器relay日志
重启MySQL
systemctl restart mysqld
然后通过命令设置主服务的信息:
分别就是主服务的地址,二进制文件名,用户和密码,都是上面设置好的
change master to master_host='192.168.1.8', master_port=3306, master_user='replication_user', master_password='Replication@163.com', master_log_file='master_bin.000002', master_log_pos=0; start slave;
查看状态,我这里分别有两个错误
show slave status \G;
第一次是密码加密方式的问题,按上面创建用户的方式做,不会有这个问题
第二次是server—uuid和主服务器重复,因为我的从是克隆过来的,所以重复了,
需要修改数据目录下的auto.cnf,你的数据目录看配置文件在哪里,我的是
在这个目录下找到auto.cnf
然后我们在查看从的状态:
先stop slave;
再start slave;
看到Waiting for master to send event说明没问题了,再等待主服务的事件
接下来就是测试啦
我们在主服务上创建一个库,创建一个表,看是否能够同步过来
好的,没有问题,大功告成