当我们不小心将数据库误操作,导致数据库不能用时,之前的话会立刻想到用mysqldump备份策略去恢复,但在恢复的过程中,业务是中断的,在此过程中我们的服务器无法向客户提供服务,这样势必会对我们的业务影响,所以,我们为了使其承载力提升,故障恢复时间减少,就采用数据库主从架构模型;
一:数据库主从模型的工作过程;
在master上:先将数据写进二进制日志里(binlog),由dump线程将二进制日志以一定的形式传给slave上的I/O线程;
在slave上:I/O线程一直监视着master上的二进制日志,当有变化时就拽过来,写入中继日志(relaylog)中,由SQL线程从中继日志中拉出日志再写入数据库,也可以再写入一个二进制日志中(为了以后的slave用);
在主服务器上将数据写入二进制日志之前的操作是:将数据先写入事务日志,然后写入内存,再写入二进制日志文件,再由二进制日志文件定期的往磁盘上更新数据;
事务日志:是innodb引擎特有的,存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退和数据库模式变化。事务日志还称作回滚日志undo或重做日志redo。是备份和恢复的重要组件;默认是开启的;
Redo记录的是已经全部完成的事务,就是执行了commit的事务,记录文件是ib_logfile0和ib_logfile1;
Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录在表空间中的(共享表空间或者独享表空间);
二进制日志:又叫变更日志,主要记录修改数据或者有可能引起数据改变的mysql语句,记录了语句发生的时间、执行时长、操作的数据等,可通过二进制日志进行数据恢复;
二:主从复制的具体实现;
1、首先在主服务器master上更改配置文件,开启二进制日志;
Vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql#数据库存放的目录(现是默认的路径);
server-id = num #唯一识别服务器的标志;
log-bin = mysql-bin #打开二进制日志(默认放在数据库所在的目录下,并起名为mysql-bin);
skip-name-resolve #关闭名称解析(可有可无)
2、在master上授权,使slave有复制权限,即创建一个带有密码的账号;
grant replication slave,replication client on *.* to slave@‘%’identified by ‘magedu’;
其中replication slave
,
replication client
:是专门针对数据库的主从复制权限;
3、查看主服务器二进制日志状态;
show master status;
4、配置从服务器slave;
Vim /etc/my.cnf
[mysqld]
server-id = 2
relay-log = mysql-relay-bin #开启中继日志,格式为二进制
ready-only = 1 #设置只读权限
log-bin = mysql-bin #也可以开启二进制日志
log-slave-updates = 1 #使relaylog日志中更新的数据写入二进制日志
5、启动从服务器复制线程,让slave连接master,并开始重做二进制日志中的事件;
CHANGE MASTER TO MASTER_HOST='192.168.242.246', #master的ip
MASTER_USER='slave', #连接master的数据库的用户名
MASTER_PASSWORD='magedu', #连接master数据库的密码
MASTER_LOG_FILE='mysql-bin.000002', #需要复制的二进制文件名
MASTER_LOG_POS=405; #起始的position位置
其中MASTER_LOG_FILE和MASTER_LOG_POS这两项可在master上通过“
show
master status
;”查看到当前的文件名和位置号;
然后执行
start slave #开启I/O线程和SQL线程
6、查看从服务器状态;
Show slavestatus\G;
注意:若是在第五步中文件名和位置号两个中的其中一个不对应,在这里显示时,就不是下面的结果,然后也不能实现主从复制;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
我碰到的一个问题就是其中的IO线程时Connecting状态,然后我在master的数据库上创建数据库,在slave上也不能同步,后来发现原来是文件名和位置号写错了,我一直以为要从头开始,即文件要写第一个文件,位置号要写最开始的;其实不然,在执行第五步操作时,要先在master上查看一下主服务器的状态,把当时显示的文件名和位置号写下来就好了!
三:主从复制的测试;
在做测试之前,要确保我们slave上的IO线程和SQL线程是Yes的状态,然后关闭防火墙和SElinux;
1、在master上的数据库中可以去创建数据库或者在某个数据库中创建一个表;
2、在slave上的数据库中相应的位置上查看是否生成master上刚执行的操作结果(创建的数据库或者表);
3、若是两台机器上的数据库完全一样,那就证明主从复制的模拟实验成功;
4、若是没有同步就去查看一下slave的状态,IO线程和SQL线程是否都是Yes;查看一下防火墙;