MySQL主从复制原理及部署
概要
MySQL主从复制是什么?
主从复制主要实现的是什么?
主从复制的概念
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
主从复制的原理
- 从库会生成两个线程,一个I/O线程,一个SQL线程;
- I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
- SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
MySQL主从形式
一主一从
一主多从,提高读的性能
一主一从和一主多从是最常见的主从架构,实施起来简单并且有效,不仅可以实现HA,而且还能读写分离,进而提升集群的并发能力。
多主一从(从5.7开始支持)
多主一从可以将多个mysql数据库备份到一台存储性能比较好的服务器上。
双主复制
双主复制,也就是互做主从复制,每个master既是master,又是另外一台服务器的slave。这样任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
MySQL主从复制模式
MySQL 主从复制默认是异步的模式。MySQL增删改操作会全部记录在binary log中,当slave节点连接master时,会主动从master处获取最新的bin log文件。并把bin log中的sql relay。
异步同步
这种模式下,主节点不会主动push bin log到从节点,这样有可能导致failover的情况下,也许从节点没有即时地将最新的bin log同步到本地。
半同步模式
这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到了一个从节点上,不能保证从节点将此事务更新到db中。性能上会有一定的降低,响应时间会变长。
全同步模式
全同步模式是指主节点和从节点全部执行了commit并确认才会向客户端返回成功。
环境准备
首先
系统 Centos 7.6.1810
master节点(10.0.0.11)
slave节点(10.0.0.12)
部署好MySQL数据库(我们这里是部署的5.7.28)过程省略可参考http://39.100.251.225/?p=57
如果有重要数据请提前做好备份
映射主机名
master节点
echo '10.0.0.12 slave' >> /etc/hosts
slave节点
echo '10.0.0.11 master' >> /etc/hosts
mysql-master节点操作
在Master(主节点)创建一个test数据库和数据表进行实验
show databases;
create database test;
use test;
create table student (id int(11) not null)charset=utf8;
show tables;
然后修改master的配置文件
vim /etc/my.cnf
在最后添加如下两行:
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id
binlog-do-db=test #可以被从服务器复制的库
重启MySQL
systemctl restart mysqld
Mater(主)数据库 授权(Slave)从数据库
mysql> create user 'slave'@'slave' identified by '123456'; #创建slave用户数据库,设置密码为:123456
mysql> grant replication slave on *.* to 'slave'@'slave' ; #授权slave用户数据库的异步复制权限
如果修改密码报错可以修改下密码策略
slave端测试登录
mysql -h master -u slave -p123456
master节点操作
在master (主节点)导出所有数据库,并远程复制到slave(从节点)上
mysqldump -u root -p -A > test1.sql(导出master节点的所有数据库)
ls test1.sql(查看数据库是否存在)
scp -r test1.sql root@slave:/root(远程复制到slave节点上)
slave端操作
在slave(从节点)导入master(主节点)的所有数据库
mysql -u root -p < test1.sql(导入数据库)
mysql -u root -p
show databases;
use test;
show tables;
配置slave节点的配置文件
vim /etc/my.cnf
server-id=2 #服务的标识符
replicate-do-db=test #指定Master(主节点)同步数据库名称
log-bin=mysqllog #指定Master(主节点)的日志名称
重启数据库
systemctl restart mysqld
master节点操作
查看数据库状态
mysql -uroot -p
show master status;
slave节点操作
mysql> change master to
-> master_host='master', #要对应Master的主机名(ip)
-> master_user='slave', #要对应Master的数据库的(slave)用户
-> master_password='123456', #要对应Master的数据库的(slave)用户的密码
-> master_log_file='mysqllog.000001', #要对应Master(主节点)的日志文件
-> master_log_pos=605; #要对应Master(主节点)的日志文件的位置的号码
start slave;
这两个状态必须要都是yes
show slave status \G
Slave_IO_Running: Yes #IO_Running为yes才可以与Mater(主节点)的io流通信
Slave_SQL_Running: Yes #SQL_Running为从节点(slave)的运行状态
master节点测试插入一条数据是否能在slave节点同步
use test;
insert into test.student values(10);
select * from student;
slave节点查看
use test;
select * from student;
成功