MySQL备份与Binlog恢复

一、MySQL全量备份 =》数据快照

mysqldump -uroot -p testdb > test.sql

mysql -uroot -p testdb < test.sql

 

二、增量备份 =》Binlog,操作日志

 

show variables like '%log_bin%';

show master status;

 

问题1:mysql如何开启binlog?

vim /etc/mysql/mysql.conf.d/mysqld.cnf

log_bin = /var/log/mysql/mysql-bin.log

 

/etc/init.d/mysql stop 
/etc/init.d/mysql start

 

show variables like '%log_bin%';

 

 

 show master status;

 

 

binlog恢复


mysqlbinlog --start-datetime "2022-05-13 15:00:00" --stop-datetime "2022-05-13 15:10:00" /var/log/mysql/mysql-bin.000001 | mysql -uroot


三、MySQL HA高可用

MySQL HA:主库Binlog,立刻复制到备机上重放;旦主库宕机,立即切换到备机上继续提供服务

 

主从数据库更新数据时序

  • 在主库的磁盘上写入 Binlog;
  • 主库更新存储引擎中的数据;
  • 给客户端返回成功响应;
  • 主库把 Binlog 复制到从库;
  • 从库回放 Binlog,更新存储引擎中的数据

主从延迟

    正常情况:主从延迟基本是毫秒级别,实时同步

   异常情况: 主或从库繁忙,出现明显主从延迟

 

问题:主库宕机并且主从存在延迟的情况下,切换到从库继续读写,可以保证业务的可用性,但是主从延迟这部分数据就丢失了?

     方案1:不丢数据,牺牲可用性  =》 停止主机服务,将Binlog全部同步到备机,再切换到备机后提供服务

     方案2:保证可用性,允许丢失部分数据 =》 第一时间切换到备机

     方案3:保证可用和不丢数据 ,牺牲性能 =》 MySQL同步复制机制,开启同步复制后,MySQL主库等待数据成功复制到从库后,再给客户端返回相应

     https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.html

       新的问题:从库宕机,主库一直等待主库,主库被卡死

     方案4:1主2从

       主库配置成功复制任意从库就返回,不影响主库写入数据,解决从库宕机阻塞主库的问题

        主库宕机,至少有1个备机数据和主库数据完全一样,将该从库切换成新的主库,继续提供服务

 

 

异步复制与同步复制

 默认情况:MySQL采用异步复制技术,写入Binlog,提交事务更新存储引擎的数据,即给客户端返回成功响应。

 同步复制时,主库在提交事务的时候,会等待数据复制到所有从库之后,再给客户端返回响应

 半同步机制: MySQL5.7版本+,事务线程不用等待所有复制成功响应,只要部分复制相应回来即可

 

rpl_semi_sync_master_wait_slave_count:至少等待数据复制到几个从节点再返回(默认配置1),数量配置的越大,丢数据的风险越小,但是集群的性能和可用性就越差

rpl_semi_sync_master_wait_point:这个参数控制主库执行事务的线程,是在提交事务之前(AFTER_SYNC)等待复制,还是在提交事务之后(AFTER_COMMIT)等待复制。默认是 AFTER_SYNC,也就是先等待复制,再提交事务,这样完全不会丢数据。AFTER_COMMIT 具有更好的性能,不会长时间锁表,但还是存在宕机丢数据的风险

 

主库超时降级策略

主库提交事务的线程等待复制的时间超时了,这种情况下事务仍然会被正常提交,MySQL 会自动降级为异步复制模式,直到有足够多(rpl_semi_sync_master_wait_no_slave)的从库追上主库,才能恢复成半同步复制

 

四、复制状态机技术

 https://en.wikipedia.org/wiki/State_machine_replication

快照:MySQL全量备份某一刻数据;Redis Snapshot; 

操作日志:MySQL Binlog记载每次数据更新变化;Reids backlog;

 

复制数据时:基于某个快照,按照顺序执行快照后的所有操作日志,可以得到完全一样的状态。

                     事件朔源的应用程序:state + action = next state

异步复制(性能最好):主节点上先记录操作日志,再更新状态数据,然后异步把操作日志复制到所有从节点上,并在从节点执行操作日志,得到和主节点相同的状态数据

    缺点:存在主从延迟,主节点宕机,可能会丢数据

半同步复制:等待操作日志最少成功复制到N个从节点后,并更新状态。性能、高可用和数据可靠性最佳,分布式存储系统默认采取该策略

 

posted @ 2022-05-13 15:48  mick0802  阅读(195)  评论(0编辑  收藏  举报