作者:禅与计算机程序设计艺术
2020年是一个多变的年份,人们生活方式、商业模式发生了翻天覆地的变化。同时也催生了许多新的技术革命,如区块链技术的崛起、物联网、人工智能、机器学习等新兴技术的飞速发展。如何快速应对这些变化?——《当下的互联网架构》就是要通过网络架构,以一种系统性的方法,搭建起世界最具备容错能力、可扩展性、弹性、并发处理能力的分布式系统架构,从而顺应时代的发展潮流,构建出一个能够适应这个变化的、具有更高性能、更稳定性、更安全性的网络架构。
本书作者以一个技术领袖的视角,从计算机系统、通信网络、存储、计算、数据库、虚拟化、云计算等多个方面,全面剖析当下最热门的技术革命,阐述其演进规律、创新方向和关键技术,还原当下架构演进的历史脉络。每章节都重点突出前沿技术的最新研究成果,并结合实例和图表,详细分析其架构设计和实现方法,力求让读者“浅尝即止”,在不了解技术细节的情况下,理解其原理和应用场景。读者可以从中掌握到技术发展趋势、架构理论知识、技术实践经验,并能够运用所学,解决实际问题。本书既是一本系统的技术参考手册,也是互联网相关领域的一项经典著作。
本书面向技术领域的专业人员阅读,专业词汇少,适合作为学习笔记、开发工具或入门指南等非正式阅读材料使用。同时,本书亦适合作为对照材料,结合实际场景,理清技术发展的整体脉络、分类归纳各领域的技术创新,帮助读者拓宽技术视野,开拓创新思路,提升自己职业技能。如果您希望系统掌握当下最前沿的互联网架构技术,推荐阅读《当下的互联网架构》。
《当下的互联网架构》第一版由5个系列构成:
互联网(Internet)是指因特网上无线传输、计算机之间进行通信、利用万维网服务的网络。它使得不同大小和形状的网络设备相互连接,使得每个人都可以利用互联网获取信息,以及共享各种资源。在过去的几个世纪,由于数字技术的飞速发展,特别是计算机技术的普及,人类社会日益变得越来越依赖互联网。随着经济的发展,需求的不断增加,越来越多的人选择通过互联网购买商品、找工作、收藏美妆、购票、旅游、拍摄视频、听音乐、打游戏。2017年,中国有超过5.9亿人口使用互联网;2020年,全球70%的人口至少使用一次互联网,覆盖了全球95%的人口。世界卫生组织估计,2020年全球有4.7亿人患有网络诽谤。
互联网的创新也一直处于蓬勃发展阶段。传统的网络通信技术已经逐渐远离用户需求,随之而来的就是信息的碎片化、低效率的使用。因此,互联网运营商纷纷推出新一代的网络通信技术,如5G、人工智能、边缘计算等。人工智能、区块链、云计算、物联网等新兴技术正在改变着我们的工作方式,而这些技术的融合也带来了巨大的机遇。
但同时,新的技术也引发了新的问题。比如,随着超级计算机、集群运算、网络存储的发展,单个节点的性能得到极大的改善,但是这只是一小部分。同时,在单个节点内,服务器的数量与性能的增长呈线性关系,这势必会导致服务器成为性能瓶颈。随着多台服务器同时服务,硬件成本将会呈几何倍数上升。此外,由于网络传输协议的复杂性、QoS的要求,在保证性能的前提下,如何调度、负载均衡是一大难题。此外,物联网、人工智能等新兴技术也会引入新的安全隐患。
互联网架构的设计与部署对于互联网的发展与运行至关重要。随着互联网的发展,网络架构的复杂程度越来越高,如何高效的部署网络设备、优化网络环境,提升网络的可用性、延迟、吞吐量、安全性、可扩展性,是目前存在的最大难题。因此,网络架构的设计与部署将是至关重要的。
网络架构的设计应该遵循以下基本原则:
- 可靠性优先:网络架构设计应尽可能保证网络的可用性,特别是面对服务质量、突发事件等不可抗力造成的损失,同时应通过冗余机制、分担负荷,提高网络的可靠性。
- 弹性设计:应尽可能降低网络的可靠性损失,以便随着时间的推移,持续提供服务。网络中的各个节点、链路、控制器等都要能够自动识别并恢复自身的故障状态,确保网络始终保持健康、稳定、高效。
- 可扩展性:网络架构应该能够处理不同规模、不同业务的需求,并且能够根据需求做出调整和优化,从而达到更好的资源利用率。
- 安全性:网络架构应提供足够的安全保障,包括访问控制、身份认证、加密、访问日志、审计等功能。
- 并发处理能力:网络架构应能够支持多种并发请求,充分发挥服务器的并发处理能力。
数据中心(Data Center)是指由电力、房间、配套设施等设施组成的科技性的广域区域,通常被用来存储、处理、传输、分析海量数据的中心区域。其优势在于物理隔离、周密安排布局、环境干净、有利于地震等自然灾害的抗性。数据中心的主要功能有:存储、计算、网络、通信。
数据中心通常包含四个主要部分:区域边缘部分、核心部分、分布式计算部分和运维部分。区域边缘部分一般为配有专用的交换机、路由器、负载均衡器的两层交换机结构。核心部分通常由主机、SAN存储设备、光纤交换机、服务器等构成。分布式计算部分由基于高性能计算技术的超算中心、GPU集群、FPGA芯片等构成。运维部分主要为维护、管理、控制、监控、安全等部分,用于部署、升级、替换服务器、补修、维护网络等工作。
数据中心的特点有:高度集中、高容量、高性能、低成本、易扩缩、易受攻击、不安全。对于互联网架构来说,数据中心往往作为核心组件,承接着各种存储、计算、通信等功能,作用非常重要。
CDN(Content Delivery Network),即内容分发网络,是指依靠部署在不同地点的服务器所构成的网络,利用全局负载技术、流量控制及内容缓存等技术,使用户可就近取得所需的内容,提高网络响应速度、加强网络安全、节约成本。
CDN网络根据网络流量、用户位置、负载情况及内容类型等因素将用户的请求重新导向距离最近的服务节点上,提高用户访问网站的响应速度。通过部署缓存服务器,减少源站服务器的压力,提高响应速度。同时通过调度策略,智能地避开 overload 和 bottlenecks 瓶颈。CDN 提供的静态文件服务、图片音频等多种形式的服务是其他网络技术无法比拟的。
CDN 的部署优势在于:降低网络拥塞、提高用户访问响应速度、节省带宽成本、提升用户体验、降低运营成本、保护网站隐私。
NFV(Network Function Virtualization),即网络功能虚拟化,是一种分布式的、模块化的、动态的网络系统。NFV 技术允许不同的网络功能模块按照标准化的方式被组合在一起,组成统一的网络功能集合,被部署到网络的任意一段物理链路,从而提升网络的整体可靠性、可伸缩性、资源利用率、安全性和可管理性。
NFV 提供的网络服务有网络虚拟化、高速互联网、SDN、NFV 防火墙、NFV 网关、NFV 操作系统等。NFV 是一种模块化的、动态的网络系统,它能够有效的满足网络发展的需要。
NFV 的核心技术有网络虚拟化、虚拟网络切割、分布式云计算、网络功能的自动化配置等。
NFV 的应用案例有车联网、电信运营商网络、智能城市、5G 网络、虚拟现实、物联网等。
RESTful API (Representational State Transfer),即表示状态转移的RESTful接口,是一种基于HTTP协议的API规范,旨在简化Web应用程序的设计和开发。
RESTful API 可以认为是一种接口风格,而不是具体的某个API,更类似于Web开发的模型,主要包含URI、HTTP动词、Header、Body三部分,它的主要特征是客户端-服务器的交互模型。
RESTful API 遵循以下原则:
- 每个URL代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 对资源的具体操作由HTTP的四个动词来定义,它们分别是GET、POST、PUT、DELETE。
- 过滤信息在查询字符串中实现,格式为key=value;
- 返回结果使用JSON格式,并遵循统一的错误码。
RESTful API 使用简单,有利于提升开发效率,降低开发难度,更容易被第三方应用调用。
Service Mesh(服务网格),是微服务架构下用来控制服务间通信的基础设施层。
在微服务架构下,服务与服务间的通信采用轻量级的 RPC/消息机制,当服务数量和通信量增长时,这些机制会产生性能问题和扩展性问题。
为了解决这个问题,Istio 提出了服务网格架构,将复杂的服务间调用关系通过控制面的形式抽象出来,屏蔽掉底层的网络细节,对上层的服务间调用提供有效的保障。
服务网格的作用包括服务发现、负载均衡、熔断、限流、请求跟踪等。Istio 通过配置网格规则来努力实现各功能,但也存在局限性。
Istio 提出的服务网格理念,能有效解决微服务架构下服务间通讯的问题。但是,服务网格又不是银弹。当服务网格出现问题时,它可能会对应用产生较大影响。因此,除了 Istio 以外,还有其它微服务框架也在尝试探索 Service Mesh 的另一种架构。
从宏观上看,负载均衡算法可以分为两种,第一种是服务器端负载均衡算法,第二种是客户端负载均衡算法。
服务器端负载均衡算法是指将任务直接分配给服务所在的服务器,它基于网络的流量,动态地将访问请求通过某种策略转发到服务端。常见的服务器端负载均衡算法有如下几种:
客户端负载均衡算法指的是通过客户端(浏览器或者其他客户端)来实现负载均衡。常见的客户端负载均衡算法有如下几种:
负载均衡算法,简单地说就是将负载分摊到多个服务器上,以提高服务器的处理能力和利用率。客户端负载均衡算法将客户端请求随机分配到服务端,服务器端负载均衡算法将请求根据负载的不同,以不同的方式分配到服务器。下面是服务器端负载均衡的一些常见算法和操作步骤,具体说明一下。
轮询(Round Robin)法
轮询法,又称为取号法,它是一种简单的负载均衡算法,把请求顺序分配到服务器上。假设有n台服务器,那么客户端第i次请求会被分派到第i mod n(0 ≤ i < rq)(mod表示取余)号服务器上。
最少连接数(Least Connections)法
最少连接数法,是根据当前的链接情况,为每台服务器评分,选择负载最小的那台服务器。它的目的是让每台服务器处理的请求数量平均,因此负载较轻的服务器不会因为负载过重而拒绝服务。评分机制不能反映真实的负载,有可能会造成某些服务器过载而没有相应的请求处理。
加权轮训(Weighted Round Robin)
加权轮训法,是为了解决上面说的轮询法的负载均衡不平衡问题,它给每台服务器分配了一个权值,然后按公式:weight / (weight + last_weight),将请求顺序分配给每台服务器。权重越大,分配到的请求数量越多。权重默认设置为1。
IP哈希(IP Hashing)
IP哈希法,它根据访问请求的源IP地址,哈希算法将相同IP地址的访问请求映射到同一台服务器上。当服务器重启或负载增加时,它可以分派新的访问请求。IP哈希法可以实现最优的负载均衡,因为它可以将相同IP地址的请求分派到同一台服务器,从而避免了负载不平衡。
响应速度(Response Time)法
该算法选择响应时间最快的服务器作为目标服务器。
URL Hashing法
将访问请求的URL哈希到固定的服务器上。URL Hashing算法根据请求的URL决定目标服务器,目的是避免长尾问题,即某些请求处理比较慢,而占据大部分处理时间。
总结
服务端负载均衡算法,简单且有效,但它只能在有服务器负载均衡设备的条件下才能工作。当应用系统中无服务器负载均衡设备时,可以通过客户端负载均衡实现负载均衡。客户端负载均衡算法需要安装相应的插件或应用程序,配置复杂,但可以根据应用系统的复杂度来选择。两种负载均衡算法都可以有效地将负载分摊到多个服务器上,以提高服务器的处理能力和利用率。
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://localhost:8080;
}
}
upstream webservers {
ip_hash; # distribute incoming requests by hashing based on the client's IP address
server localhost:8080 weight=5; # server with a weight of 5, 1/5th of the total traffic
server 10.0.0.1:8080 max_fails=3 fail_timeout=10s; # backup server with higher priority and increased failure timeouts
}
keepalive_timeout 10; # timeout for idle connections
daemon off; # don't run in background
include /etc/nginx/conf.d/*.conf; # include additional config files
error_log /var/log/nginx/error.log warn; # log errors to file
access_log /var/log/nginx/access.log main; # log access to file
# start nginx after configuring it through this script
nginx -c /etc/nginx/nginx.conf
# run keepalived as a separate process on port 2222
exec keepalived -D -p /run/keepalived.pid --vrrp -f /etc/keepalived/keepalived.conf
以上是一个示例配置文件,它使用了Nginx+Keepalived实现WEB服务器的高可用。
配置文件中,upstream块指定了负载均衡的服务器列表。ip_hash参数表示使用IP哈希算法,即相同IP地址的请求被分派到同一台服务器上。server块指定了两个服务器,分别设置权重为5和1。权重越大,分配到的请求数量越多。max_fails参数表示失败次数,fail_timeout参数表示服务器恢复正常时的超时时间。
keepalive_timeout参数表示空闲连接的超时时间。daemon off表示关闭守护进程。include指令引用了其他配置文件,例如/etc/nginx/conf.d/*.conf,这些配置文件可以用于定义网站,反向代理,日志记录等。
执行启动脚本nginx -c /etc/nginx/nginx.conf
,它将配置启动Nginx服务器。执行exec keepalived -D -p /run/keepalived.pid --vrrp -f /etc/keepalived/keepalived.conf
,它将配置启动Keepalived服务器。执行systemctl enable nginx.service && systemctl restart nginx.service
,它将nginx服务添加到系统启动项并重启服务。执行systemctl enable keepalived.service && systemctl restart keepalived.service
,它将keepalived服务添加到系统启动项并重启服务。
注意:安装好Nginx和Keepalived后,还需要配置服务器的防火墙规则,否则外部无法访问服务器。另外,如果你想实现HTTPS加密访问,还需要安装SSL证书并配置Nginx的https模块。
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: hello-world
labels:
app: hello-world
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- image: helloworld:latest
name: hello-container
ports:
- containerPort: 80
protocol: TCP
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: message-configmap
key: message
---
apiVersion: v1
kind: ConfigMap
metadata:
name: message-configmap
data:
message: "Hello World!"
上面是一个示例配置文件,它使用了Kubernetes和Docker实现容器集群的管理。
配置文件中,Deployment定义了hello-world的Pod的副本数量为3,selector标签匹配app=hello-world的标签,template块定义了hello-world Pod的具体配置。spec.containers数组中,第一个容器定义了镜像名称和端口号,第二个容器使用ConfigMap引用名为message-configmap的配置。
执行命令kubectl apply -f filename.yaml,它将配置文件创建为资源提交到Kubernetes集群中。执行命令kubectl get pods,查看资源是否创建成功。
如果想要修改副本数量,可以更新配置文件中的replicas字段,并执行命令kubectl apply -f filename.yaml。