后台开发的目标是要提供高可用的后台服务,其中很重要的一点是保证业务连续性(服务不中断,或中断时间在允许范围内)。
要保证业务连续性,系统需要具备容灾能力。
所谓容灾,就是对灾难(disater)的容忍能力,即在灾难袭来时,能够保证信息系统正常运行而采取的措施,以实现业务连续性为目标。
容灾的实现通常都涉及到冗余,比如做最简单的主备。、
根据冗余对象,容灾大致可以分为以下几种层级
一般系统设计
容灾系统有三个重要的评价指标
双活是指在两个生产中心部署相同的两个能力相同的业务系统。两个系统同时工作,地位对等、不分主从。具备在对方系统灾难发生时,接管对方业务的能力。
双活通常需要负载均能技术的支持。
多活与双活区别在生产中心的数量上。
双活有同城双活和异地双活, 主要是地理位置上的区别。
这里灾备是指具有主从之分的灾备系统。(双活是不分主从的灾备)。
通常是建立一个主业务系统和一个从属(备用)的业务系统(可能只有数据中心),正常情况下仅有主业务系统在工作。在主业务系统故障时,在启用备用系统。
灾备有热备、冷备等方式
热备和冷备的成本要考虑是仅做数据中心备份,还是有业务系统的备份。如果仅仅是数据的备份,那么其成本主要是存储设备的成本(硬盘);如果做了业务系统的备份,则成本与双活差不多,而且由于备用系统长期不工作,会造成资源浪费。
两地三中心是指在同城和异地同时建立灾备中心。
同城灾备中心通常采用热备的方式,并一般会提供业务服务。异步灾备中心知识做数据的备份,且数据的复制是异步的。异步灾备中心平时不提供业务服务。
容灾系统的设计不是一成不变的,不同的应用场景通常会有一些定制化的设计。因为容灾是经常是基于服务冗余实现的,大而全的容灾系统具有较大的成本。
但是容灾有一些比较通用的设计模型。
灾难检测可以在控制层或业务层。
本文所介绍的容灾主要是业务层以下的容灾
容灾的内部实现是多种多样的,不同的公司可能都有自己的实现技术。下面知识介绍一些案例、或常用的实现。主要是为了阐述可能的实现原理,不一定适用所遇场景。
容灾系统通常是一个集群,集群中有多个节点,通常是一个主节点(Master)和一个以上的从节点(Slave)。
灾难探测可以通过心跳包实现。
主节点和从节点分别向控制层上报心跳,如果控制层收不到某个节点的心跳,则认为其不可用,对主节点降级,并把流量切到从节点。
更为严谨的做法是,节点之间也互相上报心跳,这样可以做孤岛检测。
容灾切换主要是把流量从一个节点切到其他节点。可以通过负载均衡等系统实现。
数据一致性是要保证各个节点的数据一致,这样在主节点故障,切换到其他节点时才能保证业务不中断,不受影响。
在业务处理过程中,可能涉及到频繁的数据读写,有些业务请求需要等待写成功后才能返回给用户。要保证各个节点的数据在存储落地时一致,需要等到所有节点都写成功后在返回,这就涉及到**同步写**。
按上面的逻辑,为保证数据一致性,客户端、主节点和备用节点会发生以下交互。
由于Master和Slave在地理位置上可能相隔较远,因而这种同步写的方式有可能造成一定的延迟,影响系统性能,增加了请求的响应时间。
为了减少延迟(减少容灾对系统性能产生的影响)可以对数据一致性的实现做一些改进。
下面介绍两种改进方式。
数据分级的方式,主要是减少需要同步写的对象,对不重要的数据,允许在一定程度内丢失。
然而在很多场景下,数据分级的方式并不适用。
第二种方式是现在常用的保证数据一致性,又降低对系统性能影响的方式。在这种设计下,增加了一个组件(注册中心)用于登记写事件。
Master在存储数据时,先到注册中心登记下,然后再进行写动作,同时通知Slave需要复制数据。Master在写动作完成后即可返回给client,不需要等到Slave写动作完成。也就是Slave是以异步的方式从Master那里复制数据。
那么这种设计如何保证数据一致性呢?
时序图:
注册中心的登记同样是同步动作,为何能降低性能?
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。