生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

用双十一的故事串起碎片的网络协议(上)

  • 2019-04-09
  • 本文字数:3207 字

    阅读完需:约 11 分钟

用双十一的故事串起碎片的网络协议(上)

文章选自《趣谈网络协议》


我是极客时间《趣谈网络协议》的作者刘超,今天通过“双十一”下单的过程给大家详细讲解其中用到的网络协议知识,内容共上、中、下三个部分,本篇文章讲解三个部分中的上,其他内容可点击这里查看


我把这个双十一下单的过程分为十个阶段,从云平台中搭建一个电商开始,到 BGP 路由广播,再到 DNS 域名解析,从客户看商品图片,到最终下单,每一步我都会详细讲解。这节我们先来看整个过程中的前三个阶段。

1.部署一个高可用高并发的电商平台

首先,咱们要有个电商平台。假设我们已经有了一个特别大的电商平台,这个平台应该部署在哪里呢?假设我们用公有云,一般公有云会有多个位置,比如在华东、华北、华南都有。毕竟咱们的电商是要服务全国的,当然到处都要部署了。我们把主站点放在华东。



为了每个点都能“雨露均沾”,也为了高可用性,往往需要有多个机房,形成多个可用区(Available Zone)。由于咱们的应用是分布在两个可用区的,所以假如任何一个可用区挂了,都不会受影响。


我们来回想数据中心那一节,每个可用区里有一片一片的机柜,每个机柜上有一排一排的服务器,每个机柜都有一个接入交换机,有一个汇聚交换机将多个机柜连在一起。


这些服务器里面部署的都是计算节点,每台上面都有 Open vSwitch 创建的虚拟交换机,将来在这台机器上创建的虚拟机,都会连到 Open vSwitch 上。



接下来,你在云计算的界面上创建一个 VPC(Virtual Private Cloud,虚拟私有网络),指定一个 IP 段,这样以后你部署的所有应用都会在这个虚拟网络里,使用你分配的这个 IP 段。为了不同的 VPC 相互隔离,每个 VPC 都会被分配一个 VXLAN 的 ID。尽管不同用户的虚拟机有可能在同一个物理机上,但是不同的 VPC 二层压根儿是不通的。


由于有两个可用区,在这个 VPC 里面,要为每一个可用区分配一个 Subnet,也就是在大的网段里分配两个小的网段。当两个可用区里面网段不同的时候,就可以配置路由策略,访问另外一个可用区,走某一条路由了。


接下来,应该创建数据库持久化层。大部分云平台都会提供 PaaS 服务,也就是说,不需要你自己搭建数据库,而是采用直接提供数据库的服务,并且单机房的主备切换都是默认做好的,数据库也是部署在虚拟机里面的,只不过从界面上,你看不到数据库所在的虚拟机而已。


云平台会给每个 Subnet 的数据库实例分配一个域名。创建数据库实例的时候,需要你指定可用区和 Subnet,这样创建出来的数据库实例可以通过这个 Subnet 的私网 IP 进行访问。


为了分库分表实现高并发的读写,在创建的多个数据库实例之上,会创建一个分布式数据库的实例,也需要指定可用区和 Subnet,还会为分布式数据库分配一个私网 IP 和域名。


对于数据库这种高可用性比较高的,需要进行跨机房高可用,因而两个可用区都要部署一套,但是只有一个是主,另外一个是备,云平台往往会提供数据库同步工具,将应用写入主的数据同步给备数据库集群。


接下来是创建缓存集群。云平台也会提供 PaaS 服务,也需要每个可用区和 Subnet 创建一套,缓存的数据在内存中,由于读写性能要求高,一般不要求跨可用区读写。


再往上层就是部署咱们自己写的程序了。基础服务层、组合服务层、Controller 层,以及 Nginx 层、API 网关等等,这些都是部署在虚拟机里面的。它们之间通过 RPC 相互调用,需要到注册中心进行注册。


它们之间的网络通信是虚拟机和虚拟机之间的。如果是同一台物理机,则那台物理机上的 OVS 就能转发过去;如果是不同的物理机,这台物理机的 OVS 和另一台物理机的 OVS 中间有一个 VXLAN 的隧道,将请求转发过去。


