Mysql实战(1):数据库间的备份方案

一、数据库备份的方案及意义

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::概念和原理介绍 以及 主从/主主模式 部署记录

原文地址:https://www.cnblogs.com/newbie27/p/10842760.html