网站建设分类,网站建设优化服务特色,新手小白如何做电商,广告网络联盟目录#xff1a;
常见概念评价指标单机架构应用数据分离架构应用服务集群架构读写分离 / 主从分离架构引入缓存 —— 冷热分离架构垂直分库业务拆分 —— 微服务容器化引入——容器编排架构总结
1.常见概念#xff1a;
应用#xff08;Application#xff09; / 系统
常见概念评价指标单机架构应用数据分离架构应用服务集群架构读写分离 / 主从分离架构引入缓存 —— 冷热分离架构垂直分库业务拆分 —— 微服务容器化引入——容器编排架构总结
1.常见概念
应用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 的目标是让部署容器化的应用简单并且高效。可以理解为一个货船安装集装箱的大小货物情况合理的来组织集装箱完成整体货物的搬运。
2.评价指标
可用性Availability:考察单位时间段内系统可以正常提供服务的概率/期望。例如 年化系统可用性 系统正常提供服务时长 / 一年总时长。这里暗含着一个指标即如何评价系统提供无 法是否正常我们就不深入了。平时我们常说的 4 个 9 即系统可以提供 99.99% 的可用性 5 个 9 是 99.999% 的可用性 以此类推。我们平时只是用高可用HighAvailability HA这个非量化目标简要表达我们系统的追求。
响应时长Response Time RT:指用户完成输入到系统给出用户反应的时长。例如点外卖业务的响应时长 拿到外卖的时刻 - 完成点单的时刻。通常我们需要衡量的是最长响应时长、平均响应时长和中位数响应时长。这个指标原则上是越小越好但很多情况下由于实现的限制需要根据实际情况具体判断
吞吐Throughput vs 并发Concurrent:吞吐考察单位时间段内系统可以成功处理的请求的数量。并发指系统同一时刻支持的请求最高量。例如一条 2 车道高速公路一分钟可以通过 20 辆车则并发是 2一分钟的吞吐量是 20。实践中并发量往往无法直接获取很多时候都是用极短的时间段比如 1 秒的吞吐量做代替。我们平时用高并发Hight Concurrnet这个非量化目标简要表达系统的追求。3.单机架构
初期我们需要利用我们精干的技术团队快速将业务系统投入市场进行检验并且可以迅速响应变化要求。但好在前期用户访问量很少没有对我们的性能、安全等提出很高的要求而且系统架构简单无需专业的运维团队所以选择单机架构是合适的。
相关软件
Web 服务器软件 Tomcat、 Netty、 Nginx、 Apache 等数据库软件 MySQL、 Oracle、 PostgreSQL、 SQL Server 等
优点
简单性单机架构是最简单的应用程序架构因为它不涉及任何网络通信和分布式问题。可靠性单机架构应用程序在出现故障时只会影响一个独立的实例不会影响其他实例。可扩展性单机架构应用程序通常具有很好的可扩展性因为只需要增加更多的硬件资源就可以提高性能和容量。安全性单机架构应用程序通常比分布式架构更安全因为它们不会出现分布式拒绝服务DDoS攻击的问题。
缺点
灵活性单机架构应用程序通常比分布式架构更难以扩展和修改因为它们需要修改代码并在所有实例上更新。负载均衡单机架构应用程序通常难以实现负载均衡因为它们没有分布式架构中的分布式负载均衡机制。故障恢复单机架构应用程序在出现故障时只会影响一个实例但是它们无法实现分布式架构中的容错和故障恢复。性能单机架构应用程序的性能通常受到硬件资源的限制因为它们只能利用一个服务器或计算机的资源。
4.应用数据分离架构
随着系统的上线我们不出意外地获得了成功。市场上出现了一批忠实于我们的用户使得系统的访问量逐步上升逐渐逼近了硬件资源的极限同时团队也在此期间积累了对业务流程的一批经验。面对当前的性能压力我们需要未雨绸缪去进行系统重构、架构挑战以提升系统的承载能力。但由于预算仍然很紧张我们选择了将应用和数据分离的做法可以最小代价的提升系统的承载能力。 \
和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上应用服务通过网络访问数据。
优点
灵活性应用数据分离架构可以轻松地扩展应用程序和数据存储的容量和性能提高系统的可用性。可靠性应用数据分离架构可以通过负载均衡和容错机制来保证系统的可靠性。可扩展性应用数据分离架构可以通过增加服务器节点来提高系统的处理能力和存储容量提高系统的可扩展性。安全性应用数据分离架构可以提供更好的安全性因为应用程序和数据存储是分开部署的减少了数据泄露的风险。
缺点
复杂性应用数据分离架构引入了更多的组件和网络拓扑结构增加了系统的复杂性需要更多的管理和维护工作。成本应用数据分离架构需要更多的硬件资源包括服务器、存储设备、网络设备等增加了系统的成本。同步问题应用数据分离架构需要考虑数据同步的问题以保证数据的一致性和完整性。架构选择应用数据分离架构需要根据具体的应用场景和需求进行选择需要考虑应用程序和数据存储之间的依赖关系和交互方式。
5.应用服务集群架构
我们的系统受到了用户的欢迎并且出现了爆款单台应用服务器已经无法满足需求了。我们的单机应用服务器首先遇到了瓶颈摆在我们技术团队面前的有两种方案大家针对方案的优劣展示了热烈的讨论 • 垂直扩展 / 纵向扩展 Scale Up。通过购买性能更优、价格更高的应用服务器来应对更多的流量。这种方案的优势在于完全不需要对系统软件做任何的调整但劣势也很明显硬件性能和价格的增长关系是非线性的意味着选择性能 2 倍的硬件可能需要花费超过 4 倍的价格其次硬件性能提升是有明显上限的。 • 水平扩展 / 横向扩展 Scale Out。通过调整软件架构增加应用层硬件将用户流量分担到不同的应用层服务器上来提升系统的承载能力。这种方案的优势在于成本相对较低并且提升的上限空间也很大。但劣势是带给系统更多的复杂性需要技术团队有更丰富的经验。经过团队的学习、调研和讨论最终选择了水平扩展的方案来解决该问题但这需要引入一个新的组件 —— 负载均衡为了解决用户流量向哪台应用服务器分发的问题需要一个专门的系统组件做流量分发。实际中负载均衡不仅仅指的是工作在应用层的甚至可能是其他的网络层之中。同时流量调度算法也有很多种这里简单介绍几种较为常见的 • Round-Robin 轮询算法。即非常公平地将请求依次分给不同的应用服务器。 • Weight-Round-Robin 轮询算法。为不同的服务器比如性能不同赋予不同的权重weight能者多劳。 • 一致哈希散列算法。通过计算用户的特征值比如 IP 地址得到哈希值根据哈希结果做分发优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务。 相关软件
负载均衡软件 Nginx、 HAProxy、 LVS、 F5 等
优点
高可用性应用服务集群可以确保在某个应用服务器出现故障时其他服务器可以自动接替其工作保证系统的持续可用性。负载均衡应用服务集群可以通过负载均衡器将请求分配到多个应用服务器上以平衡负载并提高系统的处理能力。容错能力应用服务集群可以检测到故障的应用服务器并自动将其从集群中剔除以保证系统的可靠性和稳定性。性能应用服务集群可以利用多台服务器的计算和存储资源以提供更高的处理能力和更大的处理容量。
缺点
初期投资成本高应用服务集群架构需要投资购买更多的服务器和设备相对于单台服务器而言初始投资成本较高。管理和维护成本高应用服务集群需要更多的管理和维护工作包括配置、调试和监控等相对于单台服务器而言管理和维护成本较高。故障排除难度大应用服务集群中的故障可能会导致整个系统的瘫痪因此故障排除难度较大需要更多的技术支持和故障排除工作。管理和维护难度大应用服务集群需要更多的技术和经验支持管理和维护难度较大需要专业的技术人员进行操作和管理。 6.读写分离 / 主从分离架构
应用服务集群架构提到我们把用户的请求通过负载均衡分发到不同的应用服务器之后可以并行处理了并且可以随着业务的增长可以动态扩张服务器的数量来缓解压力。但是现在的架构里无论扩展多少台服务器这些请求最终都会从数据库读写数据到一定程度之后数据的压力称为系统承载能力的瓶颈点。我们可以像扩展应用服务器一样扩展数据库服务器么答案是否定的因为数据库服务有其特殊性如果将数据分散到各台服务器之后数据的一致性将无法得到保障。所谓数据的一致性此处是指针对同一个系统无论何时何地我们都应该看到一个始终维持统一的数据。想象一下银行管理的账户金额如果收到一笔转账之后一份数据库的数据修改了 但另外的数据库没有修改则用户得到的存款金额将是错误的。我们采用的解决办法是这样的保留一个主要的数据库作为写入数据库其他的数据库作为从属数据库。从库的所有数据全部来自主库的数据经过同步后从库可以维护着与主库一致的数据。然后为了分担数据库的压力我们可以将写数据请求全部交给主库处理但读请求分散到各个从库中。由于大部分的系统中读写请求都是不成比例的例如 100 次读 1 次写所以只要将读请求由各个从库分担之后数据库的压力就没有那么大了。当然这个过程不是无代价的主库到从库的数据同步其实是有时间成本的但这个问题我们暂时不做进一步探讨。
优点
负载均衡读写分离/主从分离架构可以通过负载均衡器将读请求和写请求分别分配到不同的服务器上以平衡负载和提高系统的处理能力。读操作性能读写分离/主从分离架构可以将读操作分配给专门的读服务器以提高读操作的性能和吞吐量。写操作性能读写分离/主从分离架构可以将写操作分配给专门的主从服务器以保证写操作的性能和一致性。可扩展性读写分离/主从分离架构可以通过增加服务器节点来提高系统的处理能力和存储容量提高系统的可扩展性。
缺点
故障恢复读写分离/主从分离架构中的读服务器和写主从服务器之间存在数据同步延迟可能会导致故障恢复问题。数据一致性读写分离/主从分离架构中的主从服务器之间存在数据差异可能会导致数据不一致的问题。维护成本读写分离/主从分离架构需要更多的服务器和设备相对于单台服务器而言初始投资成本较高。管理和维护难度大读写分离/主从分离架构需要更多的技术和经验支持管理和维护难度较大需要专业的技术人员进行操作和管理。
7.引入缓存 —— 冷热分离架构
随着访问量继续增加发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数据称为热点数据与之相对应的是冷数据。针对热数据为了提升其读取的响应时间可以增加本地缓存并在外部增加分布式缓存缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉大大降低数据库压力。其中涉及的技术包括使用 memcached 作为本地缓存使用Redis 作为分布式缓存还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。
优点
读写分离通过将热点数据存储在缓存中可以实现读操作的高效处理减轻数据库的负载提高系统的并发处理能力。热数据缓存将热点数据存储在缓存中可以减少对数据库的访问提高系统的响应速度提升用户体验。冷数据存储将冷数据存储在磁盘上可以节约内存资源降低系统的负载提高系统的稳定性。成本降低通过使用缓存可以降低硬件成本因为可以减少对高性能硬件的需求降低系统的总体拥有成本。
缺点
数据一致性由于缓存和磁盘上的数据不是实时同步的因此需要考虑数据一致性的问题以保证数据的一致性和完整性。缓存穿透当热点数据没有命中缓存时需要到磁盘上查询这会导致缓存的浪费和系统的性能下降。缓存雪崩当缓存中的热点数据较多时可能会造成缓存的雪崩效应降低系统的并发处理能力。失效更新当热点数据更新时需要更新缓存中的数据这可能会导致缓存的失效需要重新加载数据。
相关软件
Memcached、 Redis 等缓存软件
8.垂直分库
随着业务的数据量增大大量的数据存储在同一个库中已经显得有些力不从心了所以可以按照业务将数据分别存储。比如针对评论数据可按照商品 ID 进行 hash路由到对应的表中存储针对支付记录可按照小时创建表每个小时表继续拆分为小表使用用户 ID 或记录编号来路由数据。只要实时操作的表数据量足够小请求能够足够均匀的分发到多台服务器上的小表那数据库就能通过水平扩展的方式来提高性能。其中前面提到的 Mycat 也支持在大表拆分为小表情况下的访问控制。这种做法显著的增加了数据库运维的难度对 DBA 的要求较高。数据库设计到这种结构时已经可以称为分布式数据库但是这只是一个逻辑的数据库整体数据库里不同的组成 部分是由不同的组件单独来实现的如分库分表的管理和请求分发由 Mycat 实现SQL 的解析由单机的数据库实现读写分离可能由网关和消息队列来实现查询结果的汇总可能由数据库接口层来实现等等这种架构其实是 MPP大规模并行处理架构的一类实现。 优点
提升性能垂直分库可以将热点数据和普通数据分离将热点数据存储在内存中大幅提升系统的处理能力和吞吐量。提升可扩展性垂直分库可以通过增加服务器节点来提高系统的处理能力和存储容量提高系统的可扩展性。提升可维护性垂直分库可以将不同的业务数据分开存储便于分别进行维护和管理提高系统的可维护性。
缺点
数据一致性垂直分库会将不同业务的数据分别存储在不同的数据库中可能会导致数据不一致的问题。写入性能垂直分库会将写入操作写入到相应的数据库中可能会导致写入性能的问题。安全性垂直分库会将敏感数据存储在不同的数据库中可能会导致安全问题。管理和维护难度大垂直分库需要分别管理不同的数据库管理和维护难度较大需要专业的技术人员进行操作和管理。
相关软件
Greenplum、 TiDB、 Postgresql XC、 HAWQ 等商用的如南大通用的 GBase、睿帆科技的雪球 DB、华为的 LibrA 等
9.业务拆分 —— 微服务
随着人员增加业务发展我们将业务分给不同的开发团队去维护每个团队独立实现自己的微服务然后互相之间对数据的直接访问进行隔离可以利用 Gateway、消息总线等技术实现相互之间的调用关联。甚至可以把一些类似用户管理等业务提成公共服务。 相关软件
Spring Cloud、 Dubbo
优点
垂直分离将不同的业务模块或服务独立部署可以提高系统的可维护性和可扩展性。快速迭代通过将业务拆分为微服务可以实现快速迭代和敏捷开发提高开发效率。独立部署微服务架构允许不同的业务模块或服务独立部署提高系统的可用性和容错性。独立升级微服务架构允许不同的业务模块或服务独立升级无需中断其他服务的正常运行。
缺点
数据一致性不同服务之间可能存在数据依赖关系需要保证数据的一致性。数据库同步不同服务之间可能存在数据同步的需求这可能会导致性能瓶颈和一致性问题。分布式事务在分布式环境下处理事务可能会变得更加复杂需要引入分布式事务解决方案如补偿机制或二段事务协议。安全问题在分布式环境下需要考虑安全问题如防止SQL注入、防止恶意请求等。技术挑战在实现微服务架构时需要具备一定的技术能力如分布式系统设计、微服务框架选型等。
10.容器化引入——容器编排架构
随着业务增长然后发现系统的资源利用率不高很多资源用来应对短时高并发平 时又闲置需要动态扩缩容还没有办法直接下线服务器而且开发、测试、生产每 套环境都要隔离的环境运维的工作量变的非常大。容器化技术的出现给这些问题的 解决带来了新的思路。目前最流行的容器化技术是 Docker最流行的容器管理服务是 Kubernetes(K8S)应用/服务可以打包为 Docker 镜像通过 K8S 来动态分发和部署镜像。 Docker 镜像可理解为一个能运行你的应用/服务的最小的操作系统里面放着应用/服务的运行代码运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后就可以分发到需 要部署相关服务的机器上直接启动 Docker 镜像就可以把服务起起来使服务的部署 和运维变得简单。服务通常会有生产和研发 k8s 集群一般不会公用而研发集群通过命名空间来完成应用隔离有的公司按照研发目的划分为研发和测试集群有的公司通过组织架构完成部 门间的资源复用. 相关软件
Docker、 K8S
优点
高内聚业务拆分可以将不同的功能或业务封装成小型的、自治的微服务提高系统的内聚性和耦合性。低耦合业务拆分可以将不同的业务逻辑和功能模块解耦使得各个微服务可以独立开发和部署提高系统的灵活性和可扩展性。独立部署微服务可以独立部署提高系统的可用性和稳定性。当某个微服务出现问题时可以只对该服务进行维护和修复而不会影响到其他服务的正常运行。独立扩展微服务可以独立扩展当需要增加处理能力时可以单独增加节点或资源提高系统的处理能力和吞吐量。
缺点
复杂编排微服务数量增多后服务之间的调用关系和依赖关系会变得更加复杂需要更加复杂的编排和调度策略来保证系统的正常运行。过多通信微服务之间的通信需要使用消息队列等方式进行传递会增加系统的复杂性和成本同时也会带来一些性能问题。分布式问题微服务化之后服务数量增多管理起来也会更加困难需要更加完善的管理和监控机制来保证系统的可用性和稳定性。复杂性微服务将业务拆分成多个小型服务每个服务都需要单独开发和维护会增加开发、测试、部署等工作的复杂性和难度。 11.总结