精华内容
下载资源
问答
  • Rainbond 是云原生且易用的云原生应用管理平台,云原生应用交付的最佳实践,简单易用。专注于以应用为中心的理念。赋能企业搭建云原生开发云、云原生交付云。 对于企业: Rainbond 是开箱即用的云原生平台,借助 ...
  • 2.2.6 Golang大规模云原生应用管理实践@刘洋.pdf
  • 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思,我们在开始设计应用的...
  • 云原生(Cloud Native)的概念,由来自Pivotal的MattStine于2013年首次提出,被一直延续使用...采用基于云原生的技术和管理方法,可以更好地把业务生于“云”或迁移到云平台,从而享受“云”的高效和持续的服务能力。
  • Rainbond是一个云原生且易于使用的应用程序管理平台,是交付云原生应用程序的最佳实践,并且易于使用。 专注于以应用程序为中心的概念。 使企业能够构建云原生开发云,云原生交付云。 对于企业: Rainbond是可以...
  • 企业采用基于云原生的技术和管理方法,可以更好的把业务迁移到云平台,从而享受云的高效和按需资源能力,而容器云PaaS平台则是云原生应用重要的落地形态之一。企业在数字化转型中普遍面临IT系统架构缺乏弹性,
  • 云原生应用的十大设计原则

    万次阅读 2021-03-10 22:19:12
    越来越多的企业选择上云,在上构建自己公司的核心应用程序,通过云来大大减少公司的IT运维成本,提高应用的弹性能力,并把一些新兴的技术能力,例如:人工智能,物联网,区块连等引入到应用程序中,来增强企业的...

    目录

    云应用程序的十大设计原则

    自我修复设计

    实现全面冗余

    尽量减少协调 

    横向扩展设计

    通过分区解决限制 

    运营设计

    使用托管服务

    使用最佳的数据存储完成作业

    演变设计

    根据业务需求构建

     

    越来越多的企业选择上云,在云上构建自己公司的核心应用程序,通过云来大大减少公司的IT运维成本,提高应用的弹性能力,并把一些新兴的技术能力,例如:人工智能,物联网,区块连等引入到应用程序中,来增强企业的能力。以下介绍了云应用程序需要遵循的十大设计原则及基于微软云Azure的一些设计案例,遵循这些设计原则,可以提高应用程序的可伸缩性、复原能力和易管理性。


    云原生应用的十大设计原则


    自我修复设计

    设计应用程序以在故障发生时进行自我修复

    在分布式系统中,可能会发生故障。 硬件可能发生故障。 网络也有可能发生暂时性故障。 极少数情况下,整个服务或区域可能会遇到中断,但这些故障必须在计划之内。

    因此,设计的应用程序在故障发生时可进行自我修复。 这需要从三个方面入手:

    • 检测故障。
    • 从容应对故障。
    • 记录和监视故障,获取操作见解。

    如何应对特定类型的故障可能取决于应用程序的可用性需求。 例如,如果需要非常高的可用性,则可能在区域中断期间自动故障转移到次要区域。 然而,这将使成本高于单区域部署。

    此外,不要只考虑像区域中断这类大事件,因为这种情况通常鲜有发生。 应该尽可能将注意力集中在处理本地短期的故障上,例如网络连接故障或数据库连接失败等。

    建议

    • 重试失败的操作。 发生暂时性故障的原因可能有:短暂的网络连接中断、删除了数据库连接或服务因繁忙而超时。 在应用程序中构建重试逻辑来处理暂时性故障。 对于许多 Azure 服务,客户端 SDK 可实施自动重试。 有关详细信息,请参阅暂时性故障处理重试模式
    • 保护故障远程服务(断路器)。 在暂时性故障后最好进行重试,但如果故障仍然存在,最终可能会有非常多的调用方攻击故障服务。 因为请求进行了备份,这可能导致级联故障。 使用 断路器模式 ,无需在操作发生故障时) 进行远程调用,就能快速 (。
    • 隔离关键资源(隔层)。 子系统中的故障有时会发生级联。 如果某个故障导致某些资源(例如线程或套接字)无法及时释放,导致资源耗尽,则可能就会发生这种连锁反应。 为了避免此问题,请将系统分区为独立的组,使一个分区中的故障不会导致整个系统瘫痪。
    • 执行负载分级。 应用程序可能会遇到突发流量高峰,导致后端上的服务瘫痪。 为了避免此问题,请使用基于队列的负载调节模式使工作项排队进行异步运行。 队列充当可平缓负载高峰的缓冲区。
    • 故障转移。 如果无法访问某个实例,请故障转移到另一个实例。 对于 Web 服务器之类的无状态对象,请在负载均衡器或流量管理器后放置一些实例。 对于数据库之类的存储状态的对象,请使用副本和故障转移。 根据数据存储和复制方式,可能需要应用程序处理最终的一致性。
    • 补偿失败的事务。 一般情况下,需避免分布式事务,因为它们需要协调服务和资源。 相反,应该用较小的单个事务组成操作。 如果在中途操作失败,请使用补偿事务撤销已完成的所有步骤。
    • 检查点长时间运行的事务。 如果长时间运行的操作失败,检查点可以提供复原能力。 当操作重新启动时(例如,它被另一个 VM 选中),它可以从上一个检查点恢复。
    • 正常降级。 有时某个问题无法解决,但可以提供仍然有用的缩减版功能。 假设某个应用程序显示图书目录。 如果该应用程序无法检索封面的缩略图图像,它可能显示占位符图像。 整个子系统可能对应用程序不重要。 例如,在电子商务网站,显示产品建议可能没有处理订单重要。
    • 限制客户端。 有时,少量的用户会产生过多的负载,降低了应用程序对其他用户的可用性。 在这种情况下,可以在一段时间内限制客户端。 请参阅限制模式
    • 阻止错误执行组件。 仅仅限制客户端并不意味着客户端的行为是恶意的。 它只意味着客户端超出其服务配额。 但如果客户端持续超出其配额或在其他方面具有不良行为,则可能需要进行阻止。 定义一个带外进程,供用户请求解除阻止。
    • 使用领导选拔。 当需要协调任务时,请使用领导选拔选择协调器。 这样,协调器不是单一故障点。 如果协调器失败,则选择一个新的协调器。 与其从头开始实施领导选举算法,不如考虑现成的解决方案,比如 Zookeeper。
    • 使用故障注入进行测试。 通常,成功的路径会得到精心的测试,而失败的路径却不会。 系统在生产中长时间运行后,才会执行失败路径。 通过触发实际故障或模拟故障,使用故障注入来测试系统对故障的复原能力。
    • 采用混沌工程。 混沌工程通过将故障或异常情况随机注入到生产实例中,扩展了故障注入的概念。

    实现全面冗余

    在应用程序中构建冗余,以避免出现单一故障点

    有弹性的应用程序围绕故障路由。 标识应用程序中的关键路径。 该路径中的每个点是否都存在冗余? 当子系统出现故障时,应用程序是否会故障转移到其他内容?

    建议

    • 考虑业务需求。 在系统中生成的冗余量会影响成本和复杂度。 体系结构应反映业务需求,如恢复时间目标 (RTO)。 例如,多区域部署比单区域部署昂贵,其管理也更复杂。 需要使用操作过程处理故障转移和故障回复。 可能为一些业务方案(而不是其他方案)考虑额外的成本和复杂性。
    • 将 VM 放在负载均衡器之后。 请勿将一个 VM 用于任务关键的工作负载。 而是将多个 VM 放置于负载均衡器之后。 如果任何 VM 变得不可用,负载均衡器会向其余正常运行的 VM 分配流量。 若要了解如何部署此配置,请参阅用于提高可伸缩性和可用性的多个 VM
    • 复制数据库。 Azure SQL 数据库和 Cosmos DB 自动复制区域内的数据,且可以跨区域启用异地复制。 如果使用 IaaS 数据库解决方案,请选择支持复制和故障转移的解决方案,如 SQL Server Always On 可用性组
    • 启用异地复制Azure SQL 数据库Cosmos DB 的异地复制在一个或多个次要区域中创建数据的可读次要副本。 出现故障时,数据库可以故障转移到供写入的次要区域。
    • 为提高可用性而分区。 数据库分区通常用于提高可伸缩性,但它还可以提高可用性。 如果一个分片出现故障,仍可以访问其他分片。 一个分片中的故障仅中断总事务的子集。
    • 部署到多个区域。 为实现最高可用性,请将应用程序部署到多个区域。 这样,在极少数情况下,当某个问题影响到整个区域时,应用程序可以故障转移到另一区域。 下图显示了使用 Azure 流量管理器处理故障转移的多区域应用程序。

    • 同步前端和后端故障转移。 使用 Azure 流量管理器将前端故障转移。 如果无法访问一个区域中的前端,流量管理器会将新请求路由到次要区域。 可能需要协调数据库的故障转移,具体取决于数据库解决方案。
    • 使用自动故障转移,但手动进行故障恢复。 将流量管理器用于自动故障转移,而不用于自动故障恢复。 自动故障恢复存在风险,即可能在区域尚未完全正常之前切换到主要区域。 请改为验证所有应用程序子系统均正常运行,然后再手动进行故障恢复。 此外,可能需要在故障恢复前检查数据一致性,具体取决于数据库。
    • 为流量管理器包括冗余。 流量管理器是一个潜在的故障点。 查看流量管理器 SLA,然后决定仅使用流量管理器是否能满足高可用性的业务需求。 如果不能,请考虑添加另一个流量管理解决方案作为故障回复机制。 如果 Azure 流量管理器服务出现故障,请将 DNS 中的 CNAME 记录更改为指向其他流量管理服务。

    尽量程度减少协调

    最大程度减少应用程序服务之间的协调以获得可伸缩性

    大多数云应用程序包含多个应用程序服务 — web 前端、数据库、业务流程、报告和分析等。 若要实现可伸缩性和可靠性,其中每一个服务都应在多个实例上运行。

    当两个实例尝试执行影响某种共享状态的并发操作时会发生什么? 在某些情况下,须跨节点进行协调,例如保留 ACID 保证。 此图中,Node2 正在等待 Node1 释放数据库锁定:

    协调限制了水平缩放的优点,且会形成瓶颈。 在此示例中,当横向扩展应用程序并添加更多实例时,锁定争用会增加。 而最糟的情况是前端实例将花费大部分时间等待锁定。

    “仅一次”语义是发生协调的另一个常见原因。 例如,一个顺序必须仅处理一次。 两个辅助角色正在侦听新顺序。 Worker1 选取一个顺序进行处理。 应用程序须确保 Worker2 不会重复工作,并且如果 Worker1 崩溃,不会删除顺序。

    可使用计划程序代理监督程序等模式在辅助角色之间进行协调,但在这种情况下,采用对工作进行分区的方法可能更好。 每个辅助角色都分配有某范围的顺序(比如按照计费区域)。 如果某辅助角色故障,新的实例会在前一个实例停止的位置启用,但不会出现多个实例争用的情况。

    建议

    • 采用最终一致性。 分布数据时,需要协调来强制执行可靠的一致性保证。 例如,假设通过一项操作更新两个数据库。 最好系统能调节最终一致性(方法是在发生故障后,使用补偿事务模式进行逻辑回滚),而不是将其置于单个事务范围。
    • 使用域事件同步状态。 域事件是一种事件,可记录域中发生的重要事情。 关注的服务会侦听事件,而不是使用全局事务来协调多个服务。 如果使用此方法,系统必须允许最终一致性(请参阅上一项)。
    • 请考虑 CQRS 和事件源等模式。 这两种模式有助于减少读取工作负载和写入工作负载之间的争用。

    CQRS 模式将读取操作从写入操作中分离。 在某些实现中,读取数据通过物理方式从写入数据中分离。

    事件源模式中,状态更改作为一系列事件被记录到仅追加数据存储中。 将事件追加到流是一种原子操作,需要最小锁定。

    • 这两种模式互为补充。 如果 CQRS 中的只写存储使用事件源,则只读存储可以侦听相同的事件,以创建当前状态的可读快照(已针对查询进行优化)。 但是,在采用 CQRS 或事件源之前,请先了解此方法的难题。
    • 分区数据。 避免将所有数据放入一个由多个应用程序服务共享的数据架构中。 微服务体系结构通过使每个服务对自己的数据存储负责来强制执行这一原则。 在单个数据库中,将数据分区到不同分片可以提高并发性,因为写入到一个分片的服务不会影响写入其他分片的服务。
    • 设计幂等运算。 如果可能,请将操作设计为幂等操作。 这样一来,可使用“至少一次”语义处理这些操作。 例如,可将工作项放入队列。 如果某辅助角色在操作期间故障,另一个辅助角色会选取此工作项。
    • 使用异步并行处理。 如果某项操作需要多个异步执行的步骤(例如远程服务调用),可并行调用,然后聚合结果。 此方法假定每个步骤不依赖上一步的结果。
    • 尽可能使用开放式并发。 悲观并发控件使用数据库锁定来防止冲突。 这可能会导致性能不佳,可用性降低。 对于乐观并发控件,每个事务修改数据的副本或快照。 提交事务时,数据库引擎会验证事务并拒绝会影响数据库一致性的任何事务。
    • 通过快照隔离,Azure SQL 数据库和 SQL Server 支持乐观并发。 通过使用 Azure Cosmos DBAzure 存储等 Etag,一些 Azure 存储服务支持乐观并发。
    • 请考虑 MapReduce 或其他并行的分布式算法。 根据要执行的工作的数据和类型,可将工作拆分为独立的任务,这些任务可以由并行工作的多个节点执行。 请参阅大计算的体系结构样式
    • 使用前导选举进行协调。 如果需要协调操作,请确保协调器不会成为应用程序中的单一故障点。 使用领导选择模式,一个实例始终是领导并充当协调器。 如果该领导失败,会选择新的实例作为领导。

    横向扩展设计

    设计应用程序,使其能够扩大,根据需要添加或删除新实例。

    云的主要优点是可以弹性缩放 — 能够根据需要使用容量,在负载增加时扩大,在不需要额外容量时缩小。 设计应用程序,使其能够扩大,根据需要添加或删除新实例。

    建议

    • 避免实例粘性。 在来自相同客户端的请求始终路由至同一台服务器时,才会出现粘性或会话相关性。 粘性限制了应用程序的横向扩展能力。例如,来自高容量用户的流量不会分布在多个实例中。 粘性的成因包括在内存中存储会话状态以及使用特定于计算的密钥加密。 请确保任何实例都可处理任何请求。
    • 确定瓶颈。 扩大并不是解决每个性能问题的万能方式。 例如,如果后端数据库是瓶颈,添加再多 Web 服务器也于事无补。 首先识别并解析系统中的瓶颈,然后针对该问题引发更多实例。 系统中有状态的部分最有可能引起瓶颈问题。
    • 通过可伸缩性要求分解工作负荷 应用程序通常由多个工作负荷组成,它们的缩放要求各不相同。 例如,应用程序可能有面向公众的网站和单独的管理网站。 公众网站可能会遇到流量突然激增的情况,而管理网站的负荷更小,且更具可预测性。
    • 卸载资源密集型任务 需要大量的 CPU 或 I/O 资源的任务应尽可能移动到后台作业以减少处理用户请求的前端上的负载。
    • 使用内置自动缩放功能。 许多 Azure 计算服务有内置的自动缩放支持。 如果应用程序具有可预测的常规工作负荷,则可按计划扩大。 例如,在营业时间期间扩大。 否则,如果工作负荷不可预测,则可使用 CPU 或请求队列长度等性能指标来触发自动缩放。 有关自动缩放最佳做法的信息,请参阅自动缩放
    • 请为关键工作负荷考虑自动缩放。 对于关键工作负荷,你希望供应一直超过需求。 在负载加重的情况下,最好是快速添加新实例来处理额外的流量,然后逐渐缩减。
    • 缩小式设计。 请记住,使用弹性缩放时,应用程序会有缩小时期,此时实例会被移除。 应用程序必须妥善处理正在移除的实例。 以下是一些处理缩小功能的方法:

    侦听关闭事件(可用时),然后全部关闭。

    服务的客户端/使用者应支持暂时性故障处理和重试。

    对于运行时间长的任务,请考虑使用检查点,或者管道和筛选器模式分解工作。

    如果实例是在处理过程中移除的,请将工作项放在队列中,以便另一个实例可以接收工作。


    通过分区解决限制 

    使用分区来解决数据库、网络和计算限制

    在云中,所有服务都有纵向扩展的限制。 Azure 订阅和服务限制、配额和约束中介绍了 Azure 服务限制。 限制包括内核数、数据库大小、查询吞吐量和网络吞吐量。 如果系统增长到足够大,可能会命中一个或多个限制。 使用分区来解决这些限制。

    有很多方法可用于分区系统,例如:

    • 分区数据库,以避免对数据库大小、数据 I/O 或并发会话数的限制。

    • 分区队列或消息总线,以避免对请求数或并发连接数的限制。

    • 分区应用服务 Web 应用,以避免对每个应用服务计划的实例数的限制。

    可以水平、垂直、或按功能分区数据库。

    • 在水平分区(也称为分片)中,每个分区保存总数据集的子集的数据。 这些分区共享相同的数据架构。 例如,名称以 A–M 开头的客户进入一个分区,以 N–Z 开头的进入另一个分区。

    • 在垂直分区中,每个分区保存数据存储中项字段的子集。 例如,将经常访问的字段放在一个分区中,将较不经常访问的字段放在另一个分区。

    • 在功能分区中,根据系统中每个界限上下文使用数据的方式对数据进行分区。 例如,在一个分区中存储发票数据,在另一个分区中存储产品库存数据。 架构是独立的。

    有关更多详细指南,请参阅数据分区

    建议

    • 分区应用程序的不同部分。 数据库显然很适合用于分区,但也需考虑存储、缓存、队列和计算实例。
    • 设计分区键以避免热点。 如果分区数据库,但一个分片仍然获取大多数请求,那么问题还未解决。 理想情况下,负载会在所有分区中均匀分布。 例如,按客户 ID 而不是客户名称的首字母进行哈希分区,因为某些首字母会更集中。 分区消息队列时,该原则也同样适用。 选择一个可以在队列集中平均分布消息的分区键。 有关更多信息,请参阅分片
    • 通过分区解决 Azure 订阅和服务限制。 单个组件和服务有限制,但订阅和资源组也有限制。 对于非常大的应用程序,可能需要进行分区来解决这些限制。
    • 在不同级别分区。 请考虑部署在 VM 上的数据库服务器。 VM 有一个由 Azure 存储支持的 VHD。 存储帐户属于 Azure 订阅。 请注意,层次结构中的每个步骤都有限制。 数据库服务器可能有连接池限制。 VM 有 CPU 和网络限制。 存储有 IOPS 限制。 订阅有 VM 内核数的限制。 一般来说,在较低的层次结构更容易分区。 仅大型应用程序需要在订阅级别进行分区。

    运营设计

    合理设计应用程序,使运营团队获得所需的工具。

    云已经显著改变了运营团队的角色。 他们不再负责管理托管应用程序的硬件和基础结构。 即便如此,运营仍是成功运行云应用程序的关键环节。 运营团队的一些重要功能包括:

    • 部署
    • 监视
    • 升级
    • 事件响应
    • 安全审核

    可靠的记录和跟踪对于云应用程序非常重要。 在设计和规划中涉及操作团队,以确保应用程序为其提供成功所需的数据和见解。

    建议

    • 确保可以观测到所有内容。 部署和运行解决方案后,日志记录和跟踪的结果将是对系统的主要见解。 “跟踪”就是记录系统中的路径,有助于找出瓶颈、性能问题和故障点。 “记录”就是捕获单个事件,例如应用程序状态更改、错误和异常。 请在生产时记录,否则将在最需要它的时候缺乏见解。
    • 用于监视的手段。 通过监视可了解应用程序在可用性、性能和系统运行状况方面的表现是否良好。 例如,监视可指示是否符合 SLA。 在系统的常规运行期间都会进行监视。 应尽可能实时监视,以便操作人员可以迅速对问题作出反应。 理想情况下,监视可在导致严重故障之前,帮助避免问题的出现。 有关详细信息,请参阅监视和诊断
    • 用于根本原因分析的手段。 根本原因分析是查找故障的根本原因的过程。 它发生在故障出现后。
    • 使用分布式跟踪。 使用专为并发、异步和云规模设计的分布式跟踪系统。 跟踪应包括跨服务边界的关联 ID。 单个操作可能涉及对多个应用程序服务的调用。 如果操作失败,关联 ID 可帮助找出失败的原因。
    • 将日志和指标标准化。 运营团队需要在解决方案中聚合来自各种服务的日志。 如果每种服务使用各自的日志格式,将很难或不可能从中获取有用的信息。 定义包括关联 ID、事件名称、发送者 IP 地址等字段的常见架构。 单个服务可以派生继承基础架构并包含附加字段的自定义架构。
    • 自动化管理任务,包括预配、部署和监视。 自动化任务具有可重复性并且可以减少人为错误。
    • 将配置视为代码。 通过将配置文件签入版本控制系统,可以对更改进行跟踪和版本控制,并在需要时回滚。

    使用托管服务

    如果可能,请使用平台即为服务 (PaaS),而不是基础结构即服务 (IaaS)

    IaaS 就像有一盒零件。 你可以构建任何东西,但必须自己组装。 PaaS 选项更易于配置和管理。 无需提供 VM、设置 VNet、管理补丁和更新,以及与在 VM 上运行软件相关的所有其他开销。

    例如,假设应用程序需要一个消息队列。 可以使用类似 RabbitMQ 的东西在 VM 上设置自己的消息传递服务。 但 Azure 服务总线已经提供了可靠的消息传递作为服务,而且它更易于设置。 只需创建一个服务总线命名空间(这可以作为部署脚本的一部分来完成),然后使用客户端 SDK 调用服务总线。

    当然,应用程序可能具有某些特定要求,会使 IaaS 方法更合适。 但是,即使您的应用程序基于 IaaS,查找在哪里可以自然地包含 PaaS 选项。 其中包括缓存、队列和数据存储。

     
    取消运行…考虑使用…
    Active DirectoryAzure Active Directory
    ElasticsearchAzure 搜索
    HadoopHDInsight
    IIS应用服务
    MongoDBCosmos DB
    Redis用于 Redis 的 Azure 缓存
    SQL ServerAzure SQL 数据库
    文件共享Azure NetApp 文件

    请注意,这并不是一个详尽的列表,而是等效选项的子集。


    使用最佳的数据存储完成作业

    选择最适合数据的存储技术,并了解如何使用该技术

    现在再也无需将所有数据粘贴到大型 SQL 关系数据库。 关系数据库非常擅长通过关系数据为事务提供 ACID 保证。 但这会产生一些费用:

    • 查询可能需要高成本联接。
    • 数据必须规范化,且符合预定义架构(写入架构)。
    • 锁定争用可能会对性能产生影响。

    在任何大型解决方案中,单个数据存储技术很可能满足不了所有需求。 关系数据库的替代方案包括键/值存储、文档数据库、搜索引擎数据库、时间序列数据库、列系列数据库和图形数据库。 每个方案都有其优缺点,不同类型的数据适合其中不同的方案。

    例如,可将产品目录存储在文档数据库(如 Cosmos DB)中,这可实现灵活架构。 在这种情况下,每个产品描述是一个自包含文档。 若要查询整个目录,可以索引目录并将索引存储在 Azure 搜索中。 产品清单可以存储在 SQL 数据库中,因为这类数据需要 ACID 保证。

    请记住,数据不仅仅包括持久化的应用程序数据。 还包括应用程序日志、事件、消息和缓存。

    建议

    请勿在任何情况下都使用关系数据库。 请考虑在适当的时候使用其他数据存储。 请参阅选择适当的数据存储

    采用混合持久性。 在任何大型解决方案中,单个数据存储技术很可能满足不了所有需求。

    请考虑数据的类型。 例如,将事务数据存储在 SQL 中,将 JSON 文档存储在文档数据库中,将遥测数据存储在时序数据库中,将应用程序日志存储在 Elasticsearch 中,并将 Blob 存储在 Azure Blob 存储中。

    优先考虑可用性而非(强)一致性。 CAP 定理意味着分布式系统须权衡可用性和一致性。 (的网络分区、CAP 定理的另一条脚永远无法完全避免。 ) 通常,可以通过采用 最终一致性 模型来实现更高的可用性。

    请考虑开发团队的技能组合。 使用混合持久性有一些好处,但也有可能适得其反。 采用新的数据存储技术需要新的技能组合。 开发团队须了解如何充分利用此技术。 他们必须了解恰当的使用模式、如何优化查询、调整性能等。 请在考虑存储技术时将此因素考虑在内。

    使用补偿事务。 混合持久性的副作用是单个事务可能会将数据写入多个存储。 如果出现故障,使用补偿事务来撤消任何已完成的步骤。

    查看界限上下文。 界限上下文是域驱动设计中的一个术语。 界限上下文是域模型的显式边界,它定义模型适用于域的哪个部分。 理想情况下,界限上下文将映射到业务域的子域。 系统中的界线上下文是考虑混合持久性的自然位置。 例如,“产品”可能会出现在产品目录子域和产品清单子域,但这两个子域很可能对存储、更新、查询产品的要求不同。


    演变设计

    进化型设计是持续创新的关键

    无论是修复 bug、添加新功能、引入新技术,还是使现有系统更具伸缩性和弹性,所有成功的应用程序都在随着时间而不断变化。 如果应用程序的所有部分都紧密耦合,则很难将更改引入系统。 应用程序中一个部分的更改可能会破坏另一部分,或者改变整个代码库。

    这个问题并不局限于单片应用程序。 应用程序可分解为服务,但仍会表现出那种紧密耦合性,使系统变得刚性和脆弱。 但当服务设计为可以改进时,团队可以创新并不断提供新功能。

    微服务正在成为实现进化设计的一种热门方式,因为它们可以解决此处列出的许多值得注意的问题。

    建议

    • 强制执行高度内聚和松散耦合。 如果服务提供逻辑上具有共同所属的功能,则该服务具有内聚性。 如果可以在更改一个服务的同时不会更改另一个服务,则服务具有松散耦合性。 高度内聚通常意味着更改一个函数时还需更改其他相关函数。 如果发现更新某个服务时需要对其他服务进行协调更新,则可能表示该服务不具有内聚性。 域驱动设计 (DDD) 的目标之一就是标识这些边界。
    • 封装域知识。 客户端使用服务时,强制执行域的业务规则的责任不应落在客户端上。 相反,服务应封装属于其责任范围内的所有域知识。 否则,每个客户端都必须强制执行业务规则,最终域知识会分散在应用程序的不同部分。
    • 使用异步消息传递。 异步消息传递是一种将消息创建者与使用者分离的方法。 创建者不依赖于使用者回复消息或采取任何特定操作。 有了 pub/sub 体系结构,创建者甚至可能不知道谁在使用消息。 新服务可以轻松地使用消息,而不需要对创建者进行任何修改。
    • 不要将域知识构建到网关中。 在微服务体系结构中,网关对于请求路由、协议转换、负载均衡或身份验证等操作非常有用。 但网关应该仅限于这种基础结构功能。 它不应实施任何域知识,以避免成为严重的依赖项。
    • 公开开放接口。 避免在服务之间创建自定义转换层。 相反,服务应该公开具有明确定义的 API 协定的 API。 API 应拥有版本控制,以便在保持向后兼容性的同时改进 API。 这样就可以更新服务,而无需对依赖它的所有上游服务进行协调更新。 面向公众的服务应通过 HTTP 公开一个 RESTful API。 因性能原因,后端服务可能会使用 RPC 样式的消息传递协议。
    • 针对服务协定进行设计和测试。 在服务公开了明确定义的 API 后,可以针对这些 API 进行开发和测试。 这样可以开发和测试单个服务,而无需启动所有的依赖服务。 (当然,仍然可以针对实际服务执行集成和负载测试。)
    • 分清基础结构与域逻辑。 不要将域逻辑与基础结构相关的功能(如消息传递或暂留)混在一起。 否则,更改域逻辑时需要对基础结构层进行更新,反之亦然。
    • 将跨领域问题转移到单独服务上。 例如,如果多个服务需要对请求进行身份验证,可将此功能移到各自的服务中。 然后便可改进身份验证服务(例如,通过添加新的身份验证流),而无需涉及使用它的任何服务。
    • 独立部署服务。 DevOps 团队可以独立地为应用程序中的其他服务部署单个服务时,更新就会更快,更安全。 Bug 修复和新功能便能按更常规的节奏推出。 同时设计应用程序和发布过程以支持独立更新。

    根据业务需求构建

    必须根据业务需求作出每一个设计决策

    此设计原则看似不言自明,但在设计解决方案时请务必遵循此原则。 预期的用户数是数千还是数百万人? 是否可接受一个小时的应用程序中断? 是否预计流量过大或可预测的工作负荷? 最终,必须根据业务需求作出每一个设计决策。

    建议

    • 定义业务目标,包括恢复时间目标 (RTO)、恢复点目标 (RPO) 和可容忍的最长中断时间 (MTO)。 这些数字应为决策提供有关体系结构的信息。 例如,若要实现较低的 RTO,可能会向次要区域实施自动故障转移。 但如果你的解决方案可以接受较高的 RTO,则可能不需要该程度的冗余。
    • 记录服务级别协议 (SLA) 和服务级别目标 (SLO),包括可用性和性能指标。 你可能会构建可用性为 99.95% 的解决方案。 这够了吗? 答案是需要业务决策。
    • 围绕业务领域为应用程序建模。 首先分析业务需求。 根据这些需求为应用程序建模。 请考虑使用领域驱动设计 (DDD) 方法创建反映业务流程和用例的域模型
    • 捕获功能性和非功能性需求。 可以通过功能性需求判断应用程序是否执行了所需操作。 可以通过非功能性需求判断应用程序的操作执行是否则正常。 具体而言,确保你理解自己对可伸缩性、可用性和延迟的需求。 这些需求将影响设计决策和技术选择。
    • 按工作负荷分解。 在此语境中,术语“工作负荷”是指某个离散的功能或计算任务,可以将它和其他任务逻辑分离。 不同的工作负荷在可用性、可伸缩性、数据一致性和灾难恢复方面具有不同的需求。
    • 规划增长。 某解决方案可能满足你当前对用户数、事务量和数据存储等方面的需求。 但是,可靠的应用程序可在不进行主要体系结构更改的情况下实现增长。 请参阅设计为横向扩展分区避开限制。 也请注意,你的业务模型和业务需求很可能在一段时间后发生更改。 如果应用程序的服务模型和数据模型过于死板,则很难将应用程序用于新的用例和方案。 请参阅 Design for evolution(旨在改进)。
    • 管理成本。 在传统的本地应用程序中,按资本支出为硬件付费。 在云应用程序中,为使用的资源付费。 确保了解所使用服务的定价模型。 总成本包括网络带宽使用量、存储、IP 地址、服务消耗和其他因素。 有关详细信息,请参阅 Azure 定价。 也需考虑操作成本。 在云中,无需管理硬件或其他基础结构,但仍需管理应用程序,包括 DevOps、事件响应和灾难恢复等。

     

    ----------------------------------
    大家好,我是流水,一个资深的IT从业人员和架构师. 非常高兴您能搜索到,并看到这篇文章,希望这篇文章的内容能给您带来新的知识和帮助。

    也欢迎扫描以下的二维码或微信搜索 “superxtech”,关注我的微信公众号 , 我会把更多更好的IT领域技术知识带给您!

    ----------------------------------

    展开全文
  • 云安全概述 安全问题成为影响云原生落地的重要因素 云原生面临的安全威胁和风险 云原生安全防护思路 云原生安全加固 ...云原生应用安全 服务网格安全防护 serverless安全防护 面向新基建的云原生安全
  • 云原生特有的技术架构和应用模式出发,全面剖析云原生系统面临的 安全威胁,针对性提出云原生安全边界、原则和防护模型,系统阐述 涵盖基础设施安全、云原生计算环境安全、云原生应用安全、云原生 研发运营安全、云...
  • 云原生应用概念解析

    2020-03-26 00:35:07
    什么是云原生云原生(Cloud Native)是由 Pivotal 的Matt Stine在2013年提出的一个概念,是他...云原生是面向“云”而设计的应用,因此技术部分依赖于在传统云计算的3层概念(基础设施即服务(IaaS)、平台即服务...

    什么是云原生?
    云原生(Cloud Native)是由 Pivotal 的Matt Stine在2013年提出的一个概念,是他多年的架构和咨询总结出来的一个思想的集合。

    在云的时代,应用会更多的迁移到云端,基于云的架构设计和开发模式需要一套全新的理念去承载,于是云原生思想应运而生。

    云原生是面向“云”而设计的应用,因此技术部分依赖于在传统云计算的3层概念(基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)),例如,敏捷的不可变基础设施交付类似于IaaS,用来提供计算网络存储等基础资源,这些资源是可编程且不可变的,直接通过API可以对外提供服务;有些应用通过PaaS服务本来就能组合成不同的业务能力,不一定需要从头开始建设;还有一些软件只需要“云”的资源就能直接运行起来为云用户提供服务,即SaaS能力,用户直接面对的就是原生的应用。

    在一般用法中,“云原生”是一种构建和运行应用程序的方法,它利用了云计算交付模型的优势。“云原生”是关于如何创建和部署应用程序,和位置无关。 这意味着应用程序位于云中,而不是传统数据中心。

    概况来说,云原生(Cloud Native)是一个思想的集合,包括DevOps、持续交付(Continuous Delivery)、微服务(MicroServices)、敏捷基础设施(Agile Infrastructure)、康威定律(Conways Law)等,以及根据商业能力对公司进行重组。Cloud Native既包含技术(微服务,敏捷基础设施),也包含管理(DevOps,持续交付,康威定律,重组等)。Cloud Native也可以说是一系列Cloud技术、企业管理方法的集合。
    云原生更是一个不断丰富的理念和技术体系,它在基础架构、应用程序和管理上都将深刻的影响和改变企业云的未来!

    云原生应用
    云原生应用是天然适合云特点的应用,云原生应用系统需要与操作系统等基础设施分离,不应该依赖Linux或Windows等底层平台,或依赖某个云平台。也就是说,应用从开始就设计为运行在云中,无论私有云或公有云;其次,该应用必须能满足扩展性需求,垂直扩展(向上和向下)或水平扩展(跨节点服务器)。
    CNCF给出了云原生应用的三大特征:

    容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。
    动态管理:通过集中式的编排调度系统来动态的管理和调度。
    面向微服务:明确服务间的依赖,互相解耦。

    云原生应用和本地部署应用程序之间的差异

    云原生应用程序开发采用与传统企业应用程序完全不同的体系结构。

    编程语言

    编写在公司服务器上运行的本地部署应用程序往往使用传统语言编写,如C/C ++,C#或其他Visual Studio语言(如果部署在Windows Server平台上)和企业级Java。如果它在大型机上,可能使用Cobol。

    云原生应用更有可能以网络为中心的语言编写,这意味着使用HTML,CSS,Java,JavaScript,.Net,Go,Node.js,PHP,Python和Ruby。

    可更新

    云原生应用程序始终是最新的,云原生应用始终可用。

    本地部署应用程序需要更新,并且通常由供应商按订阅提供,并且在安装更新时需要停机。

    弹性

    云原生应用程序通过在峰值期间增加的资源来利用云的弹性。如果你的基于云的电子商务应用程序使用频繁,你可以将其设置为使用额外的计算资源,直到峰值消退然后关闭这些资源。云原生应用可以根据需要调整增加资源和规模。

    本地部署应用程序无法动态扩展。

    多租户

    云原生应用程序在虚拟化环境中工作,并与其他应用程序共享资源没有问题。

    许多本地部署应用程序要么在虚拟环境中不能正常工作,要么根本不工作,必须要非虚拟化环境。

    连接资源

    本地部署应用程序与网络资源的连接相当严格,例如网络,安全性,权限和存储。其中许多资源需要进行硬编码,如果移动或更改了任何内容,它们就会中断。

    “网络和存储在云端完全不同。当你听到“重新平台化”一词时,通常是为了适应网络,存储甚至数据库技术的变化,以允许应用程序在云中运行,“Deloitte的Kavis说。

    停止时间

    云中存在比本地部署更大的冗余,因此如果云供应商遭受中断,则另一个冗余区域可以消除中断。

    本地部署应用程序可能已准备好故障转移,但如果服务器出现故障,应用程序可能会崩溃。

    自动化

    云计算的大部分都是自动化的,其中包括应用程序管理。 “云原生交付的好处,特别是速度和敏捷性,依赖于可靠,经过验证和经过审核的已知良好流程的基础,这些流程根据自动化和编排工具的需要而不是通过人工干预重复执行,”Splunk的Mann说。工程师应该考虑自动化是不止一次做的任何事情,以实现可重复性,自助服务,敏捷性,可扩展性以及审计和控制。

    本地部署应用程序必须手动管理。

    模块化设计

    本地部署应用程序往往在设计上是单一的。他们肯定会将一些工作卸载到库中,但最终它是一个包含大量子程序的大应用程序。云原生应用程序更加模块化,许多功能分解为微服务。这允许在不需要时关闭它们,并将更新推广到那个模块,而不是整个应用程序。

    无状态

    云的松耦合特性意味着应用程序与基础架构无关,这意味着它们是无状态的。云原生应用程序将其状态存储在数据库或其他外部实体中,因此实例可以来去,应用程序仍然可以跟踪应用程序在工作单元中的位置。 “这是松耦合的本质。不依赖于基础架构允许和应用程序以高度分布的方式运行,并且仍然保持其状态独立于底层基础架构的弹性性质,“Kavis说。

    大多数本地部署应用程序都是有状态的,这意味着它们会在运行代码的基础架构上存储应用程序的状态。因此,在添加服务器资源时可能会破坏应用程序。

    展开全文
  • 什么是 云原生应用

    2021-02-02 09:28:35
    云原生意味着应用程序原生就被设计为在云上以最佳方式运行。 云原生是一种专门针对云上应用而设计的方法,用于构建和部署应用,以充分发挥云计算的优势。这些应用的特点是可以实现快速和频繁的构建、发布、部署,...

    云原生定义#

    云原生意味着应用程序原生就被设计为在云上以最佳方式运行。

    云原生是一种专门针对云上应用而设计的方法,用于构建和部署应用,以充分发挥云计算的优势。这些应用的特点是可以实现快速和频繁的构建、发布、部署,结合云计算的特点实现和底层硬件和操作系统解耦,可以方便的满足在扩展性,可用性,可移植性等方面的要求,并提供更好的经济性。同时通过拆解为多个小型功能团队来让组织更敏捷,让人员、流程和工具更好的结合,在开发、测试、运维之间进行更密切的协作。

    但是当需要回答“什么是云原生”这个问题时,还是会有些困难:在过去几年间,云原生的定义一直在变化和发展演进,不同时期不同的公司对此的理解和诠释也不尽相同,因此往往会带来一些疑惑和误解。

    我们一起来看看云原生定义在不同时期的变化。

    Pivotal的定义#

    Pivotal 是Cloud Native/云原生应用的提出者,并推出了Pivotal Cloud Foundry和Spring系列开发框架,是云原生的先驱者和探路者。

    2015年,来自Pivotal公司的Matt Stine编写了一本名为 迁移到云原生应用架构 的电子书,提出云原生应用架构应该具备的几个主要特征:

    • 符合12因素应用(Twelve-Factor Applications)
    • 面向微服务架构(Microservices)
    • 自服务敏捷架构(Self-Service Agile Infrastructure)
    • 基于API的协作(API-Based Collaboration)
    • 抗脆弱性(Antifragility)

    在2017年10月,也是Matt Stine,在接受InfoQ采访时,则对云原生的定义做了小幅调整,将Cloud Native Architectures定义为具有以下六个特质:

    • 模块化(Modularity):(通过微服务)
    • 可观测性(Observability)
    • 可部署性(Deployability)
    • 可测试性(Testability)
    • 可处理性(Disposability)
    • 可替换性(Replaceability)

    而在Pivotal最新的官方网站 https://pivotal.io/cloud-native 上,对cloud native的介绍则是关注如下图所示的四个要点:

    https://skyao.io/learning-cloudnative/introduction/images/pivotal-cloud-native.png

    • DevOps
    • Continuous Delivery
    • Microservices
    • Containers

    CNCF的定义#

    2015年CNCF建立,开始围绕云原生的概念打造云原生生态体系,起初CNCF对云原生的定义包含以下三个方面:

    • 应用容器化(software stack to be Containerized)
    • 面向微服务架构(Microservices oriented)
    • 应用支持容器的编排调度(Dynamically Orchestrated)

    云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化地交付业务软件。云原生由微服务架构,DevOps 和以容器为代表的敏捷基础架构组成。援引宋净超同学的一张图片来描述云原生所需要的能力与特征:

    https://skyao.io/learning-cloudnative/introduction/images/cloud-native-definition-cncf-original.png

    在2018年,随着社区对云原生理念的广泛认可和云原生生态的不断扩大,还有CNCF项目和会员的大量增加,起初的定义已经不再适用,因此CNCF对云原生进行了重新定位。

    2018年6月,CNCF正式对外公布了更新之后的云原生的定义(包含中文版本)v1.0版本:

    Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

    新的定义中,继续保持原有的核心内容:容器和微服务,但是非常特别的将服务网格单独列出来,而不是将服务网格作为微服务的一个子项或者实现模式,体现了云原生中服务网格这一个新生技术的重要性。而不可变基础设施和声明式API这两个设计指导理念的加入,则强调了这两个概念对云原生架构的影响和对未来发展的指导作用。

     

    可以通过访问 https://github.com/cncf/toc/blob/master/DEFINITION.md 查看。

    云原生定义之外#

    从上面可以看到,云原生的内容和具体形式随着时间的推移一直在变化,即便是CNCF最新推出的云原生定义也非常明确的标注为v1.0,相信未来我们很有机会看到v1.1、v2版本。而且云原生这个词汇最近被过度使用,混有各种营销色彩,容易发生偏离。因此,云原生的定义是什么并不重要,关键还是云原生定义后面的理念、文化、技术、工具、组织结构和行为方式。

    Joe Beda,Heptio 的CTO,指出:

    There is no hard and fast definition for what Cloud Native means. In fact there are other overlapping terms and ideologies. At its root, Cloud Native is structuring teams, culture and technology to utilize automation and architectures to manage complexity and unlock velocity.Cloud Native并没有硬性和牢靠的定义。实际上,还有其他重叠的术语和意识形态。从根本上说,Cloud Native正在构建团队,文化和技术,以利用自动化和架构来管理复杂性和解锁速度。We are still at the beginning of this journey.我们还处在这个旅程的开始阶段。

    Christian Posta 指出:

    “Cloud native” is an adjective that describes the applications, architectures, platforms/infrastructure, and processes, that together make it economical to work in a way that allows us to improve our ability to quickly respond to change and reduce unpredictability. This includes things like services architectures, self-service infrastructure, automation, continuous integration/delivery pipelines, observability tools, freedom/responsibility to experiment, teams held to outcomes not output, etc.“云原生”是一个形容词,用于描述应用,结构,平台/基础设施和流程,这些共同促使我们以比较经济的工作方式来提高能力,实现快速响应变化和减少不可预测性。包括服务架构,自助服务基础设施,自动化,持续集成/交付管道,可观察性工具,实验的自由/责任,坚持结果而不是产出的团队等。

    在下一节,我们将深入分解云原生的理念和诉求,来看看云原生是通过什么方式来实现目标。

    参考资料#

    展开全文
  • 在存储服务演进过程中,每一种业务类型、新技术方向都会对存储的架构、性能、可用性、稳定性等提出新的要求,而在当今技术浪潮走到云原生技术普及的时代,存储服务需要哪些特性来支持应用呢? 从本文开始,我们将用...

    头图.png

    作者| 郡宝 阿里云技术专家

    参与文末留言互动,即有机会获得赠书福利!

    导读:存储服务支撑了应用的状态、数据的持久化,是计算机系统中的重要组成部分,也是所有应用得以运行的基础,其重要性不言而喻。在存储服务演进过程中,每一种业务类型、新技术方向都会对存储的架构、性能、可用性、稳定性等提出新的要求,而在当今技术浪潮走到云原生技术普及的时代,存储服务需要哪些特性来支持应用呢?

    从本文开始,我们将用一个系列文章对云原生存储进行方方面面的探析,该系列文章将从云原生存储服务的概念、特点、需求、原理、使用、案例等方面,和大家一起探讨云原生存储技术新的机遇与挑战,欢迎大家讨论:

    "There is no such thing as a 'stateless' architecture" - Jonas Boner

    云原生存储系列文章(一):云原生应用的基石
    云原生存储系列文章(二):容器存储与K8S存储卷
    云原生存储系列文章(三):Kubernetes存储架构
    云原生存储系列文章(四):K8S存储实践-Flexvolume
    云原生存储系列文章(五):K8S存储实践-CSI
    云原生存储系列文章(六):存储卷高可用方案
    云原生存储系列文章(七):存储调度与容量感知
    云原生存储系列文章(八):数据卷扩缩容能力
    云原生存储系列文章(九):云原生存储安全
    云原生存储系列文章(十):高性能计算场景的存储优化

    本节会介绍云原生存储的基本概念和常用的存储方案。

    云原生存储

    1.概念

    要理解云原生存储,我们首先要了解云原生技术的概念,CNCF 对云原生定义如下:

    云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。
    这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。

    简言之:云原生应用和传统应用并没有一个标准的划分界限,其描述的是一种技术倾向,即越符合以下特征的应用越云原生:

    • 应用容器化
    • 服务网格化
    • 声明式 API
    • 运行可弹性扩展
    • 自动化的 DevOps
    • 故障容忍和自愈
    • 平台无关,可移植的

    云原生应用是一簇应用特征能力的集合,而实现了这些能力的应用在可用性、稳定性、扩展性、性能等核心能力都会有大幅的优化。优异的能力代表了技术的方向,云原生应用正在引领各个应用领域实现云原生化,同时也在深刻改变着应用服务的方方面面。存储作为应用运行的基石,也在服务云原生化过程中提出了更多的需求。

    云原生存储的概念来源于云原生应用,顾名思义:一个应用为了满足云原生特性的要求,其对存储所要求的特性是云原生存储的特性,而满足这些特性的存储方案,可以称其为倾向云原生的存储。

    2.云原生存储特征

    1)可用性

    存储系统的可用性定义了在系统故障情况下访问数据的能力,故障可以是由存储介质、传输、控制器或系统中的其他组件造成的。可用性定义系统故障时如何继续访问数据,以及在部分节点不可用时如何将对数据的访问重新路由到其他的可访问节点。

    可用性定义了故障的恢复时间目标(RTO),即故障发生与服务恢复之间的时长。可用性通常计算为应用运行时间中的可用时间的百分比(例如 99.9%),以及以时间单位度量的 MTTF(平均故障时间)或 MTTR(平均修复时间)来度量。

    2)可扩展性

    存储的可扩展性主要衡量以下参数指标:

    • 扩展可以访问存储系统的客户端数量的能力,例如:一个 NAS 存储卷同时支持多少客户端挂载使用;
    • 扩展单个接口的吞吐量和 IO 性能;
    • 扩展存储服务单实例的容量能力,例如:云盘的扩容能力。

    3)性能

    衡量存储的性能通常有两个标准:

    • 每秒支持的最大存储操作数 - IOPS;
    • 每秒支持的最大存储读写量 - 吞吐量;

    云原生应用在大数据分析、AI 等场景得到广泛应用,在这些重吞吐 / IO 场景中对存储的需求也非常高,同时云原生应用的快速扩容、极致伸缩等特性也会考验存储服务在短时间内迎接峰值流量的能力。

    4)一致性

    存储服务的一致性是指在提交新数据或更新数据后,访问这些新数据的能力;根据数据一致性的延迟效果,可以将存储分为:“最终一致”和“强一致”存储。

    不同的服务对存储一致性的敏感度是不一样的,像数据库这类对底层数据准确性和时效性要求非常高的应用,对存储的要求是具有强一致性的能力。

    5)持久性

    多个因素应用数据的持久性:

    • 系统冗余等级;
    • 存储介质的耐久性(如:SSD 或 HDD);
    • 检测数据损坏的能力,以及使用数据保护功能重建或恢复损坏数据的能力。

    3.数据访问接口

    在云原生应用系统中,应用访问存储服务有多种方式。从访问接口类型上可以分为:数据卷方式、API 方式。

    1.png

    数据卷:将存储服务映射为块或文件系统方式共应用直接访问,使用方式类似于应用在操作系统中直接读写本地目录文件。例如:可以将块存储、文件存储挂载到本地,应用可以像访问本地文件一样对数据卷进行访问;
    API:有些存储类型并不能使用挂载数据卷的方式进行访问,而需要通过调用 API 的方式进行。例如:数据库存储、KV 存储、对象存储,都是通过 API 的方式进行数据的读写。

    需要说明的是对象存储类型,其标准使用方式是通过 Restful API 对外提供了文件的读写能力,但也可以使用用户态文件系统的方式进行存储挂载,使用方式模拟了块、文件存储数据卷挂载的方式。

    下面表格列举了各种存储接口的优缺点:

    2.jpg

    4.云原生存储分层

    3.png

    1)编排和操作系统层

    这一层定义了存储数据的对外访问接口,即应用访问数据时存储所表现的形式。同上节所述,可以分为数据卷方式和 API 访问方式。这一层是容器服务存储编排团队关注的重点,云原生存储对敏捷性、可操作性、扩展性等方面的需求都在这一层集成、实现。

    2)存储拓扑层

    这一层定义了存储系统的拓扑结构和架构设计,定义了系统不同部分是如何相互关联和连接的(如存储设备、计算节点和数据)。拓扑结构在构建时影响存储系统的许多属性,因此必须加以考虑。

    存储拓扑可以是集中式的、分布式的、或超融合的。

    3)数据保护层

    定义如何通过冗余的方式对数据进行保护。在存储系统出现故障时,如何通过数据冗余对数据进行保护、恢复非常重要。通常有以下几种数据保护方案:

    • RAID(独立磁盘冗余阵列):用于在多个磁盘之间的分发数据技术,同时考虑到冗余;
    • 擦除编码:数据被分成多个片段,这些片段被编码,并与多个冗余集合一起存储,保证数据可恢复;
    • 副本:将数据分布在多个服务器上,实现数据集的多个完整副本。

    4)数据服务

    数据服务补充了核心存储功能以外的存储能力,例如可以提供存储快照、数据恢复、数据加密等服务。
    数据服务所提供的补充能力也正是云原生存储所需要的,云原生存储正是通过集成丰富数据服务来实现其敏捷、稳定、可扩展等能力。

    5)物理层

    这一层定义了存储数据的实际物理硬件。物理硬件的选择影响系统的整体性能和存储数据的持续性。

    5.存储编排

    云原生意味着容器化,而容器服务场景中通常需要某种管理系统或者应用编排系统。这些编排系统与存储系统的交互可以实现工作负载与存储数据的关联。

    4.png

    如上图所示:

    • 负载:表示应用实例,会消费底层存储资源;
    • 编排系统:类似于 K8s 一样的容器编排系统,负责应用的管理和调度;
    • 控制平面接口:指编排系统调度、运维底层存储资源的标准接口,例如 K8s 里面的 Flexvolume,已经容器存储通用的 CSI 接口;
    • 工具集:指控制平面接口运维存储资源时所依赖的三方工具、框架;
    • 存储系统:分为控制平台数据数据平面。控制台平面对外暴露接口,提供存储资源的接入、接出能力。数据平面提供数据存储服务。

    当应用负载定义了存储资源需求时,编排系统会为应用负载去准备这些存储资源。编排系统通过调用控制平面接口,进而实现对存储系统控制平面的调用,这样就实现了应用负载对存储服务的接入、接出操作。当实现了存储系统接入后,应用负载可以直接访问存储系统的数据平面,即可以直接访问数据。

    常见的云原生存储方案

    1.公有云存储

    每个公有云服务提供商都会提供各种云资源,其中也包含了各种云存储服务。以阿里云为例,其几乎提供了能够满足所有业务需要的存储类型,包括:对象存储、块存储、文件存储、数据库等等。公有云存储的优势是规模效应,足够大的体量实现了巨大研发、运维投入的同时,提供低廉的价格优势。而且公有云存储在稳定性、性能、扩展性方面都能轻松满足您的业务需求。

    随着云原生技术的发展,各个公有云厂商都开始对其云服务进行云原生化改造或适配,提供更加敏捷、高效的服务来适应云原生应用的需求。阿里云存储服务也在云原生应用适配做了很多优化,阿里云容器服务团队实现的 CSI 存储驱动无缝的衔接了云原生应用和存储服务之间的数据接口。实现了用户使用存储资源时对底层存储无感知,而专注于自己的业务开发。

    5.png

    优点如下所示:

    • 高可靠性:多数云厂商都可以提供服务稳定性、数据可考虑下都非常优异的服务,例如:阿里云ebs提供了9个9的可靠性服务,为您的数据安全提供了强有力的基础保障能力;
    • 高性能:公有云对不同的服务提供了不同等级的存储性能适配,几乎可以满足所有应用类型对存储性能的需求。阿里云 EBS 可以提供百万级别的 IOPS 能力,接近本地盘的访问性能。NAS 服务最大提供每秒数十 G 的吞吐能力,在数据共享的应用场景满足您的高性能需求。而 CPFS 高性能并发文件系统最高可以提供近 TB 级别的吞吐能力,更是可以满足一些极端高性能计算对存储的需求;
    • 扩展性好:公有云存储服务一般都提供了容量扩容能力,让您在应用对存储的需求增加的时候可以动态的实现容量伸缩,且实现应用的无感知;
    • 安全性高:不同的云存储服务都提供了数据安全的保护机制,通过 KMS、AES 等加密技术实现数据的加密存储,同时也实现了客户端到服务的链路加密方案,让数据传输过程中也得到加密保护;
    • 成熟的云原生存储接口:提供了兼容所有存储类型的云原生存储接口,让您的应用无缝的接入不同存储服务。阿里云容器服务提供的 CSI 接口驱动已经支持了:云盘、OSS、NAS、本地盘、内存、LVM等多种存储类型,可以让应用无感知的访问任何的存储服务类型;
    • 免运维:相对于自建存储服务来说,公有云存储方案省去了运维的难度

    缺点如下所示:

    • 定制化能力差:由于公有云存储方案需要服务所有用户场景,其能力主要集中在一些通用需求,而对某些用户个性化需求很难满足。

    2.商业化云存储

    在很多私有云环境中,业务方为了实现数据的高可靠性通常会购买商业化的存储服务。这种方案为用户提供了高可用、高效、便捷的存储服务,且运维服务、后期保障等也都有保证。私有云存储提供商也意识到云原生应用的普及,也会为用户提供完善的、成熟的云原生存储接口实现方案。

    优点如下所示:

    • 安全性好:私有云部署,可以从物理上实现数据的安全隔离;
    • 高可靠、高性能:很多云存储提供商都是在存储技术上深耕多年,具有优异的技术能力和运维能力,其商业化存储服务可以满足多数应用的性能、可靠性的需求;
    • 云原生存储接口:从多家存储服务提供商开源的项目可以看出,其对云原生应用的支持已经实现或者展开。

    缺点如下所示:

    • :商业化的存储服务加个多数都很昂贵;
    • 云原生存储接口兼容性:商业化的云原生存储接口都是针对其一家的存储类型。多数用户会使用不同的存储类型,而使用了不同家的存储服务,很难实现统一的存储接入能力。

    3.自建存储服务

    对于一些 SLA 要是不是很高的业务数据,很多公司都会选择使用自建的方式提供存储服务。业务方需要通过当前的开源的存储方案,并结合自建的业务需求进行方案选择。

    • 文件存储:考虑 CephFS、GlusterFS、NFS 等方案。其中 CephFS,GlusterFS 在技术的成熟度上还需要进一步验证,且在高可靠、高性能场景上也存在不足。而 NFS 虽然已经成熟,但是自建集群在性能上很难达到高性能应用的需求。
    • 块存储:例如 RBD、SAN 等是常见的块存储方案,技术也相对比较成熟,已经有较多的公司将其应用在自己的业务上。但其复杂度也相对很高,需要有专业的团队来运维支持。

    优点如下所示:

    • 业务匹配度高、灵活性好:可以在众多开源方案中选择最适合自己业务的方案,且可以在原生代码的基础上进行二次开发来优化业务场景;
    • 安全性好:如果搭建在公司内部使用,则具有物理隔离的安全性;
    • 云原生存储接口:常用的开源存储方案都可以在社区找到云原生存储接口的实现,且可以在其基础上进行开发、优化。

    缺点如下所示:

    • 性能欠佳:多数开源的存储方案其原生的性能表现并不是很好。当然您可以通过架构设计、物理硬件升级、二次开发等方案进行优化;
    • 可靠性差:开源存储方案在可靠性方面无法和商业化的存储比较,所以更多场景是应用在 SLA 低的数据存储场景;
    • 云原生存储插件鱼龙混杂:目前网上开源的云原生存储驱动版本众多,且质量参差不齐,有些项目存在 bug,且长期无人维护,所以使用时需要更多的甄别和调测工作;
    • 专业的团队支撑:自己搭建的服务需要自己负责,面对并不是十分成熟的开源方案,需要组建一个具有较强技术能力的专业团队来运维、开发存储系统。

    4.本地存储

    一些业务类型不需要高可用分布式存储服务,而会选择使用性能表现更优的本地存储方案。

    数据库类服务:对存储的 IO 性能、访问时延有很多的要求,一般的块存储服务并不能很好的满足这方面的需求。且其应用本身已经实现了数据的高可用设计,不再需要底层实现多副本的能力,即分布式存储的多副本设计对这类应用是一种浪费。

    存储作为缓存:部分应用期望保存一些不重要的数据,数据在程序执行完成即可以丢掉,且对存储的性能要求较高,其本质是将存储作为缓存使用。云盘的高可用能力对这样的业务并没有太大的意义,且云盘在 IO 性能、价格方面的表现(相对本地盘)也没有优势。

    所以本地盘存储在很多关键能力上要比分布式块存储弱很多,但在特定场景下仍然有其使用的优势。阿里云存储服务提供了基于 NVMe 的本地盘存储方案,以更好的性能表现和更低的价格优势,在特定的应用场景得到了用户的青睐。

    6.png

    阿里云 CSI 驱动供了云原生应用使用本地存储的接入实现,支持:lvm 卷、本地盘裸设备、本地目录映射等多种接入形式,实现数据的高性能访问、quota、iops 配置等众多适配能力。

    优点如下所示:

    • 性能高:提供相对分布式存储更优的 IOPS、吞吐能力;
    • 低价:通过物理裸设备直接提供本地盘,在价格上相对于多副本的分布式存储具有优势。

    缺点如下所示:

    • 数据可靠性差:本地盘保存的数据丢失后不能找回,需要从应用层实现数据的高可用设计;
    • 灵活性差:不能像云盘一样实现数据迁移到其他节点使用。

    5.开源容器存储

    随着云原生技术的发展,社区提供了一些开源的云原生存储方案。

    1)Rook

    Rook 作为第一个 CNCF 存储项目,是一个集成了 Ceph、Minio 等分布式存储系统的云原生存储方案,意图实现一键式部署、管理方案,且和容器服务生态深度融合,提供适配云原生应用的各种能力。从实现上,可以认为 Rook 是一个提供了 Ceph 集群管理能力的 Operator。其使用 CRD 方式来对 Ceph、Minio 等存储资源进行部署和管理。

    7.png

    Rook 组件:

    • Operator:实现自动启动存储集群,并监控存储守护进程,并确保存储集群的健康;
    • Agent:在每个存储节点上运行,并部署一个 CSI / FlexVolume 插件,和 Kubernetes 的存储卷控制框架进行集成。Agent 处理所有的存储操作,例如挂载存储设备、加载存储卷以及格式化文件系统等;
    • Discovers:检测挂接到存储节点上的存储设备。

    Rook 将 Ceph 存储服务作为 Kubernetes 的一个服务进行部署,MON、OSD、MGR 守护进程会以 pod 的形式在 Kubernetes 进行部署,而 rook 核心组件对 ceph 集群进行运维管理操作。

    Rook 通过 ceph 可以对外提供完备的存储能力,支持对象、块、文件存储服务,让你通过一套系统实现对多种存储服务的需求。同时 rook 默认部署云原生存储接口的实现,通过 CSI / Flexvolume 驱动将应用服务与底层存储进行衔接,其设计之初即为 Kubernetes 生态所服务,对容器化应用的适配非常友好。

    Rook 官方文档参考:https://rook.io/

    2)OpenEBS

    OpenEBS 是一种模拟了 AWS 的 EBS、阿里云的云盘等块存储实现的开源版本。OpenEBS 是一种基于 CAS 理念的容器解决方案,其核心理念是存储和应用一样采用微服务架构,并通过 Kubernetes 来做资源编排。其架构实现上,每个卷的 Controller 都是一个单独的 Pod,且与应用 Pod 在同一个 Node,卷的数据使用多个 Pod 进行管理。

    8.png

    架构上可以分为数据平面(Data Plane)和控制平面(Control Plane)两部分:

    • 数据平面:为应用程序提供数据存储;
    • 控制平面:管理 OpenEBS 卷容器,通常会用到容器编排软件的功能;

    数据平面

    OpenEBS 持久化存储卷通过 Kubernetes 的 PV 来创建,使用 iSCSI 来实现,数据保存在 node 节点上或者云存储中。OpenEBS 的卷完全独立于用户的应用的生命周期来管理,和 Kuberentes 中 PV 的思路一致。
    OpenEBS 卷为容器提供持久化存储,具有针对系统故障的弹性,更快地访问存储,快照和备份功能。同时还提供了监控使用情况和执行 QoS 策略的机制。

    控制平面

    OpenEBS 控制平面 maya 实现了创建超融合的 OpenEBS,并将其挂载到如 Kubernetes 调度引擎上,用来扩展特定的容器编排系统提供的存储功能;
    OpenEBS 的控制平面也是基于微服务的,通过不同的组件实现存储管理功能、监控、容器编排插件等功能。

    更多关于 OpenEBS 的介绍可以参考:https://openebs.io/

    3)Heketi

    类似于 Rook 是 Ceph 开源存储系统在云原生编排平台(Kubernetes)的一个落地方案,Glusterfs 同样也有一个云原生实践方案。Heketi 提供了一个 Restful 管理接口,可用于管理 Gluster 存储卷的生命周期。使用 Heketi,Kubernetes 可以动态地为 Gluster 存储卷提供任何支持的持久性类型。Heketi 将自动确定集群中 brick 的位置,确保在不同的故障域中放置 brick 及其副本。Heketi 还支持任意数量的 Gluster 存储集群,为云服务提供网络文件存储。

    使用 Heketi,管理员不再管理或配置块、磁盘或存储池。Heketi 服务将为系统管理所有硬件,使其能够按需分配存储。任何在 Heketi 注册的物理存储必须以裸设备方式提供,然后 Heketi 在提供的磁盘上使用 LVM 进行管理。

    9.png

    更多详解参考:https://github.com/heketi/heketi)

    6. 优势

    • 上述几种云原生存储方案其设计之初既充分考虑了存储与云原生编排系统的融合,具有很好的容器数据卷接入能力;
    • 在 Quota 配置、QoS 限速、ACL 控制、快照、备份等方面有较好的云原生集成实现,云原生应用使用存储资源时更加灵活、便利;
    • 开源方案,社区较为活跃,网络资源、使用方案丰富,让您更容易入手。

    7. 劣势

    • 成熟度较低,目前上述方案多在公司内部测试环境或者 SLA 较低的应用中使用,很少存储关键应用数据;
    • 性能差:和公有云存储、商业化存储相比,上述云原生存储方案在 IO 性能、吞吐、时延等方面都表现欠佳,很难应用在高性能服务场景;
    • 后期维护成本高:虽然上面方案部署、入门都很简单,但一旦运行中出现问题解决起来非常棘手。上述项目属于初期阶段,并不具备生产级别的服务能力,如果使用此方案需要有强有力的技术团结加以保障。

    现状和挑战

    1.敏捷化需求

    云原生应用场景对服务的敏捷度、灵活性要求非常高,很多场景期望容器的快速启动、灵活的调度,这样即需要存储卷也能敏捷的根据 Pod 的变化而调整。

    需求表现在:

    • 云盘挂载、卸载效率提高:可以灵活的将块设备在不同节点进行快速的挂载切换;
    • 存储设备问题自愈能力增强:提供存储服务的问题自动修复能力,减少人为干预;
    • 提供更加灵活的卷大小配置能力。

    2.监控能力需求

    多数存储服务在底层文件系统级别已经提供了监控能力,然后从云原生数据卷角度的监控能力仍需要加强,目前提供的PV监控数据维度较少、监控力度较低;

    具体需求:

    提供更细力度(目录)的监控能力;
    提供更多维度的监控指标:读写时延、读写频率、IO 分布等指标;

    3.性能要求

    在大数据计算场景同时大量应用访问存储的需求很高,这样对存储服务带来的性能需求成为应用运行效率的关键瓶颈。

    具体需求:

    • 底层存储服务提供更加优异的存储性能服务,优化 CPFS、GPFS 等高性能存储服务满足业务需求;
    • 容器编排层面:优化存储调度能力,实现存储就近访问、数据分散存储等方式降低单个存储卷的访问压力。

    4.共享存储的隔离性

    共享存储提供了多个 Pod 共享数据的能力,方便了不同应用对数据的统一管理、访问,但在多租的场景中,不同租户对存储的隔离性需求成为一个需要解决的问题。

    底层存储提供目录间的强隔离能力,让共享文件系统的不同租户之间实现文件系统级别的隔离效果。
    容器编排层实现基于名词空间、PSP 策略的编排隔离能力,保证不同租户从应用部署侧即无法访问其他租户的存储卷服务。

     

    - 赠书福利 -

     

    图片1.jpg

    6 月 12 日 17:00 前在“阿里巴巴云原生”公众号留言区欢迎大家讨论交流云原生存储新的机遇与挑战,精选留言点赞第 1 名即可免费获得此书!

    课程推荐

    为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。

    点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless

    阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

    原文链接
    本文为云栖社区原创内容,未经允许不得转载。

    展开全文
  • 云原生是面向云应用设计的一种思想理念,能够充分发挥云效能的最佳实践路径;帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度;代表技术包括不可变基础设施、服务网格、声明式API...
  • 云原生架构概述

    2021-02-24 08:05:11
    CNCF给出了云原生应用的三大特征:容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。...
  • 今天和大家一起聊一聊云原生这个话题,内容来自蚂蚁金服中间件服务与容器团队。由于内容比较多,我们分为上下两个半场。前言特别指出:这次分享主要是希望起到抛砖引玉的作用,让大家更多的参与到云原生这个话题的...
  • 摘要:在近日于上海召开的第六届Gopher China大会上,华为云微服务首席架构师田晓亮分享了《华为云的Go语言云原生实战经验》,讲述如何构建韧性、高可靠、安全的云原生应用系统,并孵化云原生应用开发框架Go chassis...
  • 云原生应用中的网络流量管理.pptx
  • 云原生应用中的网络流量管理.pdf
  • 上一篇文章中我们介绍过CNCF 给出的云原生定义中包括微服务、容器、服务网格、不可变基础设施和声明式 API 等代表技术,构建云原生应用就主要靠这些关键技术。下面我们就来具体介绍下这 5 个关键技术。 1. 微服务 ...
  • Polyaxon欢迎使用Polyaxon,它是一个用于构建,培训和监视大规模深度学习应用程序的平台。 Polyaxon可以部署到任何数据中心,提供商中,也可以由Polyaxon托管和管理,以及重现,自动化,扩展数据科学。 欢迎使用...
  • 云原生应用的12要素

    万次阅读 2018-03-12 21:33:40
    在云的时代,应用会更多的迁移到云端,基于云的架构设计和开发模式需要一套全新的理念去承载,于是云原生思想应运而生,而针对云原生应用开发的最佳实践原则,12-Factor脱颖而出,同时也带来了新的解读。 12-Factor...
  • 云原生技术作为企业数字业务应用创新的原动力, 不仅被引入到云原生应用全生命周期管理中,而且被推到了生产环境。云原生技术为企业带来快速交付与迭代数字业务应用的优势之外, 同时也带来了新的安全要求与挑战。
  • 云原生应用数据安全挑战,云原生数据安全保护策略模型,腾讯云原生数据安全中台解决方案,云原生密码应用与数据安全保护最佳实践
  • 云原生架构及其应用

    千次阅读 2020-12-19 00:04:28
    系统以Spring Cloud微服务框架开发。...平台保障服务以Eureka为中心,由API网关、服务注册中心、监控平台等构成,实现基础服务框架;业务服务划分为多个微服务,基于Docker容器,协同工作实现具体业务功能。
  • 云原生下,所有非容器化的应用系统都要思考,是继续将就还是讲究。个人感觉云原生下,很多很多的技术标准及规约将重新被定义,重新定义会将分布式应用各个环节重新标准化,对依赖做到更透明,低侵入甚至是无侵入。 ...
  • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台
  • [云原生]~云原生简介

    2019-12-08 21:10:28
    云原生的主要特征 进一年我们都在使用云原生框架 SpringCloud微服务开发项目,敏捷快速 部署在容器中,解决部署环境差异 使用DevOps自动部署,减少运维压力 微服务 业务功能单一但完整 只对外提供必要的...
  • 2018 年,我们团队依托 K8s 体系开始推进“轻量级容器化”,同时投入了工程力量跟开源社区一起解决了诸多规模与性能问题,从而逐步将过去“类虚拟机”的运维链路和阿里巴巴整体应用基础设施架构升级到了云原生技术栈...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,725
精华内容 23,090
热门标签
关键字:

云原生应用管理平台