再往外就是负载均衡了,负载均衡也是云平台提供的 PaaS 服务,也是属于某个 VPC 的,部署在虚拟机里面的,但是负载均衡有个外网的 IP,这个外网的 IP 地址就是在网关节点的外网网口上的。在网关节点上,会有 NAT 规则,将外网 IP 地址转换为 VPC 里面的私网 IP 地址,通过这些私网 IP 地址访问到虚拟机上的负载均衡节点,然后通过负载均衡节点转发到 API 网关的节点。


网关节点的外网网口是带公网 IP 地址的,里面有一个虚拟网关转发模块,还会有一个 OVS,将私网 IP 地址放到 VXLAN 隧道里面,转发到虚拟机上,从而实现外网和虚拟机网络之间的互通。


不同的可用区之间,通过核心交换机连在一起,核心交换机之外是边界路由器。


在华北、华东、华南同样也部署了一整套,每个地区都创建了 VPC,这就需要有一种机制将 VPC 连接到一起。云平台一般会提供硬件的 VPC 互连的方式,当然也可以使用软件互连的方式,也就是使用 VPN 网关,通过 IPSec VPN 将不同地区的不同 VPC 通过 VPN 连接起来。


对于不同地区和不同运营商的用户,我们希望他能够就近访问到网站,而且当一个点出了故障之后,我们希望能够在不同的地区之间切换,这就需要有智能 DNS,这个也是云平台提供的。


对于一些静态资源,可以保持在对象存储里面,通过 CDN 下发到边缘节点,这样客户端就能尽快加载出来。

2.大声告诉全世界,可以到我这里买东西

当电商应用搭建完毕之后,接下来需要将如何访问到这个电商网站广播给全网。


刚才那张图画的是一个可用区的情况,对于多个可用区的情况,我们可以隐去计算节点的情况,将外网访问区域放大。



外网 IP 是放在虚拟网关的外网网口上的,这个 IP 如何让全世界知道呢?当然是通过 BGP 路由协议了。


每个可用区都有自己的汇聚交换机,如果机器数目比较多,可以直接用核心交换机,每个 Region 也有自己的核心交换区域。


在核心交换外面是安全设备,然后就是边界路由器。边界路由器会和多个运营商连接,从而每个运营商都能够访问到这个网站。边界路由器可以通过 BGP 协议,将自己数据中心里面的外网 IP 向外广播,也就是告诉全世界,如果要访问这些外网 IP,都来我这里。


每个运营商也有很多的路由器、很多的点,于是就可以将如何到达这些 IP 地址的路由信息,广播到全国乃至全世界。


戳我试读《趣谈网络协议》

3.打开手机来上网,域名解析得地址

这个时候,不但你的这个网站的 IP 地址全世界都知道了,你打的广告可能大家也都看到了,于是有客户下载 App 来买东西了。



客户的手机开机以后,在附近寻找基站 eNodeB,发送请求,申请上网。基站将请求发给 MME,MME 对手机进行认证和鉴权,还会请求 HSS 看有没有钱,看看是在哪里上网。


当 MME 通过了手机的认证之后,开始建立隧道,建设的数据通路分两段路,其实是两个隧道。一段是从 eNodeB 到 SGW,第二段是从 SGW 到 PGW,在 PGW 之外,就是互联网。


PGW 会为手机分配一个 IP 地址,手机上网都是带着这个 IP 地址的。


当在手机上面打开一个 App 的时候,首先要做的事情就是解析这个网站的域名。


在手机运营商所在的互联网区域里,有一个本地的 DNS,手机会向这个 DNS 请求解析 DNS。当这个 DNS 本地有缓存,则直接返回;如果没有缓存,本地 DNS 才需要递归地从根 DNS 服务器,查到.com 的顶级域名服务器,最终查到权威 DNS 服务器。


如果你使用云平台的时候,配置了智能 DNS 和全局负载均衡,在权威 DNS 服务中,一般是通过配置 CNAME 的方式,我们可以起一个别名,例如 vip.yourcomany.com ,然后告诉本地 DNS 服务器,让它请求 GSLB 解析这个域名,GSLB 就可以在解析这个域名的过程中,通过自己的策略实现负载均衡。


