主从复制的基本原理
-
三步骤+原理图
master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events。
- slave将master的binary log events拷贝到它的中继日志(relay log)
- slave重做“中继日志”中的事件,将改变应用到自己的数据库中。MySQL复制是 异步的且串行化的
复制的基本原则
MySQL 数据库一主一从
一主一从的常见配置前提条件
- mysql 版本一致且后台以服务运行
- 双向网络是否ping通
-
修改主机配置文件 (my.ini)文件
主服务器唯一ID(必须)
- server-id=1
- 启用二进制配置文件(必须)
- 如下 log-bin=mysql-bin
- 启用错误日志(可选)
- log-err=本地mysql路径/mysqlerr
- 如下 log-err=E:/mysql/mysql-5.7.21-winx64/data/mysqlerr
- 根目录(可选)
- basedir=mysql本地路径
- 如下 basedir=E:/mysql/mysql-5.7.21-winx64
- 临时目录(可选)
- tmpdir=mysql本地路径
- 如下 tmpdir=E:/mysql/mysql-5.7.21-winx64
- 数据目录(可选)
- datadir=mysql本地路径/data
- mysql数据库的数据库[数据目录] 如下 datadir=E:/mysql/mysql-5.7.21-winx64/data
- read-obly=0
- 主机,读写都可以
- 设置不可复制的数据库(可选,不像复制的数据库,填写在下面)
- binlog-ignore-db=mysql
- ….
- 设置需要复制的数据库名
- binlog-do-db=数据库名
- ….
binlog_format=STATEMEN(默认)
从服务器唯一ID(必须)
- server-id=2
启用二进制日志(可选)
注意关闭 linux的防火墙主机从机都关闭防火墙
- 关闭虚拟机linux防火墙
- service iptables stop
- win手动关闭
linux 查看防火墙状态
grant replication slave on . to ‘zhangsan’@’192.168.73.129’ identified by ‘123456’ ;
- 刷新权限
- flush privileges;
- 查看master状态
- show master status;
- 记录下File和Position的值
执行完此操作之后不要再操作主服务器MYSQL,防止主服务器状态值变化
在Linux从机上配置需要复制的主机
change master to master_host='主机IP',master_user='zhangsan',
master_password='123456',
master_log_file='File名字',
master_log_pos=Position数字;
启动从服务器复制功能
- start slave;
- show slave status\G
- 下面两个参数都是Yes,则说明主从配置成功!
- Slave_IO_Runing:Yes
- Slave_SQL_Runing:Yes
主机新建库、新建表、insert记录,测试从机复制
create database datelog;
use datelog;
create table dog(id int not null,name varchar(20));
insert into dog values (1,'ddd');
- 从机测试数据
select * from dog;
如何停止从服务复制功能
- stop slave;
MySQL 数据库双主双从
一个主机 m1 用于处理所有写请求,它的从机 s1 和另一台主机 m2 还有它的从机 s2 负责所有读请 求。当 m1 主机宕机后,m2 主机负责写请求,m1、m2 互为备机。架构图如下
编号 | 角色 | IP地址 |
---|---|---|
1 | Master1 | 192.168.140.128 |
2 | Slave1 | 192.168.140.127 |
3 | Master2 | 192.168.140.126 |
4 | Slave2 | 192.168.140.125 |
双主机配置
Master1配置
修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
Master2配置
修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=3 #启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
双从机配置
Slave1配置
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
Slave2配置
修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=4 #启用中继日志
relay-log=mysql-relay
双主机、双从机重启 mysql 服务
主机从机都关闭防火墙
在两台主机上建立帐户并授权 slave
#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';
#查询Master1的状态
show master status;
#查询Master2的状态
show master status;
- 分别记录下File和Position的值
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
在从机上配置需要复制的主机
Slava1 复制 Master1,Slava2 复制 Master2
#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
Slava1的复制命令
- Slava2的复制命令
启动两台从服务器复制功能
- Slava2的复制Master2
下面两个参数都是Yes,则说明主从配置成功!
Master2的复制命令
- Master1的复制命令
启动两台主服务器复制功能
- Master1的复制Master2
- 下面两个参数都是Yes,则说明主从配置成功!
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Master1 主机新建库、新建表、insert 记录,Master2 和从机复制
如何停止从服务复制功能
- stop slave;
如何重新配置主从
- stop slave;
- reset master;