契机
对于单元化,我一直都是一知半解,今天被老板问到了一些关于单元化的问题,“XXX有没有单元化” “为什么不单元化” ,既然要回答老板的问题,那就顺便把单元化里面的一些逻辑理一理,学习一下。
所谓的单元化就是将所有的服务全部都部署在同一个机房里面作为一个单元,然后请求将按照UID进行路由到具体某个单元。单元化可以解决的问题:
1、通过异地多活的方案解决系统的稳定性;
2、服务都部署到同一个机房,可以降低RPC远程调用过程中的性能损耗;
如果将服务器都部署在同一个地区,从整体上可以看做是一个单元,那么其容灾能力、整体稳定性等就会受到影响,单元化正是为此而生。
实现了单元化的好处
1、每个单元都可以处理请求,分担流量,从这个角度来看,单元化就是在做横向扩展,并且我们所做的单元化不受地域影响,这就意味着横向扩展的能力会非常强;
2、每个单元内部都可以处理一个完整的业务流程,避免跨机房调用,降低RPC远程调用的性能损耗;
3、增强了系统的容灾能力,即使某一地的单元由于外部原因导致其全部崩溃,在进行切流后也能保证用户请求被正常处理;
1、请求路由
既然存在多个单元都在执行相同的业务功能的话,那么就需要对请求按照某种维度进行路由,并且可以保证同一类型的请求后续都会落到同一个单元中,否则的话,数据会存在不一致的问题。一般会按照买家的维度来拆分,买家及订单相关的数据都可以在本单元进行读写,实现单元内部的读写封闭,避免多个单元去更新某一共享数据。
但是也存在部分数据是所有买家都需要的,也就是商家与商品数据,所以,单元这个东西也被划分了类型,能够向其他单元同步数据的单元就是中心,而像商品或者卖家等需要被所有买家知晓的共享数据会在中心被处理,并且中心也会接收普通单元的买家数据,最终,连同自身的共享数据同步到每个单元,也就是说,每个单元最终都会获取到全部数据,但这只是保证数据的最终一致性。
2、切流方案
如果某个单元内出现了问题,需要切到其他单元,但是切流过程中也会存在问题,如果两个单元之间数据还没还有完全同步,用户切到新的单元之后可能就看不到之前的操作记录了,或者只能看到一部分,这时候如果用户继续操作,将会导致两个单元数据不一致。怎么办?
1) 禁写:为了保证数据一致性,会先对路由变更的用户禁写,为了让切流后新增数据不受影响,必须支持只禁止更新,但是可以新增,也就是说此时用户还可以继续下单,这一步的话是通过TDDL的SqlMonitor机制实现的;
2).切流:推送单元路由规则,应该是针对CDN的规则,会讲买家流量切换到新的单元中,不至于说让买家的页面就这样处于卡死崩溃的状态,影响用户体验;
3).同步:通过DRC来将故障发生到切流的这个时间段的数据同步到新的单元;
4).执行:等数据同步过来后,就可以正常用户对原数据的更新操作了;
原文:https://www.cnblogs.com/tingtwang/p/14823110.html