• Mysql在切换主从的时候,保业务还是保数据?


    目的

    备库作为主,主库作为备

    问题

    数据库不是静态的,切换的时候从库还有没应用完的中继日志,这里是保业务还是保数据?
    切换的时候,主库还在不断的写入数据,从库还没有追上主库。

    策略
    策略一:可靠性优先策略
    假设两个库都是正常运行,没有出现掉线,A主B备,B复制A,B库肯定有seconds_behind_master,这里是表示B落后A多少,小的时候是几秒钟,大的时候是几分钟甚至几十分钟上小时,所以在切换之前检查B检查A是否太多,假如太多那么不能切换!为什么不能?比如B落后A5秒内,这个时候切换比较合适,比如B落后A三秒,也就是B还有3秒的中继日志没重放,这个时候A开启只读 readonly=true,那么A库只读,B库也一般只读,AB都是只读,整个系统是只可读不可写,那么只能查询影响业务,那么A就不再产生Binlog了,B那么就不再接收新的中继日志了,那么B落后A越来越少,B直接网上追,那么几秒钟之后就追上A了,那么AB一致,这时候检查一下B库是否追上,B的seconds_behind_master=0,这个时候B库关闭只读readonly=false,B停止复制A库,A开始复制B。
    优势:保障中间数据不会丢失,比如从写A开始,A又不让写,代表客户端写不进A来,客户端就会等着,数据不会丢。问题是有几秒两个库都不可写,只能读,所以影响业务。也就是数据可靠,业务不可控。
    如果B落后A一分钟,一分钟不可写,那么很大程度影响业务。假如B一直落后A十分钟,那么这种可以考虑开启并行复制策略,让B抓紧追,等B追上来再切换。

    策略二:可用性优先策略
    取消等待数据一致的过程,取消B等待A。直接A开只读,B关只读,强行A复制B,B库停止复制A。
    优点:系统没有不可写的时间。
    缺点:有数据不可靠性,因为B落后A,B还有没有应用的中继日志,造成数据不一致的错误。比如客户端刚在A插入一条数据,这时候切换了主从,B还没来得及应用A的日志,这时候B就要改这条数据,但B没有这条数据,因为B还没来得及跑中继日志,还没追上,这时候改一个不存在的数据会造成数据不一致。
    但是这种策略适合一直往里写数据,不会改,而且没有复杂业务处理造成数据不一致。

    如果事务比较多的业务场景,尽量使用第一种可靠性优先策略

  • 相关阅读:
    ruby on rails爬坑(三):图片上传及显示
    js 实现图片实时预览
    Rails中的content_tag与concat用法,可以连接任意html元素
    rspec中的shared_examples与shared_context有什么不同
    RSpec shared examples with template methods
    How to Test Controller Concerns in Rails 4
    JMeter压力测试入门教程[图文]
    京东后台图片优化技巧
    程序猿,千万别说你不了解Docker!
    DIV+CSS:页脚永远保持在页面底部
  • 原文地址:https://www.cnblogs.com/wt645631686/p/15499684.html
Copyright © 2020-2023  润新知