什么是单元化?
单元化,是业务在容灾能力建设,水平伸缩能力建设中的一种架构实现,单元是业务以某种维度划分的分片,业务流量可以按照比例在单元间调度,与一般的多地域跨机房多活不一样的是,跨机房多活一般在数据库层面不进行拆分,不能多活。而单元化中业务逻辑处理是闭环的(分片自治,分而治之),每个单元拥有处理业务逻辑的所有资源(服务能力与数据)
单元化技术特点
- 单元以某种维度进行划分(地域,商户id,用户id等),业务逻辑处理封闭在单元内部,单元间的流量可以按照路由规则灵活调拨
- 单元间的数据同步,相互备份,每个单元在同城(异地)可以在故障期间相互接管
单元化的切分思路
- 按业务类型
- 用户id
- 按地理位置 (外卖/打车/地图服务:商家用户、骑手都在同一地域)
单元化的业务场景
流水单据型(改造相对容易)
- 业务应用场景:典型的业务场景如电商交易,账单流水
- 数据特点:多笔业务数据不互相关联,按照一定维度进行分片可接受最终一致
状态型数据(双活不好做)
- 业务应用举例:比如账户余额数据
- 数据特点:状态数据是全局状态的,每笔业务能否成功执行依赖数据状态的准确性。对于状态性数据要保证强一致性,账户余额需要优先保证一致性,不然容易资损
构建/多活时面临的数据的技术解决方案
所谓的多活可以理解成多主结构,也就是多地可写
在单活的场景下,通常依靠mysql主从进行数据,多活场景下,可以类似主从的方案,借助mysql repluation 协议信息进行数据的同步
实现原理:
主要问题
数据回环
如果对同步的数据不加过滤仍由其在不同SET的数据库中来回复制,不仅消耗大量的网络带宽,最终还会导致数据不一致。
常见的解决办法
1. 引入额外字段,在表中添加额外字段标注机房信息,但缺点是要侵入业务表
2. GTID,mysql的原生实现,在事务中标注信息,但只能用于mysql的双向同步
3. 对SQL打标,在sql hint中标注sql产生的机房,在回环同步时写入时如果发现是同机房产生的则过滤掉,此方案不仅能跨数据源,对业务侵入也小,但需要有额外的同步开销
数据一致性校验
存量数据如何同步,增量数据同步过程中,如何解决冲突问题。
冲突的解决策略办法
跨地域同步性能问题
双写冲突(容灾切换期间)
单元化改造路径
单元化的方案一般不是一开始就基于单元化去实现的,大多都是基于业务的发展,