跨城容灾与异地多活常见的架构设计

跨城容灾与异地多活常见的架构设计

  • 1. 同城IDC与跨城IDC
  • 2. 几种不同的部署方式
    • 1.1 无复制的异地部署(单地存储)
    • 1.2 无复制的异地部署(异地存储)
    • 1.3 两地三中心部署(同城同步复制,跨城异步复制)
    • 1.4 三地五中心部署(同城同步复制,跨城半同步复制)
    • 1.5 跨城异步复制
    • 1.6 跨城异步复制(记录日志)
  • 3. 几种不同的部署方式对比
  • 4. 参考文档

现如今,我们开发一个软件系统,对其要求越来越高,如果你了解一些「架构设计」的要求,就知道一个好的软件架构应该遵循以下 3 个原则:

  • 高性能
  • 高可用
  • 易扩展

其中,高性能意味着系统拥有更大流量的处理能力,更低的响应延迟。例如 1 秒可处理 10W 并发请求,接口响应时间 5 ms 等等。

易扩展表示系统在迭代新功能时,能以最小的代价去扩展,系统遇到流量压力时,可以在不改动代码的前提下,去扩容系统。

在此背景下,我调研并对比了几种不同的部署方案,看哪种方案在我们的业务场景下最能够满足异地多活以及跨城容灾的需求。同时,我也将我的思考记录于此,仅供大家在面对同样的问题时进行参考。

1. 同城IDC与跨城IDC

如果要讨论“跨城”以及“异地”,那就不可避免的要讨论下同城部署IDC以及跨城部署IDC的区别。

首先,我们要理解,目前服务器之间基本都是通过光纤进行通信的,虽说光纤的传输速度理论上是光速,也就是3乘以10的八次方米每秒,听起来好像无论两个服务器之间离的有多远,只要是用光纤进行通信,就可以将时延忽略不计。但实际上并非如此,我们用光纤进行通信时,还要考虑光纤并非直线铺设以及中间需要经过很多转换器等种种影响因素。

延迟 ( m s ) = 两地距离 ( k m ) ∗ 1000 / ( 3 ∗ 1 0 8 ) ∗ 1000 延迟(ms) = 两地距离(km) * 1000 / (3*10^8) * 1000 延迟(ms)=两地距离(km)1000/(3108)1000

一般来说,同城部署的IDC之间的时延为1-3ms。而跨城部署的IDC之间的时延约为30ms(以北京到深圳为例)。

因此,当我们考虑异地部署时,同城内的异地部署的时延是可以忽略不计的,而跨城异地部署的时延是我们需要重点考虑的。因为30ms的时延对于时延要求较高的系统可能已经是无法接受的了。比如我们系统对接的有些媒体要求时延为50ms以内,如果仅网络通信时延就占用了30ms,那留给我们推荐系统的计算时间仅有20ms。因此跨城区的网络延迟就变成不得不面对的问题。。

为了规避这个问题,尽可能的缓解跨城网络导致的网络延迟问题,对于延迟非常敏感的系统,通常在访问时采用就近原则,尽可能的将地域相近的区域相互访问,尽量避免跨区域访问,从而减少网络延迟造成的影响。

2. 几种不同的部署方式

1.1 无复制的异地部署(单地存储)

第一种方式是无复制的异地部署,并且真正的数据存储只在一个地方有,其他异地部署的地方没有存储,当然这里的存储指的是可修改的存储,而非Redis或本地缓存。

所谓无复制,指的是不同地方的存储数据没有被互相复制,互相同步。

如下图,表示的是无复制的异地部署(单地存储)方式。我们的MySQL存储仅在深圳有一个实例,这个MySQL存储可能被某个管理端来修改数据,而MySQL存储的数据会被随时或定时刷入到各个不同地方的Redis缓存中。不同地区的用户被依据IP属地分配就近访问不同地区部署好的服务系统。

这种部署方式的优点是可以减少多次部署存储的成本以及工作量,而且由于存储只有一份,在其他地区的IDC出现问题时,也可以依靠切换IDC来快速进行服务恢复,能够基本做到IDC的容灾。但这种部署方式的缺点也很多,比如放置存储的IDC不能够出问题,否则各个地方的系统都会出问题,而且这种部署方式仅能够支持只读操作,如果用户需要写入数据,那就需要跨城访问了,一般来说时延就很难接受了。

在这里插入图片描述

1.2 无复制的异地部署(异地存储)

第二种方式也是无复制的异地部署,但与第一种不同之处在于存储是分别放在不同地方的。换句话说,就是每个地方都是分别独立部署的,存储也是互不相通的。

如下图所示,深圳与北京分别部署了一套服务系统,并且独立部署了MySQL存储。各自不同地方的用户访问各自的服务,比如北方用户访问北京的系统,南方用户访问深圳的系统。由于存储都是在同城部署的,因此用户不仅可以读数据,也可以很方便的写入数据。

这种部署方式的优点是可以做到异地多活,让不同地方的用户访问不同地方的系统,减少了跨城的网络时延。但缺点也很明显,就是没有办法做到容灾。在某个地区的IDC出现问题时,不能靠切换到其他IDC来进行快速恢复服务,因为不同地区的存储内容是完全不同的。

