1、背景
在当前常用的异地多活架构中,主要通过在多个数据中心各自部署冗余的业务系统进行数据分区处理,然后进行数据层的多向同步,实现系统的多活,避免写冲突,一旦机房故障,可以将流量随时切换至可用的机房,迅速恢复业务。因此,一个业务系统需要实现多活,则需要实现数据分区处理的改造,一般情况下可以为每个数据中心分配一个路由标,可以按地区或者按用户id分区处理。除此之外,仍然有部分业务难以进行分区处理改造,必须集中到某一个数据中心进行处理,因此普遍做法是在业务分区处理的基础上再指定一个业务单元进行中心化的业务处理。
2、问题
按照常用的异地多活方案,系统整体需要定义一个路由规则,将接收到的单元化业务请求按路由规则转发到相应的数据中心上进行处理。此外还要选择其中一个数据中心作为中心化业务单元,专门处理那些无法拆分的业务,这个中心化的业务单元必须非常可靠,因为它一旦崩溃,系统中没有其它可以承接它业务的数据中心了。除此之外,在很多时候,业务实体之间并不存在关联关系,例如产品和用户,它们之间的分区规则是不一样的,只有一个路由规则的情况下无法处理这种情况,这时只能选择其中一个业务进行单元化,而将另外一个业务集中化处理,牺牲其业务的扩展性。
3、方案
为了为中心单元赋予异地容灾能力,以及为不同业务意义的业务实体赋予横向扩展能力,本方案在常用异地多活系统方案的基础上加入了多路由规则的支持。基于该能力,使得中心化业务变成了一种特殊的单元化业务,一旦发生故障可以随时将流量切换至正常的数据中心,恢复业务。同时,对于无法兼容的多种业务实体,可以定义不同的路由规则,实现业务的去中心化处理,提高系统的可用性和扩展性。
1、定义单元为处理业务的独立分区,单元本身不具有业务特征例如中心单元属性。
2、所有业务数据库在数据中心之间进行双向或者多向同步,保证数据一致。
3、定义单元组为一组业务规则,注册到指定单元组的业务按照对应的规则分发请求到不同的单元。
4、单元组中支持中心化业务和单元化业务类型,对于中心化业务允许选择其中一个单元作为中心单元,对于单元化业务允许根据路由标范围划分不同的业务处理分区。
5、应用启动时指定所属单元组,其提供的服务的请求均按对应单元组进行分发。
6、一旦发生地域级别的故障,对于单元化业务,可以将故障单元的流量调整到其它正常的单元上,对于中心化业务,可以将中心单元调整到其它单元上,迅速恢复业务。