原理:
1、master服务器上的数据发生改变时,会将改变的数据记录到二进制binlog日志中。
2、当slave服务器发现master的binlog发生改变时,会开启一个I/O线程去请求连接master服务器,并请求从指定binlog日志文件的指定位置之后发送binlog日志内容。
3、当master服务器收到来自slave服务器的I/O线程请求后,master回开启一个dump线程,用来将指定binlog日志文件指定位置之后的内容返回给slave服务器。
4、当slave服务器的I/O线程获取到master的binlog日志内容后,会保存到slave本地的relay log(中继日志)文件(msql-relay-bin.xxxxxx)中。
5、salve服务器的SQL线程会从relay log文件中读取日志信息,并解析成sql语句逐一执行,使其数据和master保持一致。应用完毕后的relaylog会被清理掉。
注意事项:
1、master一定要开启binlog日志功能(默认是关闭的),然后授予slave远程连接的权限。
2、mysql主从复制,至少需要两个mysql服务。并且master和slave服务器上的mysql版本最好相同(如果不一致,那么要保证slave版本不低于master版本)。
3、master和slave两节点间时间需同步。
主从复制安装配置
1、基础环境准备
#操作系统 centos 6.5 #mysql版本 5.7 #两台虚拟机: node1:192.168.20.12 (主) node2:192.168.20.14 (从)
2、安装mysql数据库,可参考linux环境安装mysql5.7
3、在两台数据库中分别创建数据库
create database mydb;
mysql默认情况下binlog是关闭的,如下:
4、在主(node1)服务器上,进行如下配置:
# 修改配置文件,执行以下命令打开mysql配置文件 vi /etc/my.cnf # 在文件的最下面增加如下配置信息 log-bin=master-bin #binlog二进制文件名称 binlog-format=ROW #binlog二进制格式。有row、statement、mixed三种格式 server-id=1 #唯一标识,主从不一样就行 binlog-do-db=mydb #同步的数据库名称
5、在主(node1)服务器上,登录mysql服务,配置从库登录主库的账号并授权:
set global validate_password_policy=0; set global validate_password_length=4; grant replication slave on *.* to 'root'@'%' identified by '123456'; flush privileges;
6、查看master状态(之前配置过,所有下面的file是从000003开始,否则应该是000001)
现有的master log信息(日志文件是在保存在/var/lib/mysql下)
7、重启mysql服务,然后在从(node2)服务器上配置:
change master to
master_host='192.168.20.12', #主库地址 master_user='root', #授权账户 master_password='123456', #授权账户密码 master_port=3306, #主库端口 master_log_file='master-bin.000003', #下次同步的主库起始binlog文件 master_log_pos=154; #下次同步的主库起始位置
这里的配置,必须跟第6步中主服务器状态的值一一对应(特别是master_log_file和master_log_pos)
8、启动slave主从复制
start slave;
9、检查slave状态
show slave statusG
从上面可以看到主从复制的相关配置信息。如果Slave_IO_Running=Yes,Slave_SQL_Running=yes,则表示配置成功
在从服务器/var/lib/mysql目录下,可以看到多了几个relay-bin中继日志文件:
10、此时可以在主服务器上进行相关的增删改操作,在从服务器上查看结果是否同步