异地、多活,多活就是指不同地理位置上的系统都能够提供业务服务,这里的“活”是活动、活跃的意思。
判断一个系统是否符合异地多活,需要满足两个标准:
(1)正常情况下,用户无论访问哪一个地点的业务系统,都能够得到正确的业务服务。
(2)某个地方业务异常的时候,用户访问其他地方正常的业务系统,能够得到正确的业务服务。
与“活”对应的是字是“备”,备是备份,正常情况下对外是不提供服务的,如果需要提供服务,则需要大量的人工干预和操作,花费大量的时间才能让“备”变成“活”。
保证在灾难的情况下业务都不受影响。代价很高,具体表现为:
系统复杂度会发生质的变化,需要设计复杂的异地多活架构。
成本会上升,一个或者多个机房搭建独立的一套业务系统。
新闻网站、企业内部的 IT 系统、游戏、博客站点等,如果无法承受异地多活带来的复杂度和成本,可以不做,只做异地备份即可。而共享单车、滴滴出行、支付宝、微信这类业务,就需要做异地多活了。
架构模式
异地多活架构可以分为同城异区、跨城异地、跨国异地。优缺点。
1. 同城异区
一个机房在海淀区,一个在通州区,然后将两个机房用专用的高速网络连接在一起。
同城的两个机房,距离上一般大约就是几十千米,通过搭建高速的网络,同城异区的两个机房能够实现和同一个机房内几乎一样的网络传输速度。这就意味着虽然是两个不同地理位置上的机房,但逻辑上我们可以将它们看作同一个机房,这样的设计大大降低了复杂度,减少了异地多活的设计和实现复杂度及成本。
其次,除了这类灾难,机房火灾、机房停电、机房空调故障这类问题发生的概率更高,而且破坏力一样很大。而这些故障场景,同城异区架构都可以很好地解决。因此,结合复杂度、成本、故障发生概率来综合考虑,同城异区是应对机房级别故障的最优架构。
2. 跨城异地
部署在北京和广州两个机房。
有效应对这类极端灾难事件。跨城异地的架构复杂度大大上升。距离增加带来的最主要问题是两个机房的网络传输速度会降低,这不是以人的意志为转移的,而是物理定律决定的,即光速真空传播大约是每秒 30 万千米,在光纤中传输的速度大约是每秒 20 万千米,再加上传输中的各种网络设备的处理,实际还远远达不到理论上的速度。
数据不一致业务肯定不会正常,但跨城异地肯定会导致数据不一致。如果是强一致性要求的数据,例如银行存款余额、支付宝余额等,这类数据实际上是无法做到跨城异地多活的。系统分别部署在广州和北京,那么如果挖掘机挖断光缆后,会出现如下场景:
用户 A 余额有 10000 元钱,北京和广州机房都是这个数据。
用户 A 向用户 B 转了 5000 元钱,这个操作是在广州机房完成的,完成后用户 A 在广州机房的余额是 5000 元。
由于广州和北京机房网络被挖掘机挖断,广州机房无法将余额变动通知北京机房,此时北京机房用户 A 的余额还是 10000 元。
用户 A 到北京机房又发起转账,此时他看到自己的余额还有 10000 元,于是向用户 C 转账 10000 元,转账完成后用户 A 的余额变为 0。
用户 A 到广州机房一看,余额怎么还有 5000 元?于是赶紧又发起转账,转账 5000 元给用户 D;此时广州机房用户 A 的余额也变为 0 了。
最终,本来余额 10000 元的用户 A,却转了 20000 元出去给其他用户。
金融只能采用同城异区这种架构。
用户登录(数据不一致时用户重新登录即可)、新闻类网站(一天内的新闻数据变化较少)、微博类网站(丢失用户发布的微博或者评论影响不大),能够很好地应对极端灾难的场景。
3. 跨国异地
跨国异地指的是业务部署在不同国家的多个机房。相比跨城异地,跨国异地的距离就更远了,因此数据同步的延时会更长,正常情况下可能就有几秒钟了。这种程度的延迟已经无法满足异地多活标准的第一条:“正常情况下,用户无论访问哪一个地点的业务系统,都能够得到正确的业务服务”。例如,假设有一个微博类网站,分别在中国的上海和美国的纽约都建了机房,用户 A 在上海机房发表了一篇微博,此时如果他的一个关注者 B 用户访问到美国的机房,很可能无法看到用户 A 刚刚发表的微博。虽然跨城异地也会有此类同步延时问题,但正常情况下几十毫秒的延时对用户来说基本无感知的;而延时达到几秒钟就感觉比较明显了。
因此,跨国异地的“多活”,和跨城异地的“多活”,实际的含义并不完全一致。跨国异地多活的主要应用场景一般有这几种情况:
为不同地区用户提供服务
例如,亚马逊中国是为中国用户服务的,而亚马逊美国是为美国用户服务的,亚马逊中国的用户如果访问美国亚马逊,是无法用亚马逊中国的账号登录美国亚马逊的。
只读类业务做多活
例如,谷歌的搜索业务,由于用户搜索资料时,这些资料都已经存在于谷歌的搜索引擎上面,无论是访问英国谷歌,还是访问美国谷歌,搜索结果基本相同,并且对用户来说,也不需要搜索到最新的实时资料,跨国异地的几秒钟网络延迟,对搜索结果是没有什么影响的。
小结
假设我们做了前面提到的高可用存储架构中的数据分区备份,又通过自动化运维能够保证 1 分钟就能将全部系统正常启动,那是否意味着没有必要做异地多活了?
评论
备份系统平常没有流量,如果直接上线可能触发平常测试不到的故障。
再实时的系统也会有数据延时,如果涉及到金融这种系统,仍然是不敢直接切换的。
系统运行过程中会有很多中间数据,缓存数据等。系统不经过预热直接把流量倒过来,大流量会直接把系统拖垮