mysql5.7的安装及其主从复制的原理与配置

操作环境

操作系统:RHEL6.5
master主机:server1——172.25.66.1,安装mysql5.7
slave主机1:server2——172.25.66.2,安装mysql5.7
slave主机2:server3——172.25.66.3,安装mysql5.7
selinux、iptables关闭且关闭开机自启动

安装mysql5.7

在master与所有slave主机都安装mysql5.7,安装过程所有主机相同,这里演示master中mysql5.7的安装
1:下载含有mysql5.7所有安装包的压缩包并解压
在这里插入图片描述
2:yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y
在这里插入图片描述
3:打开mysql
/etc/init.d/mysqld start #应该会慢一点,因为要初始化和设置密码
在这里插入图片描述
4:与5.7之前的版本相比,5.7安装完之后是有一个自动生成的密码的,在日志文件 /var/log/mysqld.log 中
使用命令cat /var/log/mysqld.log | grep temp查看
在这里插入图片描述
5:如果在看到密码之前日志文档被误删了,得不到密码,就要以安全方式登录mysql,然后修改密码。
解决步骤:
在配置文件里添加登陆不检测密码:
vim /etc/my.cnf
添加在最后一行:
skip-grant-tables
重启服务,就能直接登陆了(不要密码登陆),登录上mysql后在修改密码然后到配置文件注释或者删除掉上面添加的内容即可
所有master与slave主机都按以上步骤安装好mysql5.7

mysql5.7-主从复制

主从复制原理

MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到另一个Mysql instance(我们称之slave)。在master与slave之间实现整个复制过程主要由三个线程来完成,其中两个线程(SQL线程和IO线程)在slave端,另外一个线程(IO线程)在master端。
要实现MySQL的Replication,首先必须打开master端的binlog (mysql-bin.xxxxxx)日志功能,否则无法实现mysql的主从复制。因为mysql的整个主从复制过程实际上就是:slave端从master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作。

mysql主从复制的基本交互过程

1、slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。
2、master端在接收到来自slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文件名以及在该binlog日志中的pos节点位置。
3、slave端的IO线程在接收到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master-info(该文件存在slave端)文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从哪个binlog文件的哪个pos节点位置开始,请把此节点以后的日志内容发给我”。
4、slave端的SQL线程在检测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺丰依次执行这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和slave端的数据是完全一样的。

实现mysql主从复制

master机(server1)相关配置

1:修改数据库的配置文件
vim /etc/my.cnf
29 server-id=1 #数据库中的id号,所有master与slave主机之间不能有相同的
30 log-bin=mysql-bin # 开启二进制日志,允许slave同步自己的二进制文件
在这里插入图片描述
2:重启数据库/etc/init.d/mysqld restart
在这里插入图片描述
3:进入数据库
mysql -p ##回车后要输入密码,密码就是上面我们在日志文件中查看到的密码cat /var/log/mysqld.log | grep temp
在这里插入图片描述
4:在数据库中操作
第一步我们先要修改数据库密码
alter user root@localhost identified by ‘Guodong+0306’; ##这里的密码一定要复杂,不然修改不成功,要有大小写字母与特殊符号
flush privileges; ##同步
show master status; ##查看master机状态
在这里插入图片描述
5:在数据库中创建用户repl
CREATE USER repl@’%’ IDENTIFIED BY ‘Guodong+0306’;
在这里插入图片描述
grant replication slave on . to repl@‘172.25.66.%’ identified by ‘Guodong+0306’; ##用户授权

slave机(server2&server3)相关配置

server2:
1:修改数据库配置文件
vim /etc/my.cnf
server-id=2 # 三者全部不相同
log-bin=mysql-bin # 允许slave端同步自己的二进制日志
log-slave-updates

--logs-slave-updates
通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。该选项告诉从服务器将其SQL
线程执行的更新记入到从服务器自己的二进制日志。为了使该选项生效,还必须用--logs-bin选项
启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应使用--logs-slave-updates。
例如,可能你想要这样设置:
A -> B -> C
也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器
又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates
选项启动B。

在这里插入图片描述
2:重启mysql
在这里插入图片描述
3:同样在日志中查看密码后进入mysql
mysql -p
在这里插入图片描述
4:在数据库中操作
第一步同样是先修改数据库密码
alter user root@localhost identified by ‘Guodong+0306’;
第二步添加自己的master(即server1端)
change master to master_host=‘172.25.66.1’,master_user=‘repl’,master_password=‘Guodong+0306’,master_log_file=‘mysql-bin.000001’,master_log_pos=550;
##master_log_file=‘mysql-bin.000001’,master_log_pos=550这两项的值就是刚才在master中show master status;出现的值
在这里插入图片描述
start slave;
show slave status\G; (查看两个线程的状态是否是yes)
在这里插入图片描述
5:因为我们要让slave2(server3)从slave1(server2)同步数据,所以我们在server2中也要对slave进行授权,所以server2既是master又是slave
grant REPLICATION SLAVE on . to repl@‘172.25.66.%’ identified by ‘Guodong+0306’;
show master status;
在这里插入图片描述
server3:
1:修改配置文件
vim /etc/my.cnf
server-id=3 # 三者全部不相同
因为server3只做slave,所以只需要添加这一项
在这里插入图片描述
2:重启mysql
/etc/init.d/mysqld restart
3:在日志中查看密码后进入mysql
mysql -p
在这里插入图片描述
4:数据库中操作
第一步修改数据库密码
alter user root@localhost identified by ‘Guodong+0306’
第二步添加自己的master(即server2端)
change master to master_host=‘172.25.66.2’,master_user=‘repl’,master_password=‘Guodong+0306’,master_log_file=‘mysql-bin.000001’,master_log_pos=691;
在这里插入图片描述
start slave;
show slave status\G;
在这里插入图片描述
这样我们就实现了一个链式的mysql主从同步复制,所谓链式就是server2复制server1中的日志内容,server3复制server2中的日志内容,当然,server1中操作后,server2和server3都可以同步到日志内容

测试

master机写入数据:
create database user;
use user;
create table usertb (username varchar(20) not null,age varchar(4) not null);
show tables;
在这里插入图片描述
分别在slave1(server2)与slave2(server3)中查看:
slave1(server2):
在这里插入图片描述
slave2(server3):
在这里插入图片描述
可以看到,我们在master(server1)中写入数据后,在server2与server3中都可以同步到server1中的数据

猜你喜欢

转载自blog.csdn.net/gd0306/article/details/84718564