一、数据库备份的方案及意义
1、数据库备份的意义和用途
- 实时灾备,用于故障切换
- 读写分离,提高查询速度,减轻服务器负载
- 备份,避免影响业务
2、Mysql实现主从部署的必要条件:
- 主库开启binlog日志(设置log-bin参数)
- 主从server-id不同
- 从库服务器能连通主库
3、备份方案,有以下五种方式:
- 一主一从
- 主主复制
- 一主多从:扩展系统读取的性能,因为读是在从库读取的;
- 多主一从:5.7开始支持
- 联级复制
二、主从备份的实现原理
Mysql的主库中数据修改后,会产生增量的二进制日志文件,从库通过监听主库增量的日志文件,并拉取日志文件,来实现更新从库数据的目的。
1、主从备份原理:
第一步:就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二步:就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
第三步:SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
2、从库拉取主库日志文件的步骤如下:
- (1)第一步是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
- (2)从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;
- (3)主库IO线程对比从库发送过来的master.info里的信息,将binlog文件信息,偏移量和binlog文件名等发送给从库
- (4)从库接收到信息后,将binlog信息保存到relay-bin中,同时更新master.info的偏移量和binlog文件名
- (5)从库的SQL线程不断的读取relay-bin的信息,同时将读到的偏移量和文件名写道relay-log.info文件,binlog信息写进自己的数据库,一次同步操作完成。
- (6)完成上次同步后,从库IO线程不断的向主库IO线程要binlog信息
- (7)从库如果也要做主库,也要打开log_bin 和log-slave-update参数
三、数据库备份,产生的新问题及解决方法
1、主从复制存在的问题,以及解决的办法
(1)主库宕机后,数据可能丢失的问题
解决办法:采用半同步复制的方式
(2)从库只有一个sqlThread,主库写压力大,复制很可能延时
解决办法:采用并行复制,解决从库复制延迟的问题
2、半同步复制方案:解决主库宕机后,数据可能丢失的问题
//修改数据库配置,增加半同步复制
mysql semi-sync
(1)半同步复制的特点:
- 5.5集成到mysql,以插件的形式存在,需要单独安装
- 确保事务提交后binlog至少传输到一个从库
- 不保证从库应用完这个事务的binlog
- 性能有一定的降低,响应时间会更长
- 网络异常或从库宕机,卡主主库,直到超时或从库恢复
(2)异步复制、半同步复制的原理图:
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
3、并行复制:解决从库复制延迟的问题
//在数据库中增加并行复制设置
//设置sql线程数为10
set global slave_parallel_workers=10;
(1)并行复制的特点:
- mysql并行复制
- 社区版5.6中新增
- 并行是指从库多线程apply binlog
- 库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)
以上内容转载自: Mysql主从备份原理
四、Mysql数据各项配置说明
1、主从备份中,配置的server-id 有什么用?
- 在Mysql集群中,server-id是每一台数据库的身份标识,同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入的,所以server-id一定要有的。
- 在主库中,用来标识从库的线程id:每一个同步中的slave在master上都对应一个master线程,该线程就是通过slave的server-id来标识的;每个slave在master端最多有一个master线程,如果两个slave的server-id 相同,则后一个连接成功时,前一个将被踢掉。 该策略是基于以下情况的考虑:slave主动连接master之后,如果slave上面执行了slave stop;则连接断开,但是master上对应的线程并没有退出;当slave start之后,master不能再创建一个线程而保留原来的线程,那样同步就可能有问题。
- 在主主备份中,用来防止备份环的出现:在mysql做主主同步时,多个主需要构成一个环状,但是同步的时候又要保证一条数据不会陷入死循环,这里就是靠server-id来实现的。
2、mysql配置文件 /etc/my.cnf 详细解释
请参考以下资源: mysql配置文件 /etc/my.cnf 详细解释
五、实战:配置主从备份
备份的方法,请参考以下资源:
资源1:主从备份完整版
资源2:主主备份方案
资源3::概念和原理介绍 以及 主从/主主模式 部署记录