一、主从复制原理
复制涉及的概念
- 两个日志
BinLog:二进制文件,存储MasterDB中修改数据的内容。存储内容的格式有Statement,Row,Mixed。
Relay Log : 功能作用与Binlog一样,不同点在于当日志内的内容被读取完后,会被删除。
- 三个线程
Binlog dump
将读取Binlog后发送数据给IO线程
IO 线程
将接收到数据传给RelayLog日志
SQL线程
读取RelayLog数据
复制步骤如下
- 从库需要配置主库信息,建立连接
- Master数据库数据发生更改时,会记录在Binlog日志中
- Binlog dump线程读取Binlog中的内容,将数据发送给IO线程
- IO线程再将数据存入RelayLog中
- SQL线程读取RelayLog中的数据并写入从库
二、工具
- VMware:12.0
- Centos:7.0
- Mysql:5.7.16
- Master服务器:192.168.3.45
- Slave服务器:192.168.171.129
三、步骤
1.安装Mysql。详情请看 安裝mysql5.7教程
2.修改主从服务器的配置./etc/my.cnf
## 192.168.3.45(master)
bind-address=192.168.3.45 #master 服务器地址
log_bin=mysql-bin
#确保主从server_id要不同
server_id=128
## 192.168.171.129(slave)
bind-address=192.168.171.129 #slave 服务器地址
log_bin=mysql-bin
#确保主从server_id要不同
server_id=130
注意:
要在[mysqld]下添加上面的内容并保证server_id唯一
3.重启主从服务器中的mysql
service mysqld restart
4.主数据库中创建从连接的用户
## 创建 test 用户,指定该用户只能在主库 192.168.3.45 上使用 123456 密码登录
mysql> create user 'test'@'192.168.3.45' identified by '123456';
## 为 test 用户赋予 REPLICATION SLAVE 权限。
mysql> grant replication slave on *.* to 'test'@'192.168.171.129';
## 查看用户
mysql> select user,host from mysql.user;
## 查看 master 状态
mysql> show master status;
## 记录一下的File名称和Pos位置
5.salve配置连接信息
mysql> change master to
-> master_host='192.168.3.45',
-> master_user='test',
-> master_password='123456',
-> master_log_file='mysql-bin.000012',
-> master_log_pos=1204;
mysql> start slave;
mysql> show slave status \G
- 如果IO_Running和SQL_Running都为Yes,表示成功连接
- 若有一个为不为Yes,代表未连接上。这时候需要在IO_Error中看查看具体的错误信息
6.测试是否能够复制成功
master 插入一条数据,slave查看是否成功
192.168.3.45(master):
192.168.171.129(slave):
四、常见问题
- master与slave的server_id相同时,会发生如下错误
五、扩展
接下来会介绍常见的三个架构中的主主复制配置,其实主主配置,也就是互相依赖。原先主从配置中的主master依赖着从slave。就相当于两个主从配置。
1.按照上面的主从配置后,需要配置重要的信息,主键重复,server-id不能重复
--192.168.3.45
server-id=11 #任意自然数n,只要保证两台MySQL主机不重复就可以了。
log-bin=mysql-bin #开启二进制日志
auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL
binlog-ignore=mysql #忽略mysql库【我一般都不写】
binlog-ignore=information_schema #忽略information_schema库【我一般都不写】
replicate-do-db=aa #要同步的数据库,默认所有库
--192.168.171.129
server-id=12
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
replicate-do-db=aa
配置好后重启MySQL
2.主master创建slave可访问的mysql用户
192.168.3.45中
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql11’@’192.168.171.129’ IDENTIFIED BY ‘mysql11’;
mysql>FLUSH PRIVILEGES;
查看二进制日志名和位置
mysq>show master status;
3.slave中连接master
在192.168.171.129中执行:
mysql>CHANGE MASTER TO
MASTER_HOST=’192.168.3.45’,
MASTER_USER=’mysql11’,
MASTER_PASSWORD=’mysql11’,
MASTER_LOG_FILE=’mysql-bin.000084’,
MASTER_LOG_POS=107;
4.测试是否成功配置
show slave status
当看到Slave_IO_Running: YES、Slave_SQL_Running: YES才表明状态正常
5.主从复制和主主复制的区别
主从配置:
- 适用场景:在读取压力非常大的时候,可以通过配置主从复制实现读写分离,降低主库的读取压力
- 缺点:当从库数量多时,会增加主库io压力,降低复制效率
主主配置:
- 作用:减少主从切换带来的性能消耗
- 注意:多个主库要保证主键不能重复,即自增auto_increment