金融业务容灾切换后监控和修正方案

前言

  • 关于MHA_Consul_MySQL高可用方案的简单总结和思考
    中所讲,该方案无法严格保证主从数据一致或者不丢数据,那么对数据准确性非常严格的业务,则需要在业务层面进行相应的对账和修正。

  • 对账的前提当然是要有流水,可以是业务流水(跟余额表事务绑定)或者是binlog的变更流水。

  • 既然是对准确性要求严格的业务,一般都应该会有业务流水。

方案描述

  • 方案以数据库切换事件为线索,描述切库前的事先准备、切库中的止损、切库后的监控和修正。

一、切库前

  1. 余额写redis缓存(如果有多机房,需要异步多写对应机房的redis,或nsq通知)

二、切库中

  1. 发生切库事件
  2. (切库之后的一段时间内)若有用户余额变动操作,比对redis和DB余额是否一致,不一致则阻断一段时间。
  • 缺点:不一致有可能是误伤(redis刚好写失败导致切库前就不一致)
  • 折中:针对一些大额变更才阻断,增加一些更细致的策略

三、切库后

  1. 指定主库和从库,对比流水日志
  2. 修复数据(若有不一致),并关闭冻结开关
  3. 无法修复的订单如何处理(用户余额不足)?
    • 考虑当坏账处理;通过余额调整(邮件审批方式同步团队成员);再按流水订单重新扣除

对比流水和修复大致思路

  1. 读旧主库和新主库的余额变更流水日志
  2. 对比得到旧主库存在而新主库不存在的余额变更流水日志
  3. 获取受影响的用户的余额,重放流水日志模拟分析,得到受影响人数,受影响金额,不可修复订单(比如余额不足)等情况
  4. 按照流水日志中的业务类型重新执行相应的业务sql(充值,消费,提现等)
  5. 修复完成之后,重建旧主库,并挂为主库