在这里插入图片描述

1.3 两地三中心部署(同城同步复制,跨城异步复制)

该部署叫两地三中心部署,所谓两地,指的是两个不同的城市,所谓三中心,指的是三个不同的IDC。并且该部署方式是要在同城部署两个不同的IDC,且这两个IDC要能够做到同步复制。而跨城也要部署一个IDC,此IDC要做到异步复制。如下图所示。

这种部署方式的优点是,同城之间的IDC可以做到容灾备份,当其中一个IDC出现问题时,能够通过切换到另一个IDC来实现快速恢复。而且也能够基本做到跨城的容灾备份,比如当深圳的IDC都出现问题时,也能够通过切换到北京的IDC来使服务得到恢复。但这种部署方式也有缺点,首先,北京这个地区的IDC算是一个冷备份,如果用户对存储有写操作,那我们就只能让所有用户访问深圳的IDC,就算用户对服务只有只读操作,北京的数据也相对于深圳的数据稍有延迟。另外,依然是冷备份带来的问题,当我们需要将用户从深圳切换至北京进行访问时,由于他们之间是异步同步的,所以可能会出现丢失部分数据的问题。

在这里插入图片描述

1.4 三地五中心部署(同城同步复制,跨城半同步复制)

该部署方式是三地五中心的部署方式。三地指的是三个不同的城市,五中心指的是五个IDC集群。同城间的IDC采用的是同步复制的方式,而跨城间采用的是半同步复制的方式。所谓半同步复制,这里是指ACK=2,也就是说,当有两个IDC被成功同步复制了,那就算完成了。这样,用户每次请求,至少会有一个异地城市有了及时的数据备份。

如图所示,该部署方式优点是有了跨城容灾的能力,且数据不易丢失,因为当某个IDC出现问题时,我们总能切换到一个有着全量数据的IDC。缺点是它不能做到异地多活,而且跨城同步复制数据会导致用户的每次请求都会有很高的时延,因此它不适合对时延要求较高的服务。

在这里插入图片描述

1.5 跨城异步复制

一般来说,想要做到跨城同步复制一定是会牺牲掉部分性能的,因为跨城就意味着较高的网络时延。因此,我们可以思考下如何做到跨城异步复制的同时也做到容灾切换时尽量不丢或少丢数据。

下图展示了一个最简单的跨城异步复制方案。该方案的优点在于能够做到异地多活,并且当某个IDC出现故障时,能够做到及时切换。缺点是由于是跨城异步复制,可能会出现切换后部分数据丢失的问题,对一致性要求较高的系统来说肯定是不能接受的,如支付系统。

在这里插入图片描述

1.6 跨城异步复制(记录日志)

由此之故,我们可以对上述方案五进行优化,让两个IDC在异步复制给对方的同时将日志数据写入到一个第三方IDC,这个IDC用于记录日志数据以及不一致的操作ID。当深圳或北京的IDC发生故障时,查询下第三方IDC中存储的日志数据,看哪些操作ID还没有复制给对方,让这一部分的操作ID只能读不能写,虽然这部分操作ID读到的数据会有些延迟,但不会影响系统基本盘,等到故障IDC恢复后,再进行数据同步,然后清除日志,允许这一部分操作ID进行写操作即可。由于没来得及复制的一定是少部分数据,因此,该方案基本能够解决跨城异步复制所带来的数据不一致问题。见下图。

在这里插入图片描述

3. 几种不同的部署方式对比

以上简述了六种不同的部署方式,每种部署方式都有其优缺点,汇总列举如下:

在这里插入图片描述

可以根据实际情况进行选择合适的架构模式。

4. 参考文档

暂无

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/449228.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

几何变换 - 图像的缩放、翻转、仿射变换、透视等

1、前言 图像的几何变换是指改变图像的几何结构,大小、形状等等,让图像呈现出具备缩放、翻转、映射和透视的效果 图像的几何变换都比较复杂,计算也很复杂。 例如仿射变换,像素点的位置和灰度值都需要变换。 数字图像处理中利用后向传播的方法,将像素点变换后的位置通过…

安卓多个listView拖动数据交换位置和拖动

注意这里只是给出大概思路&#xff0c;具体可以参考修改自己想要的 public class MainActivity extends AppCompatActivity {private ListView listView1;private ListView listView2;private ArrayAdapter<String> adapter1;private ArrayAdapter<String> adapter…

智慧路灯杆AI监测应用,让高速出行更安全

高速公路是现代交通出行的重要组成&#xff0c;高速公路上的交通安全也一直是人们关注的焦点。针对更好监测和管理高速公路上的交通状况&#xff0c;可以基于智慧路灯杆打造AI交通监测应用&#xff0c;通过智能感知高速路段的路况、车况、环境状况&#xff0c;实现实时风险感知…

解决pandas使用sqlalchemy保存到Mysql数据库时,bool布尔类型数据转为tinyint数据的读取

