分表总结

业务场景主要是对于一些历史表由于业务增长太快导致表数量超过3000w以上,使得查询性能下降。
因此需要分表。

在做分表时,需要考虑原先数据的迁移,保证功能不受影响,数据完整性正确。
所以需要分析相应表的业务特点,包括给出是停机做分表还是不停机做分表。

基本原则是:
业务稳定性为主,数据正确性为主,不求快,做开关,出现问题可回退,有相应预案。

不停机做扩容分表,需要双写。

大致有以下几种类型表:
1.流水表
特点:
数据写入后不会再发生变化。

对于这类的分表,可以按时间分。

可能做到不停机扩容:
流程如下:
1.1.发布新程序,双写,即新表与旧表同时写
新程序增加开关,控制业务使用新表还是旧表。
假设上线新程序时间为:7-10日

1.2.将旧表的数据,往新表迁包括历史数据
操作时间: 7-11日
将7-11日0点之前旧表的所有数据迁移到新表。

1.3.检查新表与旧表的完整性,一致性
前提条件:1.2.迁移操作完成
一个是条数维度,一个是明细维度,可以在人少的时候进行job检查操作。

操作时间可以在:7-12凌晨1点
检查数据范围:7-12之前的数据。

出现数据不一致,需要找出原因,然后进行相应处理。
可能的情况包括:新表旧表双写程序有误。迁移job的程序漏迁移相应程序记录。

1.4.开启业务读逻辑走新表
前提条件:【检查新表与旧表的完整性,一致性】完成并且正确。

这个阶段还是双写阶段。

7-13日,开启。
观察业务数据,每天检查前一天的新表数据与旧表数据是否一致。
有对账手段,新表与旧表相对实时的记录数比较。

预案:出现业务异常时,快速定位原因,如果是新表查询这块逻辑有问题,则快速切回旧表查询逻辑。

1.5.关闭旧表写逻辑
前提条件:【开启业务读逻辑走新表】这块操作成功,并且业务运行正常。

可以在7-20日左右关闭旧表写。
观察对账数据。


2.类账户表
特点:
数据写入一次,但会存在多次更新。

流程:
停机方案:
a.上线新程序版本,控制业务使用新旧表开关
b.停止外部流量(外部业务开关,提示用户暂停交易),停止旧表的写入操作(db层)。
c.确保无流量进入后,将旧表数据迁移到新表
d.校验旧表新表数据一致性
e.开启开关让业务使用新表逻辑
f.内部测试
g.全部正确后对外开放流量
h.监控数据
主要是对账,发现异常则需要看异常是什么,然后做相应处理。影响比较大,则需要停止这个业务交易。做紧急修复。


不停机方案:
2.1.离线将历史记录写入到新的分表集合
出现写入失败找出原因,这步失败不影响业务。

2.2.上线新程序,旧表与新表更新同一个事务
一个更新记录业务,发现不存在新表记录则做插入,存在则做更新,一个事务。
新写入则做旧表与新表双写。

2.3.检查新表旧表
检查旧表新表数据,发现旧表存在新表不存在则将该记录迁移到新表。
发现新表存在旧表不存在就是严重bug了,需要查找原因。
预案:这步异常,不影响业务,因此所有读写逻辑走的还是旧表。

2.4.开启业务读写走新表开关
在2.3.这步操作完后,新表与旧表数据是一致的,这时开启业务逻辑走新表。
监控,对账。

预案:
a.旧表存在记录,新表没有
导致的问题现象是账户取现类操作报错,客户账户查询之前的余额不见了。
处理:
快速切回旧表写及读逻辑

2.5.在业务监控对账没问题后,关闭旧表更新及写入逻辑
要确保运行至少一周以上。


3.类订单表
特点:
数据写入一次,多次更新,存在状态。

基本原则是:
双写,多个流程做开关,业务稳定及数据完整性第一,不求快。

3.1.创建表,离线同步数据,新表上有个字段存储旧订单号。
这步需要将旧表的订单全部同步到新表,对应需要生成新的订单记录。

这步后,新表与旧表会相差一小部分增量进来的订单。后面需要补足。
3.2.上线新后台,双写阶段,旧表新表,一起写。记录下这个时间点。
这个阶段,新写入的订单需要新旧表一起写,对外还是以旧订单号。
这个阶段创建的订单,能够保证状态都是一致的,更新也是新旧订单一起写,一个事务。

在做补偿时,如果发现旧表有订单,则记录error log,这时暂时不处理。这部分订单就是在上线第2步时产生的增量数据。
不会很多。
补偿时,如果发现新表也有订单,则成功补偿后,一个事务更新。

这步出现异常,可以回退版本。

3.3.每天检查新旧表数据量是否相同,并且新旧表的记录是否一致。包含状态一致。有异常的,需要介入处理。
检查旧表存在,新表没有的,需要在新表生成新订单。

3.4.运行一周,然后检查在第2步【上线新后后,双写阶段】之前的订单新旧表是否一致。
这里,如果存在不是终态的,如果也没在新表里,在之后启用新表后查询会有问题。通常未完成订单需要补单。
3.5.都没问题后,某个业务的新表查询,这部分主要拿一个相对不重要的业务做试点,试运行二周.
这步相当于这个试点业务,已经完全采用新表逻辑了,因为新旧表是双写,这里新表查询也开启了。

这步如果发现有异常,则将新表查询回退到旧表查询,用开关控制,对应需要看具体异常具体处理。

3.6.试点业务运行正常,则开启另外几个业务。试运行四周。
出现异常,如果发现新表查询这个逻辑有问题,需要回退到旧表查询,用开关控制。

3.7.所有都运行正常,相当于新表查询已经对全业务开启。运行二个月,然后之后没问题再停止旧表的写入。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值