mysql主从复制原理

mysql中有一种二进制日志,这种日志会记录所有修改数据库的操作,主从复制的原理实际上就是把主服务器的binlog日志复制到从服务器上执行一遍,这样从节点的数据就可以保持与主节点数据一致了。

主从复制过程


(1)首先因为从节点需要复制主节点的binlog日志,所以必须保证主节点启用二进制日志(log-bin=mysql-bin)
(2)从节点会开启一个I/O线程扮演mysql客户端,去请求主节点的二进制日志的事件
(3)主节点启动一个dump线程,检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会第一个日志文件中的第一个事件一个个发送给从节点
(4)从节点收到主节点发送过来的数据,把它放到中继日志(relay log)中,并且记录该次请求到主节点哪个二进制日志文件的哪个位置
(5)从节点另外一个SQL线程会把中继日志(relay log)中的事件读取出来,并且在执行一遍

实验环境

192.168.186.133 mysql-master
192.168.186.134 mysql-slave
192.168.186.135 mysql-slave

##mysql-master配置
vim /etc/my.cnf

[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
binlog-do-db = db1
binlog_format=mixed
server-id=1
innodb_file_per_table=ON

查看是否开启log-bin
mysql> show global variables like ‘%log%’;

查看master主节点二进制日志
show master logs;

查看主节点的server id
show global variables like ‘%server_id%’

创建主节点复制权限的用户
grant replication slave,replication client on . to ‘twf’@’%’ identified by ‘tang1611’;

从服务器配置

vim /etc/my.cnf

[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
binlog-do-db = db1
relay-log=relay-log
relay-log-index=relay-log.index
read-only=1
server_id=3
innodb_file_per_table=ON

查看中继日志是否开启

在master主节点查看binlog
show binary logs;
建立主从关系
CHANGE MASTER TO MASTER_HOST=’192.168.186.133’,MASTER_USER=’twf’,MASTER_PASSWORD=’tang1611’, MASTER_LOG_FILE=’mysql-bin.000007’,MASTER_LOG_POS=1675;

启动从节点复制线程
start slave;

测试

(1)主节点创建数据库

create database mydb;


(2)在从节点查看二进制日志,查看是否成功复制成功