pandas在使用to_sql()保存数据到数据表中&#xff0c;Mysql会将bool类型的数据转为tinyint类型&#xff0c;比如&#xff1a; 此时数据表字段的类型为&#xff1a; 读取的时候&#xff0c;如果直接使用read_sql会原封不动的读取成1或0的数据&#xff0c;因此我们存储的时候…

Ubuntu 14.04:安装PaddlePaddle(Conda安装)

目录 一、PaddlePaddle 概要 二、PaddlePaddle安装要求 三、PaddlePaddle安装 3.1 安装 Anaconda3 3.2 创建Anaconda虚拟环境&#xff08;python 3.8&#xff09; 3.3 进入Anaconda虚拟环境 3.4 检测 Anaconda 虚拟环境配置是否符合PaddlePaddle安装要求 3.4.1 确认 py…

6.S081的Lab学习——Lab1: Xv6 and Unix utilities

文章目录 前言一、启动xv6(难度&#xff1a;Easy)解析&#xff1a; 二、sleep(难度&#xff1a;Easy)解析&#xff1a; 三、pingpong&#xff08;难度&#xff1a;Easy&#xff09;解析&#xff1a; 四、Primes(素数&#xff0c;难度&#xff1a;Moderate/Hard)解析&#xff1a…

C++初阶:类与对象(尾篇)

目录 1. 构造函数与初始化列表1.1 对象的创建与构造函数的初始化1.2 初始化列表及构造函数存在的意义1.3 explicit关键字与构造函数的类型转换 2. static成员变量与static成员函数2.1 static成员变量2.2 static成员函数 3. 日期类流插入操作符的重载与友元3.1 友元3.2 友元函数…

Ubuntu20.04配置静态ip

文章目录 前言配置静态ip 前言 在 Linux 创建时默认是动态 ip&#xff0c;我们需要将这台 Linux 作为服务器&#xff0c;所以需要将动态分配的 ip 设置为静态的&#xff0c;防止 ip 变换。 可使用 ip addr 查看当前的 网卡 和 ip 信息&#xff1a; 从上图可看到动态分配的 i…

Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-1、线条平滑曲面且可通过面观察柱体变化(一)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fr…

HAProxy 简单介绍

一 HAProxy介绍 &#xff08;一&#xff09;发展历史 HAProxy是法国开发者威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件&#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换…

GPT与R 在生态环境领域数据统计分析

原文链接&#xff1a;GPT与R 在生态环境领域数据统计分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597092&idx2&sn0a7ac5cf03d37c7b4659f870a7b71a77&chksmfa823dc3cdf5b4d5ee96a928a1b854a44aff222c82b2b7ebb7ca44b27a621edc4c824115babe&…

软件杯 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

实战案例——Kafka集群部署

1. 规划节点 IP主机名节点192.168.100.10zookeeper1集群节点192.168.100.20zookeeper2集群节点192.168.100.30zookeeper集群节点 2. 基础准备 使用ZooKeeper集群搭建的3个节点来构建Kafka集群&#xff0c;因为Kafka服务依赖于ZooKeeper服务&#xff0c; 所以不再多创建云主机…

打卡--MySQL8.0 二 (用户权限管理)

一、mysql8修改了安全规则&#xff0c;不能像mysql5.7 一次性创建用户并授权&#xff0c;需要分批创建。 1、注意在MySQL8.0版本中创建用户一定要在配置文件中增加如下内容&#xff0c;来兼容旧的程序运行。 default_authentication_pluginmysql_native_password 2、创建用户…

LM2904DT运算放大器中文资料规格书PDF数据手册引脚图参数图片功能概述

产品概述&#xff1a; 该电路由两个独立的高增益运算放大器&#xff08;运算放大器&#xff09;组成&#xff0c;内部实现了频率补偿。它们专为汽车和工业控制系统而设计。该电路采用单电源供电&#xff0c;工作电压范围很广。低功耗与电源电压的大小无关。 应用领域包括传感…

【力扣 - 和为K的子数组】

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;num…

ElementUI两个小坑

1.form表单绑定的是一个对象&#xff0c;表单里的一个输入项是对象的一个属性之一&#xff0c;修改输入项&#xff0c;表单没刷新的问题&#xff0c; <el-form :model"formData" :rules"rules" ref"editForm" class"demo-ruleForm"…

【机器学习】机器学习创建算法第1篇:机器学习算法课程定位、目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法&#xff0c;1.1 K-近邻算法简介&#xff0c;1.2 k近邻算法api初步使用定位,目标,学习目标,1 什么是K-近邻算法,…

Java旋转矩阵

题目&#xff1a; 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵&…

山姆・阿尔特曼重返OpenAI董事会;Car-GPT:LLMs能否最终实现自动驾驶?

&#x1f989; AI新闻 &#x1f680; 山姆・阿尔特曼重返OpenAI董事会 摘要&#xff1a;经历长达数月的审查后&#xff0c;山姆・阿尔特曼已重返OpenAI董事会&#xff0c;并作为返回条件之一&#xff0c;OpenAI还新增了三名外部女性董事会成员。这标志着公司正努力摆脱去年11…
最新文章