当前位置: 首页 > 科技观察

无法单元化,远程双活也能玩的很流畅_1

时间:2023-03-16 11:52:17 科技观察

一、基本概念1、机房中心机房在单机房的情况下,除了双活业务,长尾业务和那些不做更多活动的业务都在机房。单位机房新建机房,即双活新增的机房,用于承担主链路双活容量的流量。2、路由sharding_id为route_code,HyperMetro会根据路由规则(四轮行为区)将其转换为route_code。每个route_code对应中心??机房或单位机房。gateway、soa、redis、db等都会根据route_code路由到正确的机房。二、多活的几种模式1、同城双活同城双活部署(两个IDC)。2、两城异地双活部署(一城一台IDC)。3、多个IDC部署在多个城市异地。4.优缺点3.单元化你可以考虑一个问题。一个公司或者某个业务,tps达到几十万、上百万的时候,在整个系统设计、架构甚至机房的瓶颈都会变得极其突出。但是放眼全国或者全球,总的tps都在百万或者千万级以上。归根结底是因为流量不同,一开始按照公司、业务、机房、地域路由到不同的机房。空间自然隔离,所以每个公司的每个业务只需要处理自己的部分tps。比如:淘宝的流量只会在阿里的应用和机房,滴滴的流量只会在滴滴的应用和机房。但是如果某公司的某个业务有1亿tps,如果不能实现无限横向扩展,那么肯定没有一家公司能够承受这么大的并发量,不仅是架构,连物理机房都不允许这样的大型集群(电力和空间将受到限制)。单元化在理论上提供了架构能力的无限水平扩展。单元化可以理解为异地居住的最终形式。单元化在流量入口将流量拆分到不同的IDC,每个IDC承担自己的流量,IDC之前的流量不会互相调用。单元化与区域无关。理论上,实现单元化后,新增流量可以通过增加IDC来解决,新增IDC不会受到地域限制,因为IDC之前没有流量互相呼叫。判断是否实现单元化,我理解只有一个标准,就是流能不能自闭环。比如你的A机房部署在上海,B机房远离海外任何地方,对业务没有影响(A机房和B机房地理距离很远,如果自己-无法实现闭环,相互调用的RT会变长,必然影响业务),那么单元化就可以算成功了。单元化流量如下:单元化双活只需要在底层数据层面进行同步。如下图所示:四、双活流量路由规则1、路由方式1)随机路由流量按比例随机路由到各个IDC,只需要按比例路由到各个IDC,没有任何规则。发生故障时,可以将故障机房的流量切换到另一个IDC。2)用户id路由根据用户id,流量按照一定比例路由到各自的IDC,每个用户的操作都会路由到指定的IDC。发生故障时,可根据用户需求,将故障机房内的流量切换到其他IDC。3)区域路由根据用户所在城市,将流量路由到各自的IDC,用户在各个地方的操作都会路由到指定的IDC。发生故障时,可以将故障机房的流量区域切换到另一个IDC。2、在四轮游的选择上经过多次讨论,你好四轮游最终选择了按地区走路线。主要原因如下:随机布线在各种多源设计中并不是很好的解决方案。主要原因是随机路由由于其不规则性而无法在多活动项目中进行单元化。选择区域路由而不是用户维度路由,主要是因为四轮业务和电商业务存在一些差异。电商业务中的基本操作都是基于C端用户,每个C端用户只操作自己的订单数据。所以订单数据自然是按照userid隔离的,单元化也比较好做,但是这种方案也牺牲了B端商户的体验。商户操作多用户订单数据,难免有跨机房的可能,从而影响商户的体验。对于四个轮子,买家和卖家分别是乘客和司机,这是一个天然的双订单模型(司机订单和乘客订单),所以如果使用用户id进行路由,司机订单和乘客的接口在同一时间(比如司机接单),必然会有大量的跨机房路由(司机和乘客由于用户ID不同,分配到不同的机房)。但如果按地区划分,由于差旅订单跨省市的概率极低,因此跨机房费率会大大降低,可以根据实际跨机房订单量比例。但是这个方案也有一定的不足,因为区域订单在不同的时间和场景下会有比较大的流量波动,比如:节假日、下雨天等,导致同城同省的流量波动较大,导致不一致机房压力大。五、双活解决方案1.中间件解决方案双活中间件提供的能力主要分为存储、消息、SOA、雪花算法四大类。2.存储存储提供的能力大部分是底层数据的双向同步。Redis的跨机房读写和跨机房加锁,是由于双阶模型不能单元化,提供双活能力。Redis双写是没有双向同步能力时的临时能力。dbcorrection是在db层面指定路由,也是为了底线。当soa路由异常时,最终的底线是在db层做的(跨机房数据可访问)。db禁止写保护是指业务开启禁止写保护后,非本地机房的订单不能对该订单进行操作,这也是底层的一种db保护。3、消息分为发送和消费。对于发送来说,单元到中心的拷贝和中心到单元的拷贝,都是将消息从一个机房拷贝到另一个机房,也是一种不能单元化的方案。当然,这个方案也兼容双活应用和非双活应用消费者发送消息的问题。消费本地机房:只能消费本地机房产生的消息,不能消费远程机房复制的消息。不消费:指本地机房和远端机房都不消费。本地机房和远程机房消费消息,是指消费本地机房和远程机房的消息(消费双重消息)。4、soasoa接口需要根据具体情况将rpc请求路由到正常机房。服务提供商路由是指路由规则由服务提供商指定。服务消费者路由是指路由规则由服务消费者指定。5.Snowflake算法双活由于zk集群有两个机房,所以需要在Snowflake算法上标注机房标识,保证全局唯一。6.业务转型大多数业务转型都是基于中间件解决方案的转型。有的解决方案是根据业务自身的需求,基于一些双活的转换点。1)单元化改造部分业务逻辑在之前单机房的情况下无法单元化,需要对一些可以单元化的业务进行改造。2)dbcache的一致性是基于订单可靠性的保证,通过订单数据的binlog消息来保证两个机房的数据一致性。3)机房过滤改造是根据机房的信息,处理非本地机房逻辑,或者过滤非本地机房逻辑(暂时无法单元化的方案)。4)订单号修改下发时,需要在订单号上打印路由规则,修改订单其他属性时按订单号进行路由(保证单元化)。