目录:
一、主从复制基本概念
二、MySQL主从复制介绍
三、主从搭建配置
四、MySQL主从复制常见问题分析
一、主从复制基础概念
在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行。
1.1 二进制日志管理说明
二进制日志在哪?如何设置位置和命名?在my.cnf文件中使用 log-bin = 指定;命名规则为 mysql-bin.000000 (后为6位数字)
二进制日志位置:
日志命名:
二进制日志记录什么?二进制日志中记录的是一个个完成的事件
二进制日志格式是怎样的?推荐使用row格式
查看当前使用的日志格式:
二进制日志如何滚动?每次重启都会刷新日志,也可以通过命令进行刷新 reset master;
二进制日志用来干嘛?备份恢复,起始点的备份恢复
二进制日志的操作命令?查看都有哪些二进制日志
查看当前使用的二进制日志文件:
1.2 mysql传统备份方式和缺陷
- 二进制日志备份
- mysqldump
- 必须有数据库服务器完成逻辑工作,需要更多地cpu周期
- 逻辑备份还原速度慢:需要MySQL加载和解释语句、转化存储格式、重建引擎
- xtrabackup
- 文件大
- 不总是可以跨平台、操作系统和MySQL版本
1.3 MySQL主从复制能为我们做什么
高可用,辅助备份,分担负载
二、MySQL主从复制介绍
2.1 复制技术
作用:
1.保证数据安全(异机实时备份)
2.保证服务持续运行(宕机接管)
主从复制实现基本原理
1.自带功能,复制是MySQL的一项功能,允许服务器将更改从一个实例复制到另一个实例。
2.主服务器将所有数据和结构更改记录到二进制日志中。
3.从属服务器从主服务器请求该二进制日志并在本地应用其内容,即通过把主库的binlog传送到从库,从新解析应用到从库。
2.2 复制架构
mysql复制的应用常见场景:
应用场景1:从服务器作为主服务器的实时数据备份
应用场景2:主从服务器实现读写分离,从服务器实现负载均衡
应用场景3:把多个从服务器根据业务重要性进行拆分访问
传统的 MySQL复制提供了一种简单的主–从复制方法,有一个主,以及一个或多个从。
主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。
这是一个 shared-nothing 的系统,默认情况下所有 server 成员都有一个完整的数据副本。
(图)MySQL 异步复制
还有一个半同步复制,它在协议中添加了一个同步步骤。这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。
(图)MySQL 异步复制
在上面的两个图片中,可以看到传统异步 MySQL 复制协议(以及半同步)的图形展示。蓝色箭头表示在不同 server 之间或者 server 与 client 应用之间的信息交互。
2.3 MySQL主从复制原理介绍
复制过程:
- 开启binlog日志,通过把主库的binlog传送到从库,从新解析应用到从库。
- 复制需要3个线程(dump、io、sql)完成,5.6从库多个sql。
- 复制是异步的过程。主从复制是异步的逻辑的SQL语句级的复制。
复制前提:
- 主服务期一定要打开二进制日志
- 必须两台服务器(或者是多个实例)
- 从服务器需要一次数据初始化
- 如果主从服务器都是新搭建的话,可以不做初始化
- 如果主服务器已经运行了很长时间,可以通过备份将主库数据恢复到从库
- 主库必须要有对从库复制请求的用户。
- 从库需要有relay-log设置,存放从主库传送过来的二进制日志:
- show variables like '%relay%';
- 在第一次的时候,从库需要change master to 去连接主库。
- change master信息需要存放在http://master.info中
- show variables like '%master_info%';
- 从库怎么知道,主库发生了新的变化?通过http://relay-log.info记录的已经应用过的relay-log信息。
- 在复制过程中涉及到的线程
- 从库会开启一个IO thread(线程),负责连接主库,请求binlog,接收binlog并写入relay-log。
- 从库会开启一个SQL thread(线程),负责执行relay-log中的事件。
- 主库会开启一个dump thrad(线程),负责响应从IO thread的请求。
主从怎么实现的?
- 通过二进制日志,
- 至少两台(主、从)
- 主服务器的二进制日志“拿”到从服务器上再运行一遍。
- 通过网络连接两台机器,一般都会出现延迟的状态。也可以说是异步的。
2.4 执行原理--第一次开启主从过程
- 从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件:
- (user、password、port、ip)
- 并且让从库知道,二进制日志的起点位置(file名 position号)
- start slave
- 从库的IO和主库的dump线程建立连接
- 从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求
- 主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程
- 从库IO线程接收binlog evnets,并存放到本地relay-log中,传送过来的信息,会记录到http://master.iofo中
- 从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info,默认情况下,已经应用过的relay会自动被清理purge。
到此为止,一次主从复制就完成了
一旦主从运行起来:就不需要手工执行change master to,因为信息都会被存放到 http://master.iofoh(user、password、port、ip,上次获取过的binlog信息file和position)中。TG:li9047