MySQL主从复制环境搭建
准备工作
虚拟机:ubuntu 20.04
MySQL:虚拟机和本地各安装一台MySQL5.7
主从复制原理
主从复制的流程:两个日志(binlog二进制日志和relay log日志)和三个线程(master的一个线程和slave的二个线程)
- 主库的更新操作写入binlog二进制日志中,由binlog转储线程将二进制日志的内容发送到从服务器。
- slave从服务器执行start slave命令,创建一个IO线程和一个SQL线程。
- IO线程接收master的binary log并复制到中继日志中,SQL线程从中继日志中读取事件,并重放其中的事件更新slave从服务器中的数据,使其与master的数据一致。
- 中继日志通常会位于OS缓存中,只要该线程与I/O线程保持一致,中继日志的开销会很小。
主从复制采取的是半同步复制策略,事务线程不用等待所有的从库复制成功响应,只要一部分复制成功响应回来就行,比如一主二从的集群,只要数据成功复制到任意一个从库上,主库的事务线程就可以返回给客户端。即使出现主库宕机,至少还有一个从库有最新的数据,不存在数据丢失的风险。
主从复制配置
虚拟机Linux环境上的MySQL作为主服务器,本地windows环境的MySQL作为从服务器。
查看主从服务器的IP地址
在linux命令行输入ifconfig
,记录IP地址,例如192.168.18.131
在windows命令行输入ipconfig
,记录VMware Network Adapter VMnet8对应的IP地址,例如:192.168.18.1。
虚拟机是从VMware Network Adapter VMnet8对应的IP地址接收对应的数据的
master配置:
开启二进制日志
打开
my.cnf
配置文件:1
# sudo vim /etc/mysql/my.cnf
添加配置项:
1
2
3
4
5[mysqld]
server-id=1 # 全局唯一的server-id
expire_logs_days=7 # 过期时间
log-bin=mysql-bin # logbin日志名
bind-address=0.0.0.0 #允许来自任意地址的连接重启MySQL:
1
# sudo service mysql restart
创建一个用于主从通信用的账号
1
2
3create user 'mslave'@'192.168.18.1' identified by '12345@mysql';
grant replication slave on *.* to 'mslave'@'192.168.18.1' identified by '12345@mysql';
flush privileges;查看mslave用户是否创建成功
1
2use mysql;
select user,host from user;获取binlog的日志文件名和position
1
# show master status;
slave配置:
配置全局唯一的server-id
- 在MySQL配置文件
my.ini
中修改server-id为2 - 重启mysql57服务
- 在MySQL配置文件
使用master创建的账户读取binlog同步数据
1
2
3
4
5
6CHANGE MASTER TO MASTER_HOST='192.168.18.131',
MASTER_PORT=3306,
MASTER_USER='mslave',
MASTER_PASSWORD='12345@mysql',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=482;开启主从复制
start slave
show slave status\G命令查看主从复制状态,确保显示的内容中没有error出现;
show processlist查看master和salve相关线程的运行状态
此时,在主服务器创建一个新的数据库,从服务器就能实时同步查询到了。
注意配置细节,在输入命令时,不要在密码后面误打空格造成连接失败。
参考文章
- 施磊. 后台开发MySQL技术