GSLB 通过查看请求它的本地 DNS 服务器所在的运营商和地址,就知道用户所在的运营商和地址,然后将距离用户位置比较近的 Region 里面,将三个负载均衡 SLB 的公网 IP 地址,返回给本地 DNS 服务器。本地 DNS 解析器将结果缓存后,返回给客户端。


对于手机 APP 来说,可以绕过刚才的传统 DNS 解析机制,直接只要 HTTPDNS 服务,通过直接调用 HTTPDNS 服务器,得到这三个 SLB 的公网 IP 地址。


看,经过了如此复杂的过程,咱们的万里长征还没迈出第一步,刚刚得到 IP 地址,包还没发呢?


话说手机 APP 拿到了公网 IP 地址,接下来的内容将在后面的文章中更新,欢迎你来订阅我的专栏。


戳我试读或订阅《趣谈网络协议》,欢迎你来给我留言和讨论。


2019-04-09 18:3011943
用户头像

发布了 23 篇内容, 共 37.9 次阅读, 收获喜欢 160 次。

关注

评论

发布
暂无评论
发现更多内容

队列高级应用之设计一个高性能线程池

架构师修行之路

分布式 线程池 架构设计 架构师

一口气搞懂「文件系统」,就靠这 20 张图了

小林coding

操作系统 计算机基础 文件管理 文件存储 文件系统

重点发布!河北行动计划发布!聚焦7大重点任务发展大数据产业

CECBC

区块链技术 落地应用 政策

HashMap、LinkedHashMap 学习笔记

陈俊

推荐一个替代印象笔记,onenote的神奇笔记!

申屠鹏会

笔记

面试官:说下对cookie,session,Token的理解

Java小咖秀

Java 面试

智“营”时代,众盟科技荣膺“2020毕马威中国领先消费科技TOP50企业榜单”

人称T客

简述Python中变量作用域的规则

王坤祥

Python python升级 Python基础

浅谈技术管理者的角色认知与自我管理

大黄蜂

团队管理 管理 自我管理 技术管理

简谈Python3中的闭包

王坤祥

Python Python基础

领域驱动设计(DDD)实践之路(二):事件驱动与CQRS

vivo互联网技术

DDD 架构设计 CQRS

Phalcon注解学习

半亩房顶

php phalcon

MySQL备份脚本,应该这么写

Simon

MySQL

简谈Python3关键字nonlocal使用场景

王坤祥

Python Python基础

IT人的身体健康

隆隆

IT人健康

架构师训练营 - 第 7 周学习总结

红了哟

敏捷软件工程实践书籍

Bob Jiang

敏捷 敏捷书籍 工程实践

年近而立,Java何去何从?

华为云开发者联盟

Java 开源 程序员 编程语言 Bugayenko Yegor

网站改版神秘公式,教你躲避改版陷阱

北柯

创业 网站 网站搭建 网站改版

如何做好技术选型

xcbeyond

Java 架构 最佳实践 技术选型

SpringBoot系列(四):SpringBoot特性_外部化配置(properties文件配置)

xcbeyond

Java 微服务 springboot

第10周总结+作业

林毋梦

图解JavaScript——代码实现(new、Object.create()、Object.assign()、flat()等十四种代码原理实现不香吗?)

执鸢者

Java 大前端 代码原理

二叉查找树-增删查和针对重复数据的 Java 实现

多选参数

数据结构 算法 二叉树 数据结构与算法

troubleshoot之:分析OutOfMemoryError异常

程序那些事

Java JVM 异常 JIT

MySQL explain 中的 rows 究竟是如何计算的?

架构精进之路

MySQL

AI能写浙江高考满分作文了!在线满分作文生成器,一键圆你满分梦

程序员生活志

AI

翻译: Effective Go (5)

申屠鹏会

翻译 Go 语言

Rust竟然没有异常处理?

袁承兴

rust 异常 java异常处理

一瓶可乐的自动售货机指令“旅程”

华为云开发者联盟

物联网 嵌入式 华为云 数据传输 无线通信

面试造火箭,看下这些大厂原题

前端有的玩

Java 面试 大前端

用双十一的故事串起碎片的网络协议(上)_架构_刘超_InfoQ精选文章