一 什么是主从复制
将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
基本原理:
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
MySQL复制是基于主服务器在二进制日志中跟踪所有对数据库的更改。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到日志的数据。
当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
二 主从复制的作用
1、主数据库出现问题,可以切换到从数据库。
2、可以进行数据库层面的读写分离。
3、可以在从数据库上进行日常备份。
三 复制过程
如数据库版本为5.7,安装以后文件对应目录:
mysql的数据文件和二进制文件:/var/lib/mysql/
mysql的配置文件:/etc/my.cnf
mysql的日志文件:/var/log/mysql.log
139为master
1、创建一个用户repl,并且允许其他服务器可以通过该用户远程访问master,通过该用户去读取二进制数据,实现同步。
Create user repl identified by \’repl\’;
repl用户必须具有replication slave权限,除此之外其他权限都不需要。
grant replication slave on *.* to \’repl\’@\’%\’ identified by \’repl\’;
2、修改140 my.cnf配置文件,在[mysqld]下添加配置
log-bin=mysql-bin //启用二进制文件
server-id=130 //服务器唯一ID
3、重启数据库
systemctl restart mysqld
4、登录到数据库
show master status —-查看master状态信息
140为slave
1、修改140 my.cnf配置文件,在[mysqld]下增加如下配置
server-id=132 ———服务器id,唯一
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
relad_only=1
2、重启数据库
systemctl restart mysqld
3、连接到数据库客户端,通过如下命令建立同步连接
change master to master_host=\’192.168.0.139\’,master_port=3306,master_user=\’repl\’,master_password=\’repl\’,master_log_file-\’mysql-bin.000001\’,master_log_pos=0(master_log_file,master_log_pos可以从master的show master status找到对应的值,不能随便写);
4、执行start slave
5、show slave status \\G; 查看slave服务器状态,当如下两个线程为yes,表示主从复制配置成功
Slave_IO_RUNNING=YES
Slave_SQ_RUNNING=YES
主从同步原理
1、master记录二进制日志。在每个事务更新数据完成之前,master在日志记录这些改变。MySql将事务串行的写入二级制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
2、slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程—I/O线程,I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
3、SQL线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据一致。