基本概念
应用(Application) / 系统(System)
为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比:为了完成一项任务,而搭建的由一个人或者一群相互配的人组成的团队。
模块(Module) / 组件(Component)
当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理解。生活例子类比:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通信小组等 。
分布式(Distributed)
系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与数据库分别工作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。生活例子类比:为了更好的满足现实需要,一个在同一个办公场地的工作小组被分散到多个城市的不同工作场地中进行远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成。
集群(Cluster)
被部署于多台服务器上的、为了实现特定目标的一个/组特定的组件,整个整体被称为集群。比如多个 MySQL 工作在不同服务器上,共同提供数据库服务目标,可以被称为一组数据库集群。生活例子类比:为了解决军队攻克防守坚固的大城市的作战目标,指挥部将大批炮兵部队集中起来形成一个炮兵打击集群。
分布式 vs 集群。通常不用太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即工作在不同服务器上并且通过网络通信配合完成任务;而集群更在意逻辑形态,即是否为了完成特定服务目标。
主(Master) / 从(Slave)
集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。比如 MySQL 集群中,只有其中一台服务器上数据库允许进行数据的写入(增/删/改),其他数据库的数据修改全部要从这台数据库同步而来,则把那台数据库称为主库,其他数据库称为从库。
中间件(Middleware)
一类提供不同应用程序用于相互通信的软件,即处于不同技术、工具和数据库之间的桥梁。生活例子类比:一家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变大,成立一个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁。
容器(Docker)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。可以理解为一个集装箱,集装箱里面是每个用户的货物,整体打包。
容器编排(K8S)
kubernetes,简称 K8s,是用 8 代替名字中间的 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用, Kubernetes 的目标是让部署容器化的应用简单并且高效。可以理解为一个货船,安装集装箱的大小,货物情况合理的来组织集装箱完成整体货物的搬运。
吞吐 VS 并发
吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同一时刻支持的请求最高量。例如一条 2 车道高速公路,一分钟可以通过 20 辆车,则并发是 20,一分钟的吞吐量是 20。实践中,并发量往往无法直接获取,很多时候都是用极短的时间段(比如 1 秒)的吞吐量做代替。我们平时用高并发(Hight Concurrnet)这个非量化目标简要表达系统的追求。
单机架构
出现原因
互联网早期,服务的访问量比较小,单机足以满足需求。系统架构简单,无需专业的运维团队。
简介
单机架构:应用服务和数据库服务共用一台服务器。
相关软件
- Web 服务器软件: Tomcat、 Netty、 Nginx、 Apache 等
- 数据库软件: MySQL、 Oracle、 PostgreSQL、 SQL Server 等
案例
用户在浏览器中输入 www.bit.com,首先经过 DNS 服务将域名解析成 IP 地址10.102.41.1,随后浏览器访问该 IP 对应的应用服务。
优缺点
优点:
- 部署简单,硬件成本低。
缺点:
- 存在严重的性能瓶颈。数据库和应用相互竞争。
应用数据分离架构
出现原因
访问量逐步上升,逐渐逼近了硬件资源的极限,同时团队也在此期间积累了对业务流程的一批经验。 单机服务存在严重的资源竞争,导致站点变慢。但由于预算仍然很紧张,我们选择了将应用和数据分离的做法,可以最小代价的提升系统的承载能力。
简介
应用数据分离架构:将数据库服务独立部署在同一个数据中心的其他服务器上,应用服务通过网络访问数据。
案例
优缺点
优点:
- 成本相对可控。性能相比单机有提升。
- 数据库单独隔离,不会因为应用把数据库搞坏,有一定的容灾能力。
缺点:
- 硬件成本变高,性能有瓶颈,无法应对海量并发。
应用服务集群架构
负载均衡
负载均衡:为了解决用户流量向哪台应用服务器分发的问题, 需要一个专门的系统组件做流量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。
流量调度算法:
- Round-Robin 轮询算法。即非常公平地将请求依次分给不同的应用服务器。
- Weight-Round-Robin 轮询算法。为不同的服务器(比如性能不同)赋予不同的权重(weight)。
- 一致哈希散列算法:通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。
出现原因
单个应用不足以支持海量的并发请求,高并发的时候站点响应变慢。
简介
应用服务集群架构:引入了负载均衡,应用以集群方式运作。
相关软件:
负载均衡软件: Nginx、 HAProxy、 LVS、 F5 等 。
案例
优缺点
优点:
- 应用服务高可用:应用满足高可用,不会一个服务出问题整个站点挂掉。
- 应用服务具备一定高性能:如果不访问数据库,应用相关处理通过扩展可以支持海量请求快速响应。
- 应用服务有一定扩展能力:支持横向扩展。
缺点:
- 数据库成为性能瓶颈,无法应对数据库的海量查询。
- 数据库是单点,没有高可用。
- 运维工作增多,扩展后部署运维工作增多,需要开发对应的工具应对快速部署。硬件成本高。
读写分离架构
出现原因
数据库成为瓶颈,而互联网应用一般读多写少,数据库承载压力大,主要是由这些读的请求造成的,可以把读操作和写操作分开。
简介
将数据库读写操作分散到不同的节点上,数据库服务器搭建主从集群,一主一从、一主多从都可以,数据库主机负责写操作,从机只负责读操作。
相关软件:
MyCat、 TDDL、 Amoeba、 Cobar 等类似数据库中间件等。
案例
优缺点
优点:
- 数据库的读取性能提升。
- 读取被其他服务器分担,写的性能间接提升。
- 数据库有从库,数据库的可用性提高了。
缺点:
- 热点数据的频繁读取导致数据库负载很高。
- 当同步挂掉,或者同步延迟比较大时,写库和读库的数据不一致。
- 服务成本提高。
冷热分离架构 --引入缓存
热数据和冷数据
**热点数据:**随着访问量继续增加,业务中一些数据的读取频率远大于其他数据的读取频率。
**冷点数据:**业务中一些数据的读取频率远小于其他数据的读取频率。
针对热数据,为了提升其读取的响应时间,可以增加本地缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用 memcached 作为本地缓存,使用Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。
简介
冷热分离架构:引入缓存,实行冷热分离,将热点数据放到缓存中快速响应。
相关软件:
Memcached、 Redis 等缓存软件 。
案例
优缺点
优点:
- 大幅降低对数据库的访问请求,性能提升非常明显。
缺点:
- 带来了缓存一致性,缓存击穿,缓存失效,缓存雪崩等问题。
- 服务器成本需要进一步增加。
- 业务体量支持变大后,数据不断增加,数据库单库太大,单个表体量也太大,数据查询会很慢,导致数据库再度成为系统瓶颈。
垂直分库架构
出现原因
随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。
比如针对评论数据,可按照商品 ID 进行 hash,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户 ID 或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提高性能。
这种做法显著的增加了数据库运维的难度,对 DBA 的要求较高。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的,如分库分表的管理和请求分发,由 Mycat 实现,SQL 的解析由单机的数据库实现,读写分离可能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是 MPP(大规模并行处理)架构的一类实现。
简介
垂直分库架构:数据库的数据被拆分,数据库数据分布式存储,分布式处理,分布式查询,也可以理解为分布式数据库架构。
垂直分库:
相关软件:
Greenplum、 TiDB、 Postgresql XC、 HAWQ 等,商用的如南大通用的 GBase、睿帆科技的雪球 DB、华为的 LibrA 等。
案例分析
优缺点
优点:
- 数据库吞吐量大幅提升,不再是瓶颈。
缺点:
- 跨库join、分布式事务等问题,这些需要对应的去进行解决,目前的mpp都有对应的解决方案。
- 数据库和缓存结合目前能够抗住海量的请求,但是应用的代码整体耦合在一起,修改一行代码需要整体重新发布。
微服务
出现原因
扩展性差:微服务架构前,应用程序无法轻松扩展,因为每次需要更新应用程序时,都必须重新构建整个系统。
持续开发困难:微服务架构前,一个很小的代码改动,也需要重新部署整个应用,无法频繁并轻松的发布版本。
不可靠:微服务架构前,即使系统的一个功能不起作用,可能导致整个系统无法工作。
不灵活:无法使用不同的技术构建单体应用程序。
代码维护难:微服务架构前,所有功能耦合在一起,新人不知道何从下手。
简介
微服务:微服务是一种架构风格,按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代
相关软件
Spring Cloud、 Dubbo、Grpc
案例
优缺点
优点:
- 灵活性高:服务独立测试、部署、升级、发布。
- 独立扩展:每个服务可以各自进行扩展。
- 提高容错性:一个服务问题并不会让整个系统瘫痪;
- 新技术的应用容易:支持多种编程语言。
缺点:
- 运维复杂度高:业务不断发展,应用和服务都会不断变多,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题,此外,对于如大促这类需要动态扩缩容的场景,需要水平扩展服务的性能,就需要在新增的服务上准备运行环境,部署服务等,运维将变得十分困难。
- 资源使用变多:所有这些独立运行的微服务都需要需要占用内存和 CPU 。
- 处理故障困难:一个请求跨多个服务调用,需要查看不同服务的日志完成问题定位。
容器编排
出现原因
随着业务增长,然后发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量变的非常大。容器化技术的出现给这些问题的解决带来了新的思路 。
目前最流行的容器化技术是 Docker,最流行的容器管理服务是 Kubernetes(K8S),应用/服务可以打包为 Docker 镜像,通过 K8S 来动态分发和部署镜像。 Docker 镜像可理解为一个能运行你的应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动 Docker 镜像就可以把服务起起来,使服务的部署和运维变得简单。
微服务缺点:
- 微服务拆分细,服务多部署工作量大,而且配置复杂,容易出错。
- 微服务数量多扩缩容麻烦,而且容易出错,每次缩容后再扩容又需要重新配置服务对应的环境参数信息。
- 微服务之间运行环境可能冲突,需要更多的资源来进行部署或者通过修改配置来解决冲突。
什么是容器
容器可以理解为一个一个集装箱,集装箱之间互不干扰:
简介
容器编排K8S:借助容器化技术(如docker)将应用/服务可以打包为镜像,通过容器编排工具(如k8s)来动态分发和部署镜像,服务以容器化方式运行。
案例
优缺点
优点:
- 部署、运维简单快速:一条命令就可以完成几百个服务的部署或者扩缩容。
- 隔离性好:容器与容器之间文件系统、网络等互相隔离,不会产生环境冲突。
- 轻松支持滚动更新:版本间切换都可以通过一个命令完成升级或者回滚。
缺点:
- 技术栈变多,对研发团队要求高。
- 机器还是需要公司自身来管理,在非大促的时候,还是需要闲置着大量的机器资源来应对大促,机器自身成本和运维成本都极高,资源利用率低,可以通过购买云厂商服务器解决。
实战架构
下图是一个互联网的电商架构: