mysql之主从复制

78 阅读4分钟

mysql主从复制

mysql的复制类型

保证数据的完整性:从角色复制主角色(放在硬盘中,硬盘存进二进制文件中,会记录完整的sql 语言)

  • 基于语句的复制
  • 基于行的复制
  • 混合类型的复制

mysql主从复制的工作过程

主服务器中数据更新完会放入硬盘中,硬盘会写入二进制文件里面,一旦发现二进制文件中数据有变更,I/O线程就会发送请求,dump线程监听I/O线程,由dump thread(dump线程)将发送的请求给从服务器的I/O线程;I/O线程会将数据存放在中继日志中;sql语句会读取数据,将他存放在硬盘中

完美总结

  1. sql数据进来到主服务器,写在硬盘上
  2. 硬盘将数据存放在二进制日志文件中
  3. 当二进制日志文件发生更改时,从服务器上的I/O线程会请求
  4. 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

image.png

步骤

每台服务器关闭防火墙和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
#开启服务

image.png

image.png

image.png

两台从服务器同步主服务器的时间。

[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

image.png image.png

image.png

主服务器的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;
#查看主服务器的状态

image.png

image.png

image.png

image.png

从服务器的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. 防火墙没有关闭

image.png

image.png

image.png

image.png

image.png

验证主从复制效果

主服务器上创建新的数据库,执行 `create database shiyan3;`

去从服务器上查看是否同步成功,执行 `show databases;`

image.png

image.png

image.png