一、背景
中国大陆用户主要分布在南北,南北数据一般专线延迟是60~100ms,所以为了提高用户体验一般设置南北机房,整个架构为双A,两边均可写,可以极大的提升用户体验。
因此某服务主要分为南北机房,每个机房都拥有全量数据,用户在北方修改数据会同步到南方,南方修改数据会同步到北方。
数据主要分为缓存数据和DB数据,这个数据同步就成了问题,怎么保证最终一致性呢?强一致性就算了!(强一致性的保证成本过高,需要特殊场景特殊设计,我认为是很难归纳出通用方案的)
二、通常的架构
南北机房的缓存用mq同步,而DB用otter同步。
otter是阿里巴巴出的数据同步方案:https://github.com/alibaba/otter
三、会出现的问题
数据同步永远都躲不过的一致性问题。
跨机房的缓存之间不一致
1、mq同步缓存延迟在60~100ms,必定短暂不一致;
2、mq同步会出现失败,必定短暂不一致,但是缓存过期后会重新拿DB的数据,这时候就可以保证一致,就是所谓的最终一致性。
跨机房的DB之间不一致
1、otter同步一般在700~2000ms之间波动,因为数据库同步会受到抢锁,数据校验,磁盘IO的影响,那么就会出现短暂DB数据不一致;
2、极小几率出现otter数据同步失败,otter有对应机制降低这种错误几率。(如果真的不一致只能由业务做补偿操作)
同机房的缓存和DB短暂不一致
1、mq同步缓存的时间比otter同步速度快,短暂时间内不一致,数据到达后保证最终一致;
2、北方缓存同步到了南方,但是缓存过期了再次获取DB数据的时候,otter还没有同步数据过来,缓存就会还是拿到了旧数据,因此也有几率出现数据短暂不一致。(这时候很需要延迟mq,延迟同步南北缓存,宁愿数据跨机房不一致,也不要同机房不一致)
网友评论