这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。
一. 什么是主从复制
首先给大家明确一下主从复制的概念,有些初学者可能认为主从复制是数据库集群的一种实现方式,实际上并不是这样,数据库集群是多个数据库服务器构成一个虚拟单一的数据库逻辑镜像,而主从复制多个数据库服务器是独立的,只是从服务器会从主服务器复制操作。
上图是一个典型的主从复制的过程,可以看到基本分为四步:
- Master(主数据库)开启
Binary Log
(二进制操作日志) - Slave(从数据库)连接主数据库,然后开启一个
I/O
线程,请求主数据库的二进制操作日志 - 主数据库启用一个
Binlog dump
线程,根据从数据库提供的参数,将从数据库需要的二进制操作日志发送给从数据库请求的I/O
线程 - 从数据库执行传输得到的二进制日志中的SQL操作
可以看到主从复制涉及到的线程:
从节点上:
- I/O Thread:从Master请求二进制日志事件,并保存于中继日志中。
- Sql Thread:从中继日志中读取日志事件,在本地完成重放。
主节点上:
- Dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向从节点发送二进制事件。
需要说明的一点是,主从复制并不是实时同步主数据库和从数据库的,首先进行I/O过程就是阻塞的过程,其次就是从数据库因为网络延时和执行SQL操作需要耗时的原因,主从数据库的数据一致化过程是需要延时的。
二. Mysql主从复制实验
2.1 主数据库服务器配置
2.1.1 打开主数据库的二进制日志
找到mysql配置文件(Linux下是/etc/mysql/my.cnf
)
搜索找到server-id
(一开始是被注释掉的),将server-id
和log_bin
的注释去掉。
2.1.2 主数据库创建新用户
CREATE USER 'rep1'@'从服务器的ip' IDENTIFIED BY '自定义密码'; // 创建了一个用户名位rep1的用户,只允许特定的ip登陆
GRANT REPLICATION SLAVER ON *.* TO 'rep1'@'从服务器ip'; // 给予主从复制的权限给rep1用户
FLUSH PRIBILEGES; // 刷新权限
上面的操作就是在主数据库上创建了一个用户rep1,rep1用户只允许特定的ip登陆,这个ip就是从数据库的ip地址,然后给予了主从复制的权限,有这个权限以后,从数据库才可以从主数据库读取二进制操作日志。
SHOW MASTER STATUS; // 查看主数据库状态
2.1.3 从数据库配置
首先也要指定server-id
,注意在一个主从复制群里每个id都是唯一的。
然后指定主服务器:
mysql> CHANGE MASTER TO
-> MASTER_HOST='主数据库id',
-> MASTER_USER='rep1',
-> MASTER_PASSWORD='自定义的密码',
-> MASTER_LOG_FILE='mysql-bin.000012',
-> MASTER_LOG_POS=154;
需要注意的是,要从主数据库中得的LOG_FILE和LOG_POSTION参数,意思就是从这个二进制文件(mysql-bin.000012
)的位置指针154
以后开始读取主数据库的二进制日志。
然后SHOW SLAVE STATUS;
查看从服务器状态。
看到Slave_IO_Running: Yes
和Slave_SQL_Running:Yes
,说明已经成了!
参考资料: