mysql主从复制
mysql的复制类型
保证数据的完整性:从角色复制主角色(放在硬盘中,硬盘存进二进制文件中,会记录完整的sql 语言)
- 基于语句的复制
- 基于行的复制
- 混合类型的复制
mysql主从复制的工作过程
主服务器中数据更新完会放入硬盘中,硬盘会写入二进制文件里面,一旦发现二进制文件中数据有变更,I/O线程就会发送请求,dump线程监听I/O线程,由dump thread(dump线程)将发送的请求给从服务器的I/O线程;I/O线程会将数据存放在中继日志中;sql语句会读取数据,将他存放在硬盘中
完美总结
- sql数据进来到主服务器,写在硬盘上
- 硬盘将数据存放在二进制日志文件中
- 当二进制日志文件发生更改时,从服务器上的I/O线程会请求
- dump thread会监听I/O线程的请求;将二进制日志文件中的更新的数据发送给从服务器的I/O线程等
实验
环境
- master服务器:192.168.42.16/mysql5.7
- slave1服务器:192.168.42.17/mysql5.7
- slave2服务器:192.168.42.18/mysql5.7
步骤
每台服务器关闭防火墙和selinux 。
时间同步
- 每台mysql服务器需要设置时间同步,以免数据同步时产生错乱。
- 如果不通外网,则使用ntp服务。如果通外网,可以使用网络时钟源。
主服务器
[root@localhost ~]# yum install -y ntp
#安装时间同步工具(本地设置时钟源)
[root@localhost ~]# vim /etc/ntp.conf
#在配置文件的行尾加上两条
....................
server 172.0.0.1
fudge 172.0.0.1 stratum 8
[root@localhost ~]# systemctl start ntpd
#开启服务
两台从服务器同步主服务器的时间。
[root@localhost ~]# yum install -y ntp
#安装服务
[root@localhost ~]# systemctl start ntpd
#开启服务
[root@localhost ~]# /usr/sbin/ntpdate 192.168.42.16
#从主服务器上进行同步时间
[root@localhost ~]# crontab -e
#设置计划任务,没20分钟同步一次
*/20 * * * * /usr/sbin/ntpdate 192.168.42.16
主服务器的mysql配置
修改配置文件,创建一个同步账号授权给从数据库使用。
[root@localhost ~]# vim /etc/my.cnf
10 [mysqld]
···································
26 binlog_format = MIXED
27 log-slave-updates=true
28 expire_logs_days = 7
29 max_binlog_size = 500M
··································
解释:
server-id = 1 #指定服务ID号,master和两台slave都要不同
log-bin=mysql-bin #添加,主服务器开启二进制日志
binlog_format = MIXED #指定二进制日志(binlog)的记录格式为MIXED
log-slave-updates=true #添加,允许slave从master复制数据时可以写入到自己的二进制日志
expire_logs_days = 7 #设置二进制日志文件过期时间,默认值为0,表示logs不过期
max_binlog_size = 500M #设置二进制日志限制大小,如果超出给定值,日志就会发生滚动,默认值是1GB
[root@localhost ~]# systemctl restart mysqld
#重启mysql服务
[root@localhost ~]# mysql -u root -p123456
#登录mysql
mysql> grant replication slave on *.* to 'myslave'@'192.168.42.%' identified by '123456';
#给从服务器授权
mysql> flush privileges;
#刷新权限
mysql> show master status;
#查看主服务器的状态
从服务器的mysql配置
slave1
#修改配置文件
[root@localhost ~]# vim /etc/my.cnf
#修改23行,添加三行内容
[mysql]
····················
23 server-id = 2
24 relay-log=relay-log-bin
25 relay-log-index=slave-relay-bin.index
26 relay_log_recovery = 1
解释:
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志索引文件的位置和名称,一般和relay-log在同一目录
relay_log_recovery = 1 #选配项
[root@localhost ~]# systemctl restart mysqld
#重启MySQL服务
change master to master_host='192.168.42.16',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=603;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致
mysql> start slave;
#启动同步,如有报错执行 reset slave;
mysql> show slave status\G
#查看 Slave 状态
##一般 "Slave_IO_Running: No" 的可能原因:
1. 网络不通
2. my.cnf配置有问题(server-id重复)
3. 密码、file文件名、pos偏移量不对
4. 防火墙没有关闭
验证主从复制效果
主服务器上创建新的数据库,执行 `create database shiyan3;`
去从服务器上查看是否同步成功,执行 `show databases;`