3.1 复制概述
复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中, 然后在从库上对这些日志重新执行(也叫重做), 从而使得从库和主库的数据保持同步.
MySQL 支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库, 实现链状复制.
3.2 复制原理
MySQL 的主从复制原理如下.
从上层来看, 复制分成三步:
Master 主库在事务提交时, 会把数据变更作为时间 Events 记录在二进制日志文件 Binlog 中.
主库推送二进制日志文件 Binlog 中的日志事件到从库的中继日志 Relay Log .
slave 重做中继日志中的事件, 将改变反映它自己的数据.
3.3 复制优势
MySQL 复制的有点主要包含以下三个方面:
主库出现问题, 可以快速切换到从库提供服务.
可以在从库上执行查询操作, 从主库中更新, 实现读写分离, 降低主库的访问压力.
可以在从库中执行备份, 以避免备份期间影响主库的服务.
3.4 搭建步骤(主从复制集群搭建)
首先准备两台主机并关闭防火墙:
service iptables stop
- 3.4.1 master(主节点)
- (这里我们让 ip 为 192.168.157.134 的主机作为主节点)
1) 在 master 的配置文件 (/usr/my.cnf) 中, 配置如下内容:
- #MySQL 服务 ID, 保证整个集群环境中唯一
- server-id=1
- ?
- #MySQL binlog 日志的存储路径和文件名
- log-bin=/var/lib/MySQL/mysqlbin
- ?
- # 错误日志, 默认已经开启
- #log-err
- ?
- #MySQL 的安装目录
- #basedir
- ?
- #MySQL 的临时目录
- #tmpdir
- ?
- #MySQL 的数据存放目录
- #datadir
- ?
- # 是否只读, 1 代表只读, 0 代表读写
- read-only=0
- ?
- # 忽略的数据, 指不需要同步的数据库
- binlog-ignore-db=MySQL
- ?
- # 指定同步的数据库
- #binlog-do-db=db01
2) 执行完毕之后, 需要重启 MySQL:
service MySQL restart ;
3) 创建同步数据的账户, 并且进行授权操作:
- grant replication slave on *.* to 'copyuser'@'192.168.157.135' identified by 'admin123';
- ?
flush privileges; -- 刷新权限列表
说明:
grant replication slave: 给用户名为 copyuser 的用户授予主从复制权限
*.*: 该权限应用于所有数据库所有表
copyuser: 被赋予权限的用户名
admin123: 该用户的登录密码
192.168.157.135: 指定哪个服务器上可以使用上面的用户访问(一般是从节点 IP)
4) 查看 master 状态:
show master status;
字段含义:
File : 从哪个日志文件开始推送日志文件
Position : 从哪个位置开始推送日志
Binlog_Ignore_DB : 指定不需要同步的数据库
3.4.2 slave(从节点)
1) 在 slave 端配置文件中, 配置如下内容:
- #MySQL 服务端 ID, 唯一
- server-id=2
- ?
- # 指定 binlog 日志
- log-bin=/var/lib/MySQL/mysqlbin
2) 执行完毕之后, 需要重启 MySQL:
service MySQL restart;
3) 执行如下指令 :
change master to master_host= '192.168.157.134', master_user='copyuser', master_password='admin123', master_log_file='mysqlbin.000003', master_log_pos=415;
说明:
change master to master_host= '192.168.157.134',: 主节点 IP
master_user='copyuser': 指定执行同步时使用哪个用户登录
master_password='admin123': 指定执行同步时用户登录的密码
master_log_file='mysqlbin.000003': 和上面主节点 show master status; 查询出来的内容保持一致
master_log_pos=415; 和上面主节点 show master status; 查询出来的内容保持一致
以上指定当前从库对应的主库的 IP 地址, 用户名, 密码, 从哪个日志文件开始的那个位置开始同步推送日志.
4) 开启同步操作
- start slave;
- ?
- show slave status \G;
注意!!! 要保证上面两项都为 yes, 出现 IO:NO 的情况可能是我们两台主从服务器的 UUIDs 是相同的(因为我的两台虚拟机是安装过数据库之后克隆的, 所以数据库所有信息一样)
解决:
分别去看看两台服务器的 / var/lib/MySQL/auto.cof; 果然 UUIDs 是相同的, 随便改变一个数据库的 UUIDs 的数值, 然后重启数据库
再次执行
show slave status \G;
5) 停止同步操作
stop slave;
3.4.3 验证同步操作
1) 在主库中创建数据库, 创建表, 并插入数据 :
- create database db01;
- use db01;
- create table user(
- id int(11) not null auto_increment,
- name varchar(50) not null,
- sex varchar(1),
- primary key (id)
- )engine=innodb default charset=utf8;
- insert into user(id,name,sex) values(null,'Tom','1');
- insert into user(id,name,sex) values(null,'Trigger','0');
- insert into user(id,name,sex) values(null,'Dawn','1');
- sql
2) 在从库中查询数据, 进行验证 :
在从库中, 可以查看到刚才创建的数据库:
在该数据库中, 查询 user 表中的数据:
来源: http://www.bubuko.com/infodetail-3